在将模型导入到Scenes视图中,为角色加入动画后,角色出现沿Y轴向上升的情况:
原因:因为觉得的动画和RigidBody物理系统发生了冲突。
解决方案:把Updata Mode从Normal模式改变为Animate Physics,然后锁定刚体中的Y轴。
实现物理交互的组件一般在FixUpdata中实现。
在update中获取键盘输入:
void Update()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
}
为了达到移动的效果,在start函数中获取刚体和动画组件:
void Start()
{
m_Rigidbody = GetComponent<Rigidbody>();
m_animator = GetComponent<Animator>();
}
玩家移动:
private void FixedUpdate()
{
//组装为运动需要的三维矢量
m_Movement.Set(horizontal, 0.0f, vertical);
m_Movement.Normalize();
bool hasHorizontal = !Mathf.Approximately(horizontal, 0.0f);
bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
//只要有一个方向移动,就代表玩家游戏角色是移动状态
bool isWalking = hasHorizontal || hasVertical;
m_animator.SetBool("isWalking", isWalking);
}
private void OnAnimatorMove()
{
//使用从用户输入获取到的值作为方向,使用动画中fixupdate中的刷新作为移动的速度
m_Rigidbody.MovePosition(m_Rigidbody.position +m_Movement*m_animator.deltaPosition.magnitude);
}
角色转向:
//创建一个四元数,用于控制转向,初始化为不旋转
Quaternion m_Rotation = Quaternion.identity;
public float tureSpeed = 20.0f;
private void FixedUpdate()
{
//组装为运动需要的三维矢量
m_Movement.Set(horizontal, 0.0f, vertical);
m_Movement.Normalize();
bool hasHorizontal = !Mathf.Approximately(horizontal, 0.0f);
bool hasVertical = !Mathf.Approximately(vertical, 0.0f);
//只要有一个方向移动,就代表玩家游戏角色是移动状态
bool isWalking = hasHorizontal || hasVertical;
m_animator.SetBool("isWalking", isWalking);
Vector3 desireForward = Vector3.RotateTowards(transform.forward,m_Movement,tureSpeed*Time.deltaTime,0.0f);
//设置四元数
m_Rotation = Quaternion.LookRotation(desireForward);
}
private void OnAnimatorMove()
{
//使用从用户输入获取到的值作为方向,使用动画中fixupdate中的刷新作为移动的速度
m_Rigidbody.MovePosition(m_Rigidbody.position +m_Movement*m_animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation(m_Rotation);
}
}