该案例中:(PC端操作)
1.玩家移动输入控制通过虚拟轴Axis,旋转输入控制通过鼠标位置;
2.玩家始终面朝鼠标停留点,鼠标停留点通过摄像机朝地面的射线获取;
3.玩家待机移动状态切换通过Animator组件;
4.玩家移动旋转通过身上刚体组件及其相关函数。
public class PlayerMovement : MonoBehaviour
{
public float speed = 6f; //玩家移动速度
Vector3 movement; // 玩家移动临时变量
Animator anim; //玩家身上动画控制器
Rigidbody playerRigidbody; //玩家身上刚体组件
int floorMask; // 地板的Layer层
float camRayLength = 100f; // 相机射线的长度
void Awake ()
{
// 获取Floor层的值
floorMask = LayerMask.GetMask ("Floor");
// 获取玩家身上各组件
anim = GetComponent <Animator> ();
playerRigidbody = GetComponent <Rigidbody> ();
}
void FixedUpdate ()
{
//每帧获取玩家输入的虚拟轴,水平垂直值
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
// 根据水平垂直输入量移动玩家
Move (h, v);
//旋转玩家
Turning ();
// 根据输入的值播放相应状态动画
Animating (h, v);
}
void Move (float h, float v)
{
//根据输入的虚拟轴值设置变量
movement.Set (h, 0f, v);
// 单位化位移向量并根据速度得到需要移动的向量
movement = movement.normalized * speed * Time.deltaTime;
// 根据移动向量 移动玩家到相应位置
playerRigidbody.MovePosition (transform.position + movement);
}
void Turning ()
{
//创建射线,摄像机指向鼠标点
Ray camRay = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit floorHit;
//如果点到了地面
if(Physics.Raycast (camRay, out floorHit, camRayLength, floorMask))
{
// 创建 从玩家 到地面上鼠标点到的点 的向量
Vector3 playerToMouse = floorHit.point - transform.position;
//确保该向量是沿着地表水平的
playerToMouse.y = 0f;
// 创建玩家指向点击点的旋转值
Quaternion newRotatation = Quaternion.LookRotation (playerToMouse);
//设置玩家的旋转
playerRigidbody.MoveRotation (newRotatation);
}
}
void Animating (float h, float v)
{
// 获取是否有唯一的bool
bool walking = h != 0f || v != 0f;
//设置对应状态机的值
anim.SetBool ("IsWalking", walking);
}
}
玩家状态机切换: