本章博文的目的是利用上一章介紹的游戲搖桿來控制人物模型的移動(見 http://www.linuxidc.com/Linux/2012-04/59394.htm ),與行走動畫的播放。
如上圖所示Create中的文件夾male中存放著模型動畫與貼圖等,這個應該是美術提供給我們的。然後將整個male用鼠標拖動到左側3D世界中,通過移動,旋轉,縮放將人物模型放置在一個理想的位置。右側紅框內設置模型動畫的屬性。
Animation
idle1 該模型默認動畫名稱為idle1
Animations
size 該模型動畫的數量
Element 該模型的動畫名稱
Play Automatically 是否自動播放
Animation Physics 是否設置該模型物理碰撞
Animation Only if Visable 是否設置該模型僅自己顯示
給該模型綁定一個腳本Controller.cs 用來接收搖桿返回的信息更新模型動畫。
Controller.cs
- using UnityEngine;
- using System.Collections;
-
-
-
- public class Controller : MonoBehaviour {
-
- //人物的行走方向狀態
- public const int HERO_UP= 0;
- public const int HERO_RIGHT= 1;
- public const int HERO_DOWN= 2;
- public const int HERO_LEFT= 3;
-
- //人物當前行走方向狀態
- public int state = 0;
-
- //備份上一次人物當前行走方向狀態
- //這裡暫時沒有用到
- public int backState = 0;
-
- //游戲搖桿對象
- public MPJoystick moveJoystick;
-
- //這個方法只調用一次,在Start方法之前調用
- public void Awake() {
-
- }
-
- //這個方法只調用一次,在Awake方法之後調用
- void Start () {
- state = HERO_DOWN;
- }
-
-
- void Update () {
-
- //獲取搖桿控制的方向數據 上一章有詳細介紹
- float touchKey_x = moveJoystick.position.x;
- float touchKey_y = moveJoystick.position.y;
-
-
-
- if(touchKey_x == -1){
- setHeroState(HERO_LEFT);
-
- }else if(touchKey_x == 1){
- setHeroState(HERO_RIGHT);
-
- }
-
- if(touchKey_y == -1){
- setHeroState(HERO_DOWN);
-
- }else if(touchKey_y == 1){
- setHeroState(HERO_UP);
- }
-
- if(touchKey_x == 0 && touchKey_y ==0){
- //松開搖桿後播放默認動畫,
- //不穿參數為播放默認動畫。
- animation.Play();
- }
-
-
- }
-
- public void setHeroState(int newState)
- {
-
- //根據當前人物方向 與上一次備份方向計算出模型旋轉的角度
- int rotateValue = (newState - state) * 90;
- Vector3 transformValue = new Vector3();
-
- //播放行走動畫
- animation.Play("walk");
-
- //模型移動的位移的數值
- switch(newState){
- case HERO_UP:
- transformValue = Vector3.forward * Time.deltaTime;
- break;
- case HERO_DOWN:
- transformValue = -Vector3.forward * Time.deltaTime;
- break;
- case HERO_LEFT:
- transformValue = Vector3.left * Time.deltaTime;
-
- break;
- case HERO_RIGHT:
- transformValue = -Vector3.left * Time.deltaTime;
- break;
- }
-
-
- //模型旋轉
- transform.Rotate(Vector3.up, rotateValue);
-
- //模型移動
- transform.Translate(transformValue, Space.World);
-
- backState = state;
- state = newState;
-
- }
-
- }