继续上次的内容PlayerMovement中的
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; //定义camRay和场景中地板的交点
if (Physics.Raycast (camRay, out floorHit, camRayLength, floorMask)) { //计算鼠标位置的直线和地板的交点,camRayLength为直线最大长度,看来太远了就不能取得floorHit,但这个游戏中不存在,floorMask为地板层掩码,表示计算camRay和floorMask层交点,即是与鼠标指中的地板位置
Vector3 playerToMouse = floorHit.point - transform.position; //player的位置(由于绑在Player上)到鼠标指中的地板位置的向量
playerToMouse.y = 0f; //令其y等于0,等于投影在x,z轴的平面上,就是游戏中的地板
Quaternion newRotation = Quaternion.LookRotation (playerToMouse); //设置Quaternion,由于Unity运算中很多都用这个,所以就是转化
playerRigidbody.MoveRotation (newRotation); //然后让play转向到对应方向
}
}
void Animating(float h,float v)
{
bool walking = (h != 0f || v != 0f); //如果h,v都为0,就是没有移动的输入
anim.SetBool("IsWalking",walking); //将Animator中的变量IsWalking赋值,具体看player的状态转化图和条件,其实就是Move动画和Idel动画之间互相转化的控制
}
设置工程中我遇到的问题
在PlayerAC这个Animation中记得把红圈的Has Exit Time勾掉,不然会执行完一个动画的所有帧后才进行动画内容的相互转换