纳金网

标题: 【脚本资源】红外瞄准器(转载) [打印本页]

作者: 查穆1    时间: 2013-4-23 15:05
标题: 【脚本资源】红外瞄准器(转载)
本帖最后由 艾西格亚 于 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)


作者: may    时间: 2013-4-23 16:26
先收藏下来了,学习
作者: setvet    时间: 2013-4-23 23:16
不错的东西,试试看
作者: moj    时间: 2013-4-30 05:19
wow
thank very very ...
作者: 狂风大尉    时间: 2013-4-30 11:57
不错的分享,学习了
作者: likunhan    时间: 2013-4-30 12:21
学习了。感谢楼主的慷慨分享!
作者: Xn10710203    时间: 2013-7-5 17:19
感觉不错啊,谢谢楼主的分享
作者: Fre3Dom    时间: 2013-7-5 21:11

先收藏下来了,学习
作者: rookielee    时间: 2013-8-27 15:05
非常感谢




欢迎光临 纳金网 (http://wwww.narkii.com/club/) Powered by Discuz! X2.5