Unity射线检测(脚本)

知识点: 

1.虚拟轴

2.射线创建与检测

3.根据鼠标屏幕坐标返回射线,射线的起点在摄像机视口,射线方向摄像机朝向鼠标方向
  

题目: 

创建6个cube;鼠标选中cube,就让该cube旋转一个随机的角度,并朝正前方移动;
cube被二次点击,就被移除;

public class ScreenRay : MonoBehaviour
{
    List<Transform> dic = new List<Transform>();//用来存储点击过的对象
    // Use this for initialization
    void Start()
    {

    }
    // Update is called once per frame
    void Update()
    {
        //鼠标左键点击
        if (Input.GetButtonDown("Fire1"))
        {
            this.ScrRay();
                  
        }

        //移动点击过的对象(List<>)
        for (int i = 0; i < dic.Count; i++)
        {
            Move(dic[i]);
        }       
    }
   
    private void ScrRay()
    {
        //创建摄像机到鼠标位置的射线检测
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        Debug.DrawLine(ray.origin,ray.direction+ray.origin,Color.red);
        //存储碰撞成功返回的信息:相交点,距离,返回碰撞Transform,Collider,Rigidbody
        RaycastHit info;
        //射线检测:判断在ray射线方向中是否跟碰撞器发生相交,结束碰撞检测,返回true,同时把碰撞信息存到info里面,否则返回false
        if (Physics.Raycast(ray, out info))
        {
            //点击对象 如果发现物体存在List<>就销毁它(即二次点击才会触发)            
            for (int i=0;i<dic.Count;i++) {
                if (dic[i].transform.name == info.transform.name) {
                    dic.Remove(dic[i]);
                    Destroy(info.transform.gameObject);
                    return;                    
                }
            }
            //该物体没有就添加到List<>中,并将它的角度随机旋转
            dic.Add(info.transform);
            info.transform.Rotate(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));

        }

    }
    //向自己的正前方移动
    private void Move(Transform info)
    {        
            info.transform.Translate(info.transform.forward * 2 * Time.deltaTime, Space.World);              
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42485607/article/details/81740422