FBX模型动画的播放与游戏摇杆的使用

动画的播放:

 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 }
本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
原文地址:https://www.cnblogs.com/ifinver/p/3096364.html