EasyJoyStick使用以及兩種操作桿
EasyJoyStick的使用方法,簡單的不能再簡單
Hedgehog Team-》Easy Touch -》Add Easy Touch For C#
Hedgehog Team-》Easy Touch -》Extensions-》Adding A New Joystick
配置如圖:![]()
然后看一下配置,我喜歡掌控性強一些,于是只利用到JoyStick傳回來的值,也就是一個Vector2向量。
在PlayerController也就是控制器腳本上加一個引用,然后在Update中接受值即可。
代碼:?Vector2?axis?=?joystick.JoystickAxis;?
如果想要實現動態操作桿,只需要把 DynamicJoystick 口?挑上就行。
別的沒什么難點了。
如果想限制動態操作桿的有效區域設置器Free Area即可。
兩種移動方式解析
(1)直觀移動方式:
轉向立刻生效,指哪走哪
這種比較簡單,直接獲取方向向量,乘以速度即可
Vector2?axis?=?joy_stick.JoystickAxis; float delta_x = axis.x * current_speed * Time.deltaTime; float delta_y = axis.y * current_speed * Time.deltaTime; transform.Translate( delta_x, delta_y, ? 0);? ? ? ? ? ?? |
(2)漸變轉向移動方式:
在這種方式下,如果你向前走,突然把遙桿向后拉,物件不會直接向后移動,而是會轉一個彎,逐漸轉向到目標方向,然后移動。
Vector3?normal?=?(Vector3)axis.normalized; float?cos_theta?=?Vector3.Dot(player_object.transform.up,?normal); float?theta?=?Mathf.Acos(cos_theta); ?float?rota?=?theta?*?axis.magnitude?*?((real_speed?>?player_data.normal_speed?+?0.1f)???player_data.turn_cof_normal?:?player_data.turn_cof_acc); //防抖動 if?(theta?>?0.1f)? { Vector3?old?= transform.eulerAngles; if?(Vector3.Cross(transform.up,?normal).z?>?0) { old.z?+=?rota; } else? { old.z?-=?rota; } transform.eulerAngles?=?old; } transform.position?+= transform.up?*?real_speed?*?Time.deltaTime; |
上面的代碼,本質上講,把移動分解成向前移動,和向拉桿指向方向,逐漸轉向。
這里有兩個要點,
1是計算操作桿方向和當前物件移動方向的夾角。
利用向量夾角公式計算,也就是通過兩個向量的點積計算。
2是計算物件應該延那個方向進行轉向,換句話說,需要判斷物件應該順時針轉過去,還是要逆時針轉過去
這里如果不做處理,那么轉向的時候,會出現問題,比如你明明只想向左轉60度,卻向右轉了300度
這里利用到了叉乘的概念,兩個向量叉乘,其z軸的值的正負,可以判斷兩個向量的順時針,逆時針相對角度關系。