在寫第三人稱控制的時候,一開始在電腦測試是用WASD控制角色
后來需要發布到手機上,於是就加了一個搖桿
鍵盤控制角色的代碼已經寫好了,角色八方向移動
如果按照傳統的大眾思路來控制的話,是達不到我想要的效果的,傳統控制思路代碼如下:
1 //當搖桿處於移動狀態時,角色開始奔跑 2 void OnJoystickMove(MovingJoystick move) 3 { 4 if (move.joystickName != "EasyJoystick") 5 { 6 return; 7 } 8 //獲取搖桿偏移量 9 float joyPositionX = move.joystickAxis.x; 10 float joyPositionY = move.joystickAxis.y; 11 if (joyPositionY != 0 || joyPositionX != 0) 12 { 13 //設置角色的朝向(朝向當前坐標+搖桿偏移量) 14 transform.LookAt(new Vector3(transform.position.x + joyPositionX, transform.position.y, transform.position.z + joyPositionY)); 15 //移動玩家的位置(按朝向位置移動) 16 transform.Translate(Vector3.forward * Time.deltaTime * 7.5F); 17 //播放奔跑動畫 18 animation.CrossFade("Run"); 19 } 20 }
如果要按照搖桿傳統思路控制角色,在重新寫控制角色代碼的話非常麻煩,所以我就通過計算搖桿旋轉角度來判斷當前搖桿處於哪個方向
ok,現在我們開始來敲代碼
首先,我們來調試觀察一下搖桿的x軸、y軸的返回值
1 //移動搖桿中 2 void OnJoystickMove(MovingJoystick move) 3 { 4 Debug.Log(move.joystickAxis.x + "," + move.joystickAxis.y); 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 /// 計算搖桿角度 <summary> 2 /// 計算搖桿角度 3 /// </summary> 4 /// <param name="_joyPositionX">搖桿X軸</param> 5 /// <param name="_joyPositionY">搖桿Y軸</param> 6 /// <returns>返回當前搖桿旋轉多少度</returns> 7 private float CalculaAngle(float _joyPositionX, float _joyPositionY) 8 { 9 float currentAngleX = _joyPositionX * 90f + 90f;//X軸 當前角度 10 float currentAngleY = _joyPositionY * 90f + 90f;//Y軸 當前角度 11 12 //下半圓 13 if (currentAngleY < 90f) 14 { 15 if (currentAngleX < 90f) 16 { 17 return 270f + currentAngleY; 18 } 19 else if (currentAngleX > 90f) 20 { 21 return 180f + (90f - currentAngleY); 22 } 23 } 24 return currentAngleX; 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 float currentAngle = CalculaAngle(joyPositionX, joyPositionY); 2 3 if (currentAngle <= 22.5f && currentAngle >= 0f || currentAngle <= 360f && currentAngle >= 337.5f)//0;左 4 CurrentDire = "A"; 5 else if (currentAngle <= 67.5f && currentAngle >= 22.5f)//45;左上 6 CurrentDire = "WA"; 7 else if (currentAngle <= 112.5f && currentAngle >= 67.5f)//90;上 8 CurrentDire = "W"; 9 else if (currentAngle <= 157.5f && currentAngle >= 112.5f)//135;右上 10 CurrentDire = "WD"; 11 else if (currentAngle <= 202.5f && currentAngle >= 157.5f)//180;右 12 CurrentDire = "D"; 13 else if (currentAngle <= 247.5f && currentAngle >= 202.5f)//225;右下 14 CurrentDire = "SD"; 15 else if (currentAngle <= 292.5f && currentAngle >= 247.5f)//270;下 16 CurrentDire = "S"; 17 else if (currentAngle <= 337.5f && currentAngle >= 292.5f)//315;左下 18 CurrentDire = "SA";
大功告成,趕緊發布到手機上跑一下試試,這就是我想要的搖桿八方向操作效果
