SurvivalShooter学习笔记(二.玩家移动旋转)
该案例中:(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); } }
玩家状态机切换: