查看: 3954|回复: 8
打印 上一主题 下一主题

[经验分享] 【脚本资源】红外瞄准器(转载)

[复制链接]

12

主题

0

听众

3738

积分

中级设计师

Rank: 5Rank: 5

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2013-4-23 15:05:32 |只看该作者 |倒序浏览
pstatus"> 本帖最后由 艾西格亚 于 2013-4-23 16:35 编辑

最近在研究unity自带的demo “AngryBots”,把里面的红外瞄准分离出来做了个小demo。

其中主要用到了两个知识点,RaycastHit和LineRenderer。从枪口处发射射线,然后根据射线的起点和碰撞点设置LineRenderer的起点和碰撞点设置那条线来模拟红外线瞄准。

1、hitInfo = new RaycastHit();
  Physics.Raycast(tr.position,tr.forward,out hitInfo);
  返回射线的碰撞信息
2、function SetPosition(int index,Vector3 position)
  设置线的位置,这里只要控制两个点就可以了,起点index为0,终点1.
以上两个知识点不做详细介绍,想详细了解的可以去查文档


下面还是以脚本加注释的方法介绍
pointerCtrl.cs
  1. using UnityEngine;
  2. using System.Collections;
  3. //转载请说明出处
  4. public class pointerCtrl : MonoBehaviour
  5. {
  6.     public float scrollSpeed = 0.5f;
  7.     public float pulseSpeed = 1.5f;
  8.     public float noiseSize = 1.0f;
  9.     public float maxWidth = 0.5f;
  10.     public float minWidth = 0.5f;
  11.     private float aniTime = 0.0f;
  12.     private float aniDir = 1.0f;
  13.     private LineRenderer lRenderer;
  14.     public GameObject pointer = null;  //小红点
  15.     private PreFrameRaycast raycast;   //光线投射
  16.       
  17.     void Start ()
  18.     {
  19.         lRenderer = gameObject.GetComponent (typeof(LineRenderer)) as LineRenderer;
  20.         raycast = gameObject.GetComponent (typeof(PreFrameRaycast)) as  PreFrameRaycast// Update is called once per frame
  21.     }
  22.     void Update ()
  23.     {
  24.         //光线看起来有动感
  25.         renderer.material.mainTextureOffset += new Vector2 (Time.deltaTime * aniDir * scrollSpeed, 0);
  26.         //设置纹理偏移量
  27.         renderer.material.SetTextureOffset ("_NoiseTex", new Vector2 (-Time.time * aniDir * scrollSpeed, 0.0f));
  28.                
  29.         float aniFactor = Mathf.PingPong (Time.time * pulseSpeed, 1.0f);
  30.         aniFactor = Mathf.Max (minWidth, aniFactor) * maxWidth;
  31.         //设置光线的宽
  32.         lRenderer.SetWidth (aniFactor, aniFactor);
  33.         //光线的起点,枪口的地方
  34.         lRenderer.SetPosition(0,this.gameObject.transform.position);
  35.         if (raycast == null) {
  36.             Debug.Log ("raycast is null");
  37.             return;
  38.         }
  39.         //获取光线的碰撞信息
  40.         RaycastHit hitInfo = raycast.GetHitInfo ();
  41.         //光线碰撞到物体
  42.         if (hitInfo.transform) {
  43.             //光线的终点,即光线的碰撞点
  44.             lRenderer.SetPosition (1, hitInfo.point);
  45.             renderer.material.mainTextureScale = new Vector2 (0.1f * (hitInfo.distance), renderer.material.mainTextureScale.y);
  46.             renderer.material.SetTextureScale ("_NoiseTex", new Vector2 (0.1f * hitInfo.distance * noiseSize, noiseSize));
  47.                   
  48.             if (pointer) {
  49.                 pointer.renderer.enabled = true;
  50.                 pointer.transform.position = hitInfo.point + (transform.position - hitInfo.point) * 0.01f;
  51.                 pointer.transform.rotation = Quaternion.LookRotation (hitInfo.normal, transform.up);
  52.                 pointer.transform.eulerAngles = new Vector3 (90, pointer.transform.eulerAngles.y, pointer.transform.eulerAngles.z);
  53.             }     
  54.         } else {    //光线没有碰撞到物体
  55.             if (pointer) {
  56.                 pointer.renderer.enabled = false;
  57.             }
  58.             //光线的最大长度
  59.             float maxDist = 200.0f;
  60.             //当光线没有碰撞到物体,终点就是枪口前方最大距离处
  61.             lRenderer.SetPosition (1, (this.transform.forward * maxDist));
  62.             renderer.material.mainTextureScale = new Vector2 (0.1f * maxDist, renderer.material.mainTextureScale.y);
  63.             renderer.material.SetTextureScale ("_NoiseTex", new Vector2 (0.1f * maxDist * noiseSize, noiseSize));
  64.                   
  65.         }
  66.     }
  67. }
复制代码
PreFrameRaycast.cs   //这个脚本的主要用处就是每帧发射射线,并获取碰撞信
  1. using UnityEngine;
  2. using System.Collections;
  3. //转载请说明出处
  4.    
  5. public class PreFrameRaycast : MonoBehaviour {
  6.     private RaycastHit hitInfo;
  7.     private Transform  tr;
  8.     // Use this for initialization
  9.     void Start () {
  10.          
  11.     }
  12.          
  13.     void Awake(){
  14.         tr = this.transform;
  15.     }
  16.          
  17.     // Update is called once per frame
  18.     void Update () {
  19.         hitInfo = new RaycastHit();
  20.         Physics.Raycast(tr.position,tr.forward,out hitInfo);
  21.         Debug.DrawRay(tr.position,tr.forward,Color.red);
  22.     }
  23.      //返回射线的碰撞信息
  24.     public RaycastHit GetHitInfo(){
  25.         if(hitInfo.Equals(null)){
  26.             Debug.LogWarning("hitInfo is null");
  27.         }
  28.         return hitInfo;
  29.     }
  30. }
复制代码
创建一个空物体,然后把上边的两个脚本挂上去,还需要AngryBots里面的shader文件,给这个空物体加上Line Renderer组件,创建一个material,使用前面说道的shader文件,然后把texture拖到指定的位置,
在创建一个片面,命名为“LaserDot”这个就是光线碰到物体后的小红点,同样需要上面的shader,同样新建一个material放在指定位置,


到此,在场景中添加一些物体,运行,如果光线碰到物体就会出现一个小红点,否则就没有,哇哈哈,想要的效果就出来了

完整文件下载 ray.rar (64.24 KB, 下载次数: 21)

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

may    

8830

主题

81

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52336
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

沙发
发表于 2013-4-23 16:26:43 |只看该作者
先收藏下来了,学习
回复

使用道具 举报

0

主题

1

听众

15

积分

设计初学者

Rank: 1

纳金币
3
精华
0
板凳
发表于 2013-4-23 23:16:44 |只看该作者
不错的东西,试试看
回复

使用道具 举报

moj    

0

主题

1

听众

27

积分

设计初学者

Rank: 1

纳金币
1
精华
0

活跃会员 灌水之王

地板
发表于 2013-4-30 05:19:00 |只看该作者
wow
thank very very ...
回复

使用道具 举报

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2013-4-30 11:57:12 |只看该作者
不错的分享,学习了
回复

使用道具 举报

1

主题

5

听众

2200

积分

中级设计师

Rank: 5Rank: 5

纳金币
7
精华
0

活跃会员

6#
发表于 2013-4-30 12:21:16 |只看该作者
学习了。感谢楼主的慷慨分享!
回复

使用道具 举报

0

主题

1

听众

25

积分

设计初学者

Rank: 1

纳金币
5
精华
0

活跃会员 灌水之王

7#
发表于 2013-7-5 17:19:21 |只看该作者
感觉不错啊,谢谢楼主的分享
回复

使用道具 举报

1

主题

1

听众

288

积分

设计实习生

Rank: 2

纳金币
-3
精华
0

最佳新人

8#
发表于 2013-7-5 21:11:15 |只看该作者

先收藏下来了,学习
回复

使用道具 举报

0

主题

1

听众

2517

积分

中级设计师

Rank: 5Rank: 5

纳金币
7
精华
0

最佳新人

9#
发表于 2013-8-27 15:05:14 |只看该作者
非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-16 01:27 , Processed in 0.716889 second(s), 34 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部