【unity2022入门第一季】整合Unity官方教程设计最佳学习路线,Unit

P122 笔记
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
// Start is called before the first frame update
//TODO:
//1.获取玩家输入,在场景中移动玩家角色游戏对象
//2.移动时,除了位置外 position ,还需要考虑转动 rotation
//3.需要将动画也考虑进去
//创建一个3D矢量,来表示玩家角色的移动
Vector3 m_Movement;
//创建变量,获取用户输入方向
float horizontal;
float vertical;
//创建一个刚体对象
Rigidbody m_Rigibody;
//创建一个Animator组件对象
Animator m_Animator;
//用四元数对象来表示3D游戏中的旋转
//初始化四元数对象
Quaternion m_Rotation = Quaternion.identity;
//设置旋转速度
public float turnSpeed = 20.0f;
void Start()
{
//在游戏运行开始后,获取到刚体组件对象和动画管理对象
m_Rigibody = GetComponent<Rigidbody>();
m_Animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
}
private void FixedUpdate()
{
//将用户输入组装成3d运动需要的三维矢量 - 主要用于表达移动方向
m_Movement.Set(horizontal, 0.0f, vertical);
m_Movement.Normalize();
//先判断是否有横向或者纵向移动
bool hasHorzontal = !Mathf.Approximately(horizontal, 0.0f);
bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
//只要有一个方向移动,就认为玩家角色处与移动网状态
bool isWalking = hasHorzontal || hasVertical;
//将变量传递给动画管理者
m_Animator.SetBool("IsWalking", isWalking);
//用三维矢量来表示转向后的玩家角色的朝向
Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
//设置四元数的值
m_Rotation = Quaternion.LookRotation(desiredForward);
}
private void OnAnimatorMove()
{
//使用从用户输入获取到的三维矢量作为移动方向,使用动画中每次0.02秒移动的距离作为移动距离来移动
m_Rigibody.MovePosition(m_Rigibody.position + m_Movement * m_Animator.deltaPosition.magnitude);
//执行旋转,实现平滑旋转
m_Rigibody.MoveRotation(m_Rotation);
}
}
个人遇到的理解难点解析(由GPT友情解答)
//将用户输入组装成3d运动需要的三维矢量
m_Movement.Set(horizontal, 0.0f, vertical);
m_Movement.Normalize();
------解释-----
矢量的组装在这段代码中涉及到了两个步骤:设置矢量的值和标准化。
1.设置矢量的值
这里使用了 Set
方法来设置 m_Movement
这个三维矢量的值。三维矢量通常表示为
(x,y,z)。
horizontal
:表示水平方向的输入,也就是在x轴上的移动。0.0f
:表示在y轴上没有移动,通常用于确保角色保持在地面上,不会上下浮动。vertical
:表示垂直方向的输入,也就是在z轴上的移动。
通过这个设置,我们将用户输入的水平和垂直方向的移动值组装到一个三维矢量中。
2. 标准化矢量
csharp m_Movement.Normalize();
标准化是将矢量的长度缩放为1的过程,同时保持矢量的方向不变。这样做的目的是去除矢量的长度信息,只保留方向信息。
例如,如果用户同时按下了前进和右转键,那么 horizontal
和 vertical
的值可能都不为0。如果不进行标准化,角色可能会沿着对角线移动得比沿着纯水平或纯垂直方向移动得更快。通过标准化,我们确保了角色沿任何方向的移动速度都是一致的。
总结一下,这段代码通过获取用户的水平和垂直输入,并将其设置为三维矢量的x和z分量,然后进行标准化,来组装出一个表示玩家移动方向的三维矢量。
-----总结:m_Movement
这个三维矢量用来定义玩家角色的移动方向。-----
难点2:Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
------解答------
csharp Copy code Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
方法解释
Vector3.RotateTowards
是一个静态方法,用于计算从一个方向旋转到另一个方向的过程中的下一步方向。transform.forward
是玩家角色当前的朝向方向(前方)。m_Movement
是玩家角色希望移动的方向。turnSpeed * Time.deltaTime
是每帧允许的最大旋转角度,单位为度。turnSpeed
是旋转速度,而Time.deltaTime
是上一帧完成后到当前帧的时间,这样可以确保旋转速度与帧率无关。0f
是旋转的最大角速度。在这里设置为0,意味着没有限制角速度。
代码逻辑
- 确定目标方向:
m_Movement
是我们希望玩家角色朝向的方向,由玩家的输入控制。 - 获取当前方向:
transform.forward
是玩家角色当前的朝向方向。 - 计算旋转角度:
turnSpeed * Time.deltaTime
计算出每帧允许的最大旋转角度,使旋转过程平滑。 - 计算新方向:
Vector3.RotateTowards
方法根据上述信息计算出新的朝向方向。这个新方向是在朝向目标方向的过程中的下一个步骤。
结果
desiredForward
存储了计算出的新的朝向方向。- 该方向将逐渐旋转到与
m_Movement
相同的方向,但不会立即改变,从而实现了平滑的转向效果。
总的来说,这行代码用于计算玩家角色的旋转方向,使角色能够平滑地转向并朝向正确的方向移动。