unity3d easytouch計算搖桿旋轉角度以及搖桿八方向控制角色

在寫第三人稱控制的時候,一開始在電腦測試是用WASD控制角色
更多精彩請關注【狗刨學習網】

後來需要發佈到手機上,於是就加了一個搖桿

鍵盤控制角色的代碼已經寫好了,角色八方向移動

如果按照傳統的大衆思路來控制的話,是達不到我想要的效果的,傳統控制思路代碼如下:
  
  1. 1 //當搖桿處於移動狀態時,角色開始奔跑
  2. 2   void OnJoystickMove(MovingJoystick move)
  3. 3   {
  4. 4     if (move.joystickName != "EasyJoystick")
  5. 5     {
  6. 6       return;
  7. 7     }
  8. 8     //獲取搖桿偏移量
  9. 9     float joyPositionX = move.joystickAxis.x;
  10. 10     float joyPositionY = move.joystickAxis.y;
  11. 11     if (joyPositionY != 0 || joyPositionX != 0)
  12. 12     {
  13. 13       //設置角色的朝向(朝向當前座標+搖桿偏移量)
  14. 14        transform.LookAt(new Vector3(transform.position.x + joyPositionX, transform.position.y, transform.position.z + joyPositionY));
  15. 15       //移動玩家的位置(按朝向位置移動)
  16. 16       transform.Translate(Vector3.forward * Time.deltaTime * 7.5F);
  17. 17       //播放奔跑動畫
  18. 18       animation.CrossFade("Run");
  19. 19     }
  20. 20   }
複製代碼

如果要按照搖桿傳統思路控制角色,在重新寫控制角色代碼的話非常麻煩,所以我就通過計算搖桿旋轉角度來判斷當前搖桿處於哪個方向

ok,現在我們開始來敲代碼

首先,我們來調試觀察一下搖桿的x軸、y軸的返回值

  1.   //移動搖桿中  
  2. 2     void OnJoystickMove(MovingJoystick move)
  3. 3     {
  4. 4         Debug.Log(move.joystickAxis.x + "," + move.joystickAxis.y);
  5. 5     }
複製代碼

調試結果爲:

    左:x = -1,y = 0;順時針旋轉X逐漸變大,Y逐漸變大
    上:x = 0,y = 1;順時針旋轉X逐漸變大,Y逐漸變小
    右:x = 1,y = 0;順時針旋轉X逐漸變小,Y逐漸變小
    下:x = 0,y = -1;順時針旋轉X逐漸變小,Y逐漸變大

我們把搖桿底圖看成是兩個半圓,上半圓和下半圓

那麼:

    X軸移動到左邊時,X = -1;X軸移動到右邊時:X = 1;X軸從左轉到右旋轉了180度
    Y軸移動到左邊時,Y = 0;Y軸移動到右邊時:Y = 0;Y軸從左轉到右旋轉了180度

你如果直接看我的調試結果肯定有點暈,建議邊調試邊參考我的調試結果,這樣才能理解

如果我們要計算當前搖桿在左上角旋轉的度數怎麼計算呢?

讀過小學的人都可以做,只是看見搖桿返回的-1和0腦袋被繞迷糊了,我也一樣,弄了好半天才弄好

    當搖桿移動到左時,爲0度、360度(因爲360度爲一圈,已經繞回遠點了)
    當搖桿移動到上時,爲90度
    當搖桿移動到右時,爲180度
    當搖桿移動到下時,爲270度

既然知道是多少度這就好辦多了

得出公式:

    當X軸在右時爲1,也就是X軸爲180度,則:1 * 90 + 90 = 180
    當前X軸旋轉角度爲:X軸返回值 * 90度 + 90度

你以爲這就完事了嗎?還高興得太早,用這個公式計算只能得到上半圓的旋轉角度

現在我們要獲取下半圓旋轉角度,然後用上半圓旋轉角度 + 下半圓旋轉角度 = 當前旋轉角度

當搖桿移動到下半圓時我們怎麼計算旋轉角度呢?

我們已經知道Y軸在左邊爲0,在右邊爲0,在下邊爲-1,繼續用計算X軸的公式

    Y左:0 * 90 + 90 = 90
    Y上:1 * 90 + 90 = 180
    Y下:-1 * 90 + 90 = 0
    Y右:0 * 90 + 90 = 90

    X左:-1 * 90 + 90 = 0
    X上:0 * 90 + 90 = 90
    X下:0 * 90 + 90 = 90
    X右:1 * 90 + 90 = 180

從計算結果中可以得出結論

    當Y軸小於90度時,搖桿就處於下半圓
    當Y軸小於90度時且X小於90度時爲左下:270度 + Y軸旋轉角度
    當Y軸小於90度時且X大於90度時爲右下:180度 + Y軸旋轉角度

思路搞定了,開始敲代碼,代碼不多,我直接貼上來了,看完上訴文字相信你已經知道這些代碼是怎麼回事了

  1. 1     /// 計算搖桿角度 <summary>
  2. 2     /// 計算搖桿角度
  3. 3     /// </summary>
  4. 4     /// <param name="_joyPositionX">搖桿X軸</param>
  5. 5     /// <param name="_joyPositionY">搖桿Y軸</param>
  6. 6     /// <returns>返回當前搖桿旋轉多少度</returns>
  7. 7     private float CalculaAngle(float _joyPositionX, float _joyPositionY)
  8. 8     {
  9. 9         float currentAngleX = _joyPositionX * 90f + 90f;//X軸 當前角度
  10. 10         float currentAngleY = _joyPositionY * 90f + 90f;//Y軸 當前角度
  11. 11 
  12. 12         //下半圓
  13. 13         if (currentAngleY < 90f)
  14. 14         {
  15. 15             if (currentAngleX < 90f)
  16. 16             {
  17. 17                 return 270f + currentAngleY;
  18. 18             }
  19. 19             else if (currentAngleX > 90f)
  20. 20             {
  21. 21                 return 180f + (90f - currentAngleY);
  22. 22             }
  23. 23         }
  24. 24         return currentAngleX;
  25. 25     }
複製代碼


ok,現在知道當前搖桿旋轉了多少度,我們可以輕鬆的用角度來判斷當前移動方向了
用鍵盤控制時:

    A = 左
    WA = 左上
    W = 上
    WD = 右上
    D = 右
    SD = 右下
    S = 下
    SA = 左下

    當搖桿角度爲0度,往左
    當搖桿角度爲90度,往上
    當搖桿角度爲180度,往右

那我們肯定不能這樣寫啊,你能確定玩家操作搖桿那麼精確啊?

因爲我這裏控制角色是八方向,所以:360 / 8 = 45

每個方向有45度可觸發,那麼得出以下解決方案:

上:當前角度 <= 90 + 45 / 2 = 112.5 && 當前角度 >= 90 - 45 / 2 = 67.5

如法炮製,得出以下代碼:
  1. 1             float currentAngle = CalculaAngle(joyPositionX, joyPositionY);
  2. 2             
  3. 3             if (currentAngle <= 22.5f && currentAngle >= 0f || currentAngle <= 360f && currentAngle >= 337.5f)//0;左
  4. 4                 CurrentDire = "A";
  5. 5             else if (currentAngle <= 67.5f && currentAngle >= 22.5f)//45;左上
  6. 6                 CurrentDire = "WA";
  7. 7             else if (currentAngle <= 112.5f && currentAngle >= 67.5f)//90;上
  8. 8                 CurrentDire = "W";
  9. 9             else if (currentAngle <= 157.5f && currentAngle >= 112.5f)//135;右上
  10. 10                 CurrentDire = "WD";
  11. 11             else if (currentAngle <= 202.5f && currentAngle >= 157.5f)//180;右
  12. 12                 CurrentDire = "D";
  13. 13             else if (currentAngle <= 247.5f && currentAngle >= 202.5f)//225;右下
  14. 14                 CurrentDire = "SD";
  15. 15             else if (currentAngle <= 292.5f && currentAngle >= 247.5f)//270;下
  16. 16                 CurrentDire = "S";
  17. 17             else if (currentAngle <= 337.5f && currentAngle >= 292.5f)//315;左下
  18. 18                 CurrentDire = "SA";
複製代碼

大功告成,趕緊發佈到手機上跑一下試試,這就是我想要的搖桿八方向操作效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章