当前位置:   article > 正文

unity中旋转和移动的几个方法_unity moverotation

unity moverotation

在游戏中我们通常要控制玩家的移动和旋转

首先我们说一下移动:

移动的本质就是在Update()或LateUpdate()中不断修改物体的position来实现移动,移动的方法有4中:

(1):transform.Translate()第一种方法与直接修改transform.position是一样的,缺点就是在有碰撞器组件的物体上时它会穿体而过

(2):Rigidbody.MovePosition()第二种用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。对于运动学刚体,它基于刚体的运动应用摩擦力。这个让你模拟刚体位于移动平台之上的情况

(3):CharacterController.Move()模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

(4):Rigidbody.AddForce()但这种方法力的大小需要直接不断的调整。

旋转相对于物体的移动就没有那么多的方法了

(1):transform.Rotation()当然这个方法也是通过修改物体的rotation来实现

(2):Rigidbody.MoveRotation()对于运动学刚体,它基于刚体的运动应用摩擦力。这个让你模拟刚体位于移动平台之上的情况

下面我只是展示了用Rigidbody.MovePosition()与Rigidbody.MoveRotation()来实现

一、我从别人的代码中找到的例子:

    private int Speed = 2;

    void Update () {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        rigBody.MovePosition(this.transform.position+new Vector3(h,0,v)*Speed*Time.deltaTime);
        if(Input.GetAxis("Horizontal")!=0|| Input.GetAxis("Vertical")!=0)
         {
            Rotating(h,v);
         }
      }
      void Rotating(float horizontal, float vertical)
    {
        // 创建角色目标方向的向量
        Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);
        // 创建目标旋转值 并假设Y轴正方向为"上"方向
        Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up); //函数参数解释: LookRotation(目标方向为"前方向", 定义声明"上方向")
        // 创建新旋转值 并根据转向速度平滑转至目标旋转值
        //函数参数解释: Lerp(角色刚体当前旋转值, 目标旋转值, 根据旋转速度平滑转向)
        Quaternion newRotation = Quaternion.Lerp(rigBody.rotation, targetRotation, Speed * Time.deltaTime);
        // 更新刚体旋转值为 新旋转值
        rigBody.MoveRotation(newRotation);
    }

二、我自己写的代码找的例子:

//控制人物随着键盘输入移动

         h = Input.GetAxis("Horizontal");
         v = Input.GetAxis("Vertical");
        rb.MovePosition(transform.position + new Vector3(h, 0, v) * speed * Time.deltaTime);

 //控制旋转的方式

方法1、
        //用鼠标的上下左右来控制unity中某个物体的左右、上下旋转;
        //控制公交车的旋转
        //用鼠标的上下左右来控制unity中某个物体的左右拖拽旋转;
        /*
        Vector3 fwd = cam.transform.forward;
        fwd.Normalize();
        if (Input.GetMouseButton(0))
        {
            Vector3 vaxis = Vector3.Cross(fwd, Vector3.right);
            transform.Rotate(vaxis, -Input.GetAxis("Mouse X"), Space.World);
            Vector3 haxis = Vector3.Cross(fwd, Vector3.up);
            transform.Rotate(haxis, -Input.GetAxis("Mouse Y"), Space.World);
        }*/

    }

方法2、
    //控制旋转
    void Rotating(float hor, float ver)
    {
        //获取方向
        Vector3 dir = new Vector3(hor, 0, ver);
        //将方向转换为四元数
        Quaternion quaDir = Quaternion.LookRotation(dir, Vector3.up);
        //缓慢转动到目标点
        transform.rotation = Quaternion.Lerp(transform.rotation, quaDir, Time.deltaTime * speed);
    }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/213841?site
推荐阅读
相关标签
  

闽ICP备14008679号