版本:unity 5.3.4 语言:C#
第三人称的脚本有三个,一个是移动基础,一个是用户控制,还有一个会自动寻路的AI控制,关于NavMeshAgent会用是会用,但是还是比较好奇他的一个内部实现的。
移动基础的代码是有点多的,所以我们按照逻辑顺序线看用户控制的ThirdPersonUserControl脚本:
// 用户控制器,基于ThirdPersonCharacter移动类这个脚本
[RequireComponent(typeof (ThirdPersonCharacter))]
public class ThirdPersonUserControl : MonoBehaviour
{
private ThirdPersonCharacter m_Character; //ThirdPersonCharacter脚本的引用
private Transform m_Cam; //主相机的位置
private Vector3 m_CamForward; //当前相机的正前方
private Vector3 m_Move; //根据相机的正前方和用户的输入,计算世界坐标相关的移动方向
private bool m_Jump;
// 初始化
private void Start()
{
// 获取主相机,这边的实现跟球控制器是一样的
if (Camera.main != null)
{
m_Cam = Camera.main.transform;
}
else
{
// 在这个例子中我们使用世界坐标来控制,也许这不是他们做希望的,不过我们至少警告一下他们
Debug.LogWarning("警告:不存在一个主相机,球需要一个tag为MainCamera的相机,来做相机关联的移动");
}
// 获取第三人称的移动脚本,这个不能为空
m_Character = GetComponent<ThirdPersonCharacter>();
}
// 更新
private void Update()
{
if (!m_Jump) //不在跳跃状态下,如果读到跳跃则更新变量
{
m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");
}
}
// 固定更新,用于物理的同步
private void FixedUpdate()
{
// 获取用户的输入
float h = CrossPlatformInputManager.GetAxis("Horizontal");
float v = CrossPlatformInputManager.GetAxis("Vertical");
bool crouch = Input.GetKey(KeyCode.C);
// 计算移动方向,并传递给角色
if (m_Cam != null)
{
// 计算相机关联方向,这边同样强调了前方向
m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized;
m_Move = v*m_CamForward + h*m_Cam.right;
}
else
{
// 当没有相机时,直接以世界坐标轴作为参考
m_Move = v*Vector3.forward + h*Vector3.right;
}
#if !MOBILE_INPUT
// 走路速度减半
if (Input.GetKey(KeyCode.LeftShift)) m_Move *= 0.5f;
#endif
// 将所有的参数传递给移动类