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

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

首先我们说一下移动:

移动的本质就是在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);
    }

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当然可以使用Unity编写一个移动的CharacterController。下面是一个基本的示例代码,可在Unity创建一个名为"Player"的GameObject,然后将以下代码添加到该对象的脚本组件,即可实现角色的移动: ``` using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed = 5.0f; // 移动速度 private CharacterController controller; // CharacterController组件 private Vector3 moveDirection = Vector3.zero; // 移动方向 void Start() { controller = GetComponent<CharacterController>(); // 获取CharacterController组件 } void Update() { float horizontal = Input.GetAxis("Horizontal"); // 获取水平方向上的输入 float vertical = Input.GetAxis("Vertical"); // 获取垂直方向上的输入 // 计算移动方向 moveDirection = new Vector3(horizontal, 0.0f, vertical); moveDirection = transform.TransformDirection(moveDirection); moveDirection *= moveSpeed; // 将移动方向应用到CharacterController组件上 controller.Move(moveDirection * Time.deltaTime); } } ``` 这个示例代码,我们定义了一个名为“PlayerController”的脚本,该脚本会在每一帧获取玩家的输入,然后根据输入计算出移动方向,并将移动方向应用到CharacterController组件上。注意,这里我们使用了Time.deltaTime来控制移动速度,这样可以保证在不同的帧率下,角色的移动速度保持一致。 ### 回答2: Unity是一款强大的游戏开发引擎,可以用来创建各种不同类型的游戏。编写一个移动的character controller可以让玩家在游戏控制角色的移动。 在Unity,编写一个character controller需要以下几个步骤: 1. 创建一个新的GameObject并将其重命名为"Player",用来表示角色。将该GameObject添加一个Capsule Collider组件,以便其他物体与角色互动碰撞。 2. 添加一个Rigidbody组件,以便在角色移动时受到物理引擎影响。确保将Rigidbody的"Use Gravity"选项禁用,这样角色就不会受到重力影响。 3. 创建一个C#脚本,并将其附加到Player对象上。在脚本,声明一个变量来控制角色的移动速度,例如"moveSpeed"。 4. 在脚本,使用Input.GetAxis()函数来获取玩家的输入,例如水平和垂直轴的输入。将输入乘以移动速度,得到角色在每个方向上的移动速度。 5. 使用Rigidbody组件的velocity属性来将计算得到的移动速度应用到角色上。通过调用Rigidbody的MovePosition()函数并传递角色的新位置,使角色移动。 6. 为了让角色在空能跳跃,你可以添加一个额外的检测机制,检测角色是否与地面接触。当玩家按下跳跃键时,在脚本添加一个适当的力量到角色的Y轴速度上。 7. 如果你还想要角色的旋转,你可以使用Input.GetAxis()函数来获取玩家的转向输入,并将其应用到角色上的Rigidbody组件的rotation属性上。 通过以上步骤,你就可以使用Unity编写一个简单的移动的character controller了。当你在游戏场景运行游戏并玩家点击键盘上的WASD键时,角色就可以在场景移动了。 ### 回答3: 使用Unity写一个移动的Character Controller可以通过以下步骤完成: 1. 创建一个新的Unity项目并导入所需的资源(例如角色模型、动画等)。 2. 创建一个空的Game Object作为角色控制器,并将其添加到场景。 3. 添加一个Rigidbody组件到角色控制器上,用于处理物理运动。 4. 添加一个Capsule Collider组件到角色控制器上,以便处理碰撞。 5. 创建脚本文件并将其附加到角色控制器上。 6. 在脚本,定义角色的移动速度、旋转速度等变量,并使用Input.GetAxis函数获取玩家输入。 7. 在Update函数,根据玩家输入控制角色的移动旋转。 8. 使用Rigidbody的AddForce函数将力应用于角色控制器,以使其移动。 9. 在角色控制器的脚本,可以添加额外的功能,例如跳跃、攻击等。 10. 测试和调试角色控制器,确保角色能够按照预期移动旋转。 11. 可以根据需要添加更多功能,例如动画、摄像机跟随等。 通过以上步骤,你可以使用Unity编写一个移动的Character Controller,并通过脚本控制角色的移动旋转

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值