好了好了,上篇说到如何用代码来控制Animator里的条件参数,话不多说,直接开始。
Animator m_Animator;
m_Animator = GetComponent<Animator>();
m_Animator.SetBool("OnGround", true);
很简单地几行代码就可以给参数赋值了,通过查API我们可以知道SetBool的第一个参数是Animator的参数名字,第二个参数就是给它赋值。同理,要给Forward赋值就要用到SetFloat。
我根据我的需求把我的Animator做成这样:
Unity有一个自带的ThirdPersonCharacter.cs来控制Animator,不过要在5.0以上的版本才有。4.X版本要用的话直接复制过来也可以用。一开始看到这个代码我真的是一头雾水,硬着头皮看下去还是大概看懂了,我根据我自己制作的Animator大概改了一下,然后给出了标注。
using UnityEngine;
namespace UnityStandardAssets.Characters.ThirdPerson
{
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(Animator))]
public class ThirdPersonCharacter : MonoBehaviour
{
[SerializeField] float m_MovingTurnSpeed = 360;
[SerializeField] float m_StationaryTurnSpeed = 180;
[SerializeField] float m_JumpPower = 12f;
[Range(1f, 4f)][SerializeField] float m_GravityMultiplier = 2f;
[SerializeField] float m_RunCycleLegOffset = 0.2f; //specific to the character in sample assets, will need to be modified to work with others
[SerializeField] float m_MoveSpeedMultiplier = 1f;
[SerializeField] float m_AnimSpeedMultiplier = 1f;
[SerializeField] float m_GroundCheckDistance = 0.1f;
Rigidbody m_Rigidbody;
Animator m_Animator;
bool m_IsGrounded;
float m_OrigGroundCheckDistance;
const float k_Half = 0.5f;
float m_TurnAmount;
float m_ForwardAmount;
Vector3 m_GroundNormal;
float m_CapsuleHeight;
Vector3 m_CapsuleCenter;
CapsuleCollider m_Capsule;
bool m_Crouching;
void Start()
{
m_Animator = GetComponent<Animator>();
m_Rigidbody = GetComponent<Rigidbody>();
m_Capsule = GetComponent<CapsuleCollider>();
m_CapsuleHeight = m_Capsule.height;
m_CapsuleCenter = m_Capsule.center;
m_Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;
m_OrigGroundCheckDistance = m_GroundCheckDistance;
}
public void Move(Vector3 move, bool crouch, bool jump,bool kick,bool ultimate,bool Throw)
{
// convert the world relative moveInput vector into a local-relative
// turn amount and forward amount required to head in the desired
// direction.
//从ThirdPersonUserControl进行调用
//若移动向量的长度>1f,则先把向量标准化
if (move.magnitude > 1f) move.Normalize();
//让向量move变为反向
move = transform.InverseTransformDirection(move);
//看是否在地上
CheckGroundStatus();
//让前进反向与所接触表面的法线形成直角,举个例子,就是说