下面来详细的说一下关于unity3d简单的角色控制脚步方面的内容,代码和教程如下:

  1. function Play (mode : PlayMode = PlayMode.StopSameLayer) : bool
  2. function Play (animation : string, mode : PlayMode PlayMode.StopSameLayer) : bool



Play()将开始播放名称为animation的动画,或者播放默认动画。动画会突然开始播放而没有任何混合。如果模式是PlayMode.StopSameLayer,那么所有在同一个层的动画将停止播放。如果模式是PlayMode.StopAll,那么所有当前在播放的动画将停止播放。

如果动画已经在播放过程中,别的动画将停止但是动画不会回退到开始位置。
如果动画没有被设置成循环模式,它将停止并且回退到开始位置
如果动画不能被播放(没有动画剪辑或者没有默认动画),Play()将返回false。

  1. // 播放默认动画。
  2. animation.Play();// Plays the walk animation - stops all other animations in the same layer
  3. // 播放walk动画 - 停止同一层的其他动画。
  4. animation.Play("walk");
  5. // Plays the walk animation - stops all other animations
  6. // 播放walk动画 - 停止其他动画。
  7. animation.Play("walk", PlayMode.StopAll);



  8. Animation.CrossFade淡入淡出
  9. function CrossFade (animation : string, fadeLength : float = 0.3F, mode : PlayMode = PlayMode.StopSameLayer) : void

在一定时间内淡入名称为name的动画并且淡出其他动画。如果模式是PlayMode.StopSameLayer,在同一层的动画将在动画淡入的时候淡出。如果模式是PlayMode.StopAll,所有动画将在淡入的时候淡出。如果动画没有被设置成循环,它将停止并且在播放完成之后倒带至开始。

  1. // Fade the walk cycle in and fade all other animations in the same layer out.
  2. // 淡入walk循环并且淡出同一层的所有其他动画。
  3. // Complete the fade within 0.2 seconds.
  4. // 在0.2秒之内完成淡入淡出。
  5. animation.CrossFade("Walk", 0.2);
  6. // Makes a character contains a Run and Idle animation
  7. // fade between them when the player wants to move
  8. // 让一个角色包含Run和Idle动画,并且在玩家想移动的时候在他们之间淡入淡出。
  9. function Update () {
  10. if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
  11. animation.CrossFade("Run");
  12. else
  13. animation.CrossFade("Idle");
  14. }


这里列出的最常见的播放动画的两种方法,还有其他方法属性大家自觉的去查下API吧。下面我放出自己写的人物简单控制脚步,包括上下左右移动。j,k攻击。

RoleScriptContorl.cs

  1. using UnityEngine;
  2. using System.Collections;

  3. public class PlayerControl : MonoBehaviour 
  4. {
  5.     public static PlayerControl instance;
  6.     private AnimationClip animationClip;
  7.     private CharacterController controller;
  8.     public float runSpeed = 5;
  9.     private float moveSpeed = 3;//走路速度
  10.     private string currentState="";

  11.     private GameObject monster;
  12.     
  13.     void Awake()
  14.     {
  15.         instance = this;
  16.     }

  17.     void Start () 
  18.     {
  19.         controller = GetComponent<CharacterController>();
  20.         print(transform.forward);
  21.     }

  22.     
  23.     void Update () 
  24.     {
  25.         KeyboardControl();
  26.     }

  27.     void KeyboardControl()
  28.     {
  29.         
  30.         Vector3 forward = transform.TransformDirection(Vector3.forward);//从自身坐标转换为世界坐标
  31.   
  32.         
  33.         if(Input.GetKey(KeyCode.W))
  34.         {
  35.            

  36.             if(Input.GetKey(KeyCode.LeftShift))
  37.             {
  38.                 currentState = RoleAnimationState.RUN;//改变人物动画状态
  39.                 PlayAnimation(currentState);//播放动画
  40.                 
  41.                 controller.SimpleMove(forward * runSpeed * Time.deltaTime*100);
  42.             }
  43.             else
  44.             {
  45.                 currentState = RoleAnimationState.WALK;
  46.                 PlayAnimation(currentState);

  47.                 controller.SimpleMove(forward * moveSpeed * Time.deltaTime * 100);
  48.             }
  49.         }
  50.         
  51.         if (Input.GetKey(KeyCode.S))
  52.         {
  53.             Vector3 back = transform.TransformDirection(Vector3.back);
  54.             currentState = RoleAnimationState.WALK;
  55.             PlayAnimation(currentState);
  56.             controller.SimpleMove(back * moveSpeed * Time.deltaTime * 100);
  57.         }
  58.         if (Input.GetKey(KeyCode.A))
  59.         {
  60.             Vector3 up = transform.TransformDirection(Vector3.up);
  61.             transform.Rotate(Vector3.up * -50 * Time.deltaTime);
  62.         }
  63.         if (Input.GetKey(KeyCode.D))
  64.         {
  65.             Vector3 up = transform.TransformDirection(Vector3.up);
  66.             transform.Rotate(Vector3.up * 50 * Time.deltaTime);
  67.         }
  68.         if (Input.GetKey(KeyCode.J))
  69.         {
  70.             currentState = RoleAnimationState.ATTACK;
  71.             PlayAnimation(RoleAnimationState.ATTACK);
  72.         }
  73.         if (Input.GetKey(KeyCode.K))
  74.         {
  75.             currentState = RoleAnimationState.ATTACK01;
  76.             PlayAnimation(RoleAnimationState.ATTACK01);
  77.         }
  78.         
  79.             

  80.         if(currentState!=RoleAnimationState.IDLE && !animation.IsPlaying(currentState))
  81.         {
  82.             PlayAnimation(RoleAnimationState.IDLE);
  83.         }

  84.         
  85.     }

  86.     void PlayAnimation(string name)
  87.     {
  88.         currentState = name;
  89.         animationClip = animation[name].clip;
  90.         gameObject.animation.CrossFade(animationClip.name);

  91.     }
  92.   
  93.     
  94. }




下面是动画状态的一个脚本类

  1. using UnityEngine;
  2. using System.Collections;

  3. public class RoleAnimationState : MonoBehaviour 
  4. {
  5.     public const string IDLE="Idle";
  6.     public const string WALK = "Walk";
  7.     public const string RUN = "Run";
  8.     public const string ATTACK = "Attack";
  9.     public const string ATTACK01 = "Attack01";
  10.         
  11. }


人物模型写真和inspector的组件内容(上面的代码直接挂在模型上就可以用的了。)