知识点:
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);
}
}