动画的播放:
1 using UnityEngine; 2 using System.Collections; 3 4 public class Controller : MonoBehaviour { 5 6 //人物的行走方向状态 7 public const int HERO_UP= 0; 8 public const int HERO_RIGHT= 1; 9 public const int HERO_DOWN= 2; 10 public const int HERO_LEFT= 3; 11 12 //人物当前行走方向状态 13 public int state = 0; 14 15 //备份上一次人物当前行走方向状态 16 //这里暂时没有用到 17 public int backState = 0; 18 19 //游戏摇杆对象 20 public MPJoystick moveJoystick; 21 22 //这个方法只调用一次,在Start方法之前调用 23 public void Awake() { 24 25 } 26 27 //这个方法只调用一次,在Awake方法之后调用 28 void Start () { 29 state = HERO_DOWN; 30 } 31 32 void Update () { 33 34 //获取摇杆控制的方向数据 上一章有详细介绍 35 float touchKey_x = moveJoystick.position.x; 36 float touchKey_y = moveJoystick.position.y; 37 38 if(touchKey_x == -1){ 39 setHeroState(HERO_LEFT); 40 41 }else if(touchKey_x == 1){ 42 setHeroState(HERO_RIGHT); 43 44 } 45 46 if(touchKey_y == -1){ 47 setHeroState(HERO_DOWN); 48 49 }else if(touchKey_y == 1){ 50 setHeroState(HERO_UP); 51 } 52 53 if(touchKey_x == 0 && touchKey_y ==0){ 54 //松开摇杆后播放默认动画, 55 //不穿参数为播放默认动画。 56 animation.Play(); 57 } 58 59 } 60 61 public void setHeroState(int newState) 62 { 63 64 //根据当前人物方向 与上一次备份方向计算出模型旋转的角度 65 int rotateValue = (newState - state) * 90; 66 Vector3 transformValue = new Vector3(); 67 68 //播放行走动画 69 animation.Play("walk"); 70 71 //模型移动的位移的数值 72 switch(newState){ 73 case HERO_UP: 74 transformValue = Vector3.forward * Time.deltaTime; 75 break; 76 case HERO_DOWN: 77 transformValue = -Vector3.forward * Time.deltaTime; 78 break; 79 case HERO_LEFT: 80 transformValue = Vector3.left * Time.deltaTime; 81 82 break; 83 case HERO_RIGHT: 84 transformValue = -Vector3.left * Time.deltaTime; 85 break; 86 } 87 88 //模型旋转 89 transform.Rotate(Vector3.up, rotateValue); 90 91 //模型移动 92 transform.Translate(transformValue, Space.World); 93 94 backState = state; 95 state = newState; 96 97 } 98 99 }
摇杆的使用:
1 using UnityEngine; 2 3 /** 4 5 * File: MPJoystick.cs 6 7 * Author: Chris Danielson of (monkeyprism.com) 8 9 * 10 11 // USED TO BE: Joystick.js taken from Penelope iPhone Tutorial 12 13 // 14 15 // Joystick creates a movable joystick (via GUITexture) that 16 17 // handles touch input, taps, and phases. Dead zones can control 18 19 // where the joystick input gets picked up and can be normalized. 20 21 // 22 23 // Optionally, you can enable the touchPad property from the editor 24 25 // to treat this Joystick as a TouchPad. A TouchPad allows the finger 26 27 // to touch down at any point and it tracks the movement relatively 28 29 // without moving the graphic 30 31 */ 32 [RequireComponent(typeof(GUITexture))] 33 34 public class MPJoystick : MonoBehaviour 35 36 { 37 38 class Boundary { 39 40 public Vector2 min = Vector2.zero; 41 42 public Vector2 max = Vector2.zero; 43 44 } 45 private static MPJoystick[] joysticks; // A static collection of all joysticks 46 47 private static bool enumeratedJoysticks = false; 48 49 private static float tapTimeDelta = 0.3f; // Time allowed between taps 50 public bool touchPad; 51 52 public Vector2 position = Vector2.zero; 53 54 public Rect touchZone; 55 56 public Vector2 deadZone = Vector2.zero; // Control when position is output 57 58 public bool normalize = false; // Normalize output after the dead-zone? 59 60 public int tapCount; 61 62 private int lastFingerId = -1; // Finger last used for this joystick 63 64 private float tapTimeWindow; // How much time there is left for a tap to occur 65 66 private Vector2 fingerDownPos; 67 68 //private float fingerDownTime; 69 70 //private float firstDeltaTime = 0.5f; 71 private GUITexture gui; 72 73 private Rect defaultRect; // Default position / extents of the joystick graphic 74 75 private Boundary guiBoundary = new Boundary(); // Boundary for joystick graphic 76 77 private Vector2 guiTouchOffset; // Offset to apply to touch input 78 79 private Vector2 guiCenter; // Center of joystick 80 void Start() { 81 82 gui = (GUITexture)GetComponent(typeof(GUITexture)); 83 defaultRect = gui.pixelInset; 84 85 defaultRect.x += transform.position.x * Screen.width;// + gui.pixelInset.x; // - Screen.width * 0.5; 86 87 defaultRect.y += transform.position.y * Screen.height;// - Screen.height * 0.5; 88 transform.position = Vector3.zero; 89 if (touchPad) { 90 91 // If a texture has been assigned, then use the rect ferom the gui as our touchZone 92 93 if ( gui.texture ) 94 95 touchZone = defaultRect; 96 97 } else { 98 99 guiTouchOffset.x = defaultRect.width * 0.5f; 100 101 guiTouchOffset.y = defaultRect.height * 0.5f; 102 // Cache the center of the GUI, since it doesn't change 103 104 guiCenter.x = defaultRect.x + guiTouchOffset.x; 105 106 guiCenter.y = defaultRect.y + guiTouchOffset.y; 107 // Let's build the GUI boundary, so we can clamp joystick movement 108 109 guiBoundary.min.x = defaultRect.x - guiTouchOffset.x; 110 111 guiBoundary.max.x = defaultRect.x + guiTouchOffset.x; 112 113 guiBoundary.min.y = defaultRect.y - guiTouchOffset.y; 114 115 guiBoundary.max.y = defaultRect.y + guiTouchOffset.y; 116 117 } 118 119 } 120 public Vector2 getGUICenter() { 121 122 return guiCenter; 123 124 } 125 void Disable() { 126 127 gameObject.active = false; 128 129 //enumeratedJoysticks = false; 130 131 } 132 private void ResetJoystick() { 133 134 gui.pixelInset = defaultRect; 135 136 lastFingerId = -1; 137 138 position = Vector2.zero; 139 140 fingerDownPos = Vector2.zero; 141 142 } 143 private bool IsFingerDown() { 144 145 return (lastFingerId != -1); 146 147 } 148 public void LatchedFinger(int fingerId) { 149 150 // If another joystick has latched this finger, then we must release it 151 152 if ( lastFingerId == fingerId ) 153 154 ResetJoystick(); 155 156 } 157 void Update() { 158 159 if (!enumeratedJoysticks) { 160 161 // Collect all joysticks in the game, so we can relay finger latching messages 162 163 joysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick)); 164 165 enumeratedJoysticks = true; 166 167 } 168 int count = Input.touchCount; 169 if ( tapTimeWindow > 0 ) 170 171 tapTimeWindow -= Time.deltaTime; 172 173 else 174 175 tapCount = 0; 176 if ( count == 0 ) 177 178 ResetJoystick(); 179 180 else 181 182 { 183 184 for(int i = 0; i < count; i++) { 185 186 Touch touch = Input.GetTouch(i); 187 188 Vector2 guiTouchPos = touch.position - guiTouchOffset; 189 bool shouldLatchFinger = false; 190 191 if (touchPad) { 192 193 if (touchZone.Contains(touch.position)) 194 195 shouldLatchFinger = true; 196 197 } 198 199 else if (gui.HitTest(touch.position)) { 200 201 shouldLatchFinger = true; 202 203 } 204 // Latch the finger if this is a new touch 205 206 if (shouldLatchFinger && (lastFingerId == -1 ¦¦ lastFingerId != touch.fingerId )) { 207 if (touchPad) { 208 209 //gui.color.a = 0.15; 210 211 lastFingerId = touch.fingerId; 212 213 //fingerDownPos = touch.position; 214 215 //fingerDownTime = Time.time; 216 217 } 218 lastFingerId = touch.fingerId; 219 220 // Accumulate taps if it is within the time window 221 222 if ( tapTimeWindow > 0 ) 223 224 tapCount++; 225 226 else { 227 228 tapCount = 1; 229 230 tapTimeWindow = tapTimeDelta; 231 232 } 233 // Tell other joysticks we've latched this finger 234 235 //for ( j : Joystick in joysticks ) 236 237 foreach (MPJoystick j in joysticks) { 238 239 if (j != this) 240 241 j.LatchedFinger( touch.fingerId ); 242 243 } 244 245 } 246 if ( lastFingerId == touch.fingerId ) { 247 248 // Override the tap count with what the iPhone SDK reports if it is greater 249 250 // This is a workaround, since the iPhone SDK does not currently track taps 251 252 // for multiple touches 253 254 if ( touch.tapCount > tapCount ) 255 256 tapCount = touch.tapCount; 257 if ( touchPad ) { 258 259 // For a touchpad, let's just set the position directly based on distance from initial touchdown 260 261 position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 ); 262 263 position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 ); 264 265 } else { 266 267 // Change the location of the joystick graphic to match where the touch is 268 269 Rect r = gui.pixelInset; 270 271 r.x = Mathf.Clamp( guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x ); 272 273 r.y = Mathf.Clamp( guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y ); 274 275 gui.pixelInset = r; 276 277 } 278 if (touch.phase == TouchPhase.Ended ¦¦ touch.phase == TouchPhase.Canceled) 279 280 ResetJoystick(); 281 282 } 283 284 } 285 286 } 287 if (!touchPad) { 288 289 // Get a value between -1 and 1 based on the joystick graphic location 290 291 position.x = ( gui.pixelInset.x + guiTouchOffset.x - guiCenter.x ) / guiTouchOffset.x; 292 293 position.y = ( gui.pixelInset.y + guiTouchOffset.y - guiCenter.y ) / guiTouchOffset.y; 294 295 } 296 // Adjust for dead zone 297 298 var absoluteX = Mathf.Abs( position.x ); 299 300 var absoluteY = Mathf.Abs( position.y ); 301 302 if (absoluteX < deadZone.x) { 303 304 // Report the joystick as being at the center if it is within the dead zone 305 306 position.x = 0; 307 308 } 309 310 else if (normalize) { 311 312 // Rescale the output after taking the dead zone into account 313 314 position.x = Mathf.Sign( position.x ) * ( absoluteX - deadZone.x ) / ( 1 - deadZone.x ); 315 316 } 317 if (absoluteY < deadZone.y) { 318 319 // Report the joystick as being at the center if it is within the dead zone 320 321 position.y = 0; 322 323 } 324 325 else if (normalize) { 326 327 // Rescale the output after taking the dead zone into account 328 329 position.y = Mathf.Sign( position.y ) * ( absoluteY - deadZone.y ) / ( 1 - deadZone.y ); 330 331 } 332 } 333 }