zoukankan      html  css  js  c++  java
  • 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 }
    本博客所有博文,若无专门说明皆为原创,转载请注明作者和出处!
  • 相关阅读:
    安装和配置nginx
    tomcat 生产发布脚本
    nginx 静态页面访问
    redis 搭建主从
    redis 安装
    perl 操作redis
    mysql 用户除了root一般不建议本地登录
    mysql创建用户
    mysql 查看排序集
    perl 安装Cpan
  • 原文地址:https://www.cnblogs.com/ifinver/p/3096364.html
Copyright © 2011-2022 走看看