unity3D拾取物体

unity3D拾取物体

今天虚拟现实课程实验中需要用到使用物理射线来实现拾取物体的操作,借由老师的代码修改并从自己的角度理解和梳理;

没有过于深入的逻辑和方法,大家只要把每一行注释的内容理解了就好,每行注释我都根据老师加入自己的一些理解来表达。其中包含了几个自己对于射线方面的方法理解和学习。
下面展示一些 内联代码片

public class shiqu : MonoBehaviour {
    public float smooth = 3f;//拾取移动的速度参数
    Transform currentObject;//射线实现的需要拾取的物体
    Vector3 mouse3DPosition;//鼠标光标的位置(射线的一个重要参数)
    public GameObject terrian;//为避免拾取中点击地板而造成混乱(这里只有一个地板
    //所以单独设置了物体,如果不想拾取的物体较多建议使用tag标签来识别)
	// Use this for initialization
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButton(0))
        {
            Ray rays = Camera.main.ScreenPointToRay(Input.mousePosition);//从鼠标光标为起点创建一个射出的射线
            Debug.DrawRay(rays.origin, rays.direction , Color.blue,1);//这个方法我们如果不加最后一个参数的话是没有任何视觉效果的,
            //因为第四个参数(duration)是画出拾取物体和摄像机机位的距离射线的持续时间,如果不加的话默认是0相当于不显示这里稍微解释一下
            RaycastHit hit;//创建变量存储射线反馈信息
            if(Physics.Raycast(rays,out hit))//这里Physics.Raycast方法返回的是bool类型,当光线与任何碰撞体相交时,
                //返回 true,否则返回 false。
            {
                currentObject = hit.transform;//将射线碰撞到的物体信息存储到currentobject
            }
            if (currentObject == null)
                return;
        }
        if (currentObject==terrian.transform)//如果是地板则跳出update,避免拾取混乱
            return;
        Vector3 mp = Input.mousePosition;//鼠标光标在屏幕坐标系的位置信息传递给向量mp
        mp.z = 6;//将屏幕坐标系z轴调整为世界坐标系的6距离的深度
        mouse3DPosition = Camera.main.ScreenToWorldPoint(mp);//将屏幕坐标转化为世界坐标
        if (currentObject != null)//这里加一个判断是为了避免没有点击物体时currentObject为空导致的对象未实例化的小错误
        {
            currentObject.position = Vector3.Lerp(currentObject.position, mouse3DPosition, smooth * Time.deltaTime*10);
            //lerp方法很容易理解,三个参数前两个参数分别是起点和终点第三个参数是移动的速度
            //(调节这个参数来调整移动的速度), 整个方法功能是将物体从原有位置移动到刚刚我们鼠标光标调整的坐标上
            if (Input.GetMouseButtonUp(0))
                currentObject = null;
        }
    }
}

lerp()方法很容易理解,三个参数前两个参数分别是起点和终点第三个参数是移动的速度(调节这个参数来调整移动的速度),整个方法功能是将物体从原有位置移动到刚刚我们鼠标光标调整的坐标上。这是整段代码里实现功能最直观的一句。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值