红外瞄准器

69 篇文章 1 订阅
红外瞄准器  

最近在研究unity自带的demo  AngryBots ”,把里面的红外瞄准分离出来做了个小 demo  
 
其中主要用到了两个知识点, RaycastHit LineRenderer 。从枪口处发射射线,然后根据射线的起点和碰撞点设置 LineRenderer 的起点和碰撞点设置那条线来模拟红外线瞄准。  
 
1 hitInfo = new RaycastHit();  
   Physics.Raycast(tr.position,tr.forward,out hitInfo);  
  返回射线的碰撞信息  
2、 function SetPosition(int indexVector3 position)  
  设置线的位置,这里只要控制两个点就可以了,起点index0,终点1.  
以上两个知识点不做详细介绍,想详细了解的可以去查文档  
 

 


下面还是以脚本加注释的方法介绍  
pointerCtrl .cs  



复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using  UnityEngine;
using  System.Collections;
//转载请说明出处
public  class  pointerCtrl : MonoBehaviour
{
     public  float  scrollSpeed = 0.5f;
     public  float  pulseSpeed = 1.5f;
     public  float  noiseSize = 1.0f;
     public  float  maxWidth = 0.5f;
     public  float  minWidth = 0.5f;
     private  float  aniTime = 0.0f;
     private  float  aniDir = 1.0f;
     private  LineRenderer lRenderer;
     public  GameObject pointer =  null ;   //小红点
     private  PreFrameRaycast raycast;    //光线投射
         
     void  Start ()
     {
         lRenderer = gameObject.GetComponent ( typeof (LineRenderer))  as  LineRenderer;
         raycast = gameObject.GetComponent ( typeof (PreFrameRaycast))  as   PreFrameRaycast // Update is called once per frame
     }
     void  Update ()
     {
         //光线看起来有动感
         renderer.material.mainTextureOffset +=  new  Vector2 (Time.deltaTime * aniDir * scrollSpeed, 0);
         //设置纹理偏移量
         renderer.material.SetTextureOffset ( "_NoiseTex" new  Vector2 (-Time.time * aniDir * scrollSpeed, 0.0f));
                 
         float  aniFactor = Mathf.PingPong (Time.time * pulseSpeed, 1.0f);
         aniFactor = Mathf.Max (minWidth, aniFactor) * maxWidth;
         //设置光线的宽
         lRenderer.SetWidth (aniFactor, aniFactor);
         //光线的起点,枪口的地方
         lRenderer.SetPosition(0, this .gameObject.transform.position);
         if  (raycast ==  null ) {
             Debug.Log ( "raycast is null" );
             return ;
         }
         //获取光线的碰撞信息
         RaycastHit hitInfo = raycast.GetHitInfo ();
         //光线碰撞到物体
         if  (hitInfo.transform) {
             //光线的终点,即光线的碰撞点
             lRenderer.SetPosition (1, hitInfo.point);
             renderer.material.mainTextureScale =  new  Vector2 (0.1f * (hitInfo.distance), renderer.material.mainTextureScale.y);
             renderer.material.SetTextureScale ( "_NoiseTex" new  Vector2 (0.1f * hitInfo.distance * noiseSize, noiseSize));
                     
             if  (pointer) {
                 pointer.renderer.enabled =  true ;
                 pointer.transform.position = hitInfo.point + (transform.position - hitInfo.point) * 0.01f;
                 pointer.transform.rotation = Quaternion.LookRotation (hitInfo.normal, transform.up);
                 pointer.transform.eulerAngles =  new  Vector3 (90, pointer.transform.eulerAngles.y, pointer.transform.eulerAngles.z);
             }     
         else  {     //光线没有碰撞到物体
             if  (pointer) {
                 pointer.renderer.enabled =  false ;
             }
             //光线的最大长度
             float  maxDist = 200.0f;
             //当光线没有碰撞到物体,终点就是枪口前方最大距离处
             lRenderer.SetPosition (1, ( this .transform.forward * maxDist));
             renderer.material.mainTextureScale =  new  Vector2 (0.1f * maxDist, renderer.material.mainTextureScale.y);
             renderer.material.SetTextureScale ( "_NoiseTex" new  Vector2 (0.1f * maxDist * noiseSize, noiseSize));
                     
         }
     }
}



PreFrameRaycast.cs   //这个脚本的主要用处就是每帧发射射线,并获取碰撞信 
息 


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using  UnityEngine;
using  System.Collections;
//转载请说明出处
     
public  class  PreFrameRaycast : MonoBehaviour {
     private  RaycastHit hitInfo;
     private  Transform  tr;
     // Use this for initialization
     void  Start () {
            
     }
            
     void  Awake(){
         tr =  this .transform;
     }
            
     // Update is called once per frame
     void  Update () {
         hitInfo =  new  RaycastHit();
         Physics.Raycast(tr.position,tr.forward, out  hitInfo);
         Debug.DrawRay(tr.position,tr.forward,Color.red);
     }
      //返回射线的碰撞信息
     public  RaycastHit GetHitInfo(){
         if (hitInfo.Equals( null )){
             Debug.LogWarning( "hitInfo is null" );
         }
         return  hitInfo;
     }
}



创建一个空物体,然后把上边的两个脚本挂上去,还需要 AngryBots里面的shader文件,给这个空物体加上Line Renderer组件,创建一个material,使用前面说道的shader文件,然后把texture拖到指定的位置,  
在创建一个片面,命名为“LaserDot”这个就是光线碰到物体后的小红点,同样需要上面的shader,同样新建一个material放在指定位置,  


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



圣典论坛上可以下载工程文件
http://game.ceeger.com/forum/read.php?tid=9876&fid=2

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值