花了幾個小時重新根據Unity3D的初學者教程做了一個簡單的Demo,做完後確實對新人來說是個比較不錯的學習項目,項目中控制人物移動是用的鍵盤的方向鍵,就想如果在手機平臺的話,實現搖杆控制方向,類似於王者榮耀那樣的效果,所以就順便學習了Joystick Pack組件。今天這篇就是介紹Joystick Pack的簡單使用。
上面的視頻就是用了Joystick Pack後實現的移動效果,鍵盤和搖杆可以同時操作,邏輯是一樣的。Joystick Pack虛擬操縱杆在Unity的資源商店中可以直接獲取,是完全的免費資源,可以直接在Unity3D資源商店中直接獲取。
視頻中的遊戲項目就是在Unity Hub學習目錄下的John Lemon`s Haunted Jaunt:3D Beginner。
在Learn.unity.com中找到這個項目後,跟著教程一步一步的創建和操作完成的。
建議初學者都可以都用這個試一下,做完後對整個項目會有一個簡單的了解。接下來就是我們這篇的重點了,主要講Joystick Pack的使用。
首先要在文章開始的Unity3d的資源商店中把Joystick Pack已經添加到我的資源中。
然後在項目的窗口---包管理器--My Assiets中找到Joystick Pack,把這個包下載並導入。
導入後Assets中就會出現Joystick Pack的文件夾了。
在我們的Canvas的2D面板中創建一個空物體,改名為Operator(代表控制),然後將右邊Joystick Pack--Prefabs--Variable Joystick的預製件拖入到Operator下,另一個btnFinish是一個操作按鈕,用於運行中點擊退出遊戲用的,所以這裡可以忽略。
然後點擊Variable Joystick在右邊的檢查器中調整位置及布局,這個可以自己設置位置和大小。
到這裡,布局就完成了,接下來就是怎麼實現搖杆控制人物移動。
點擊人物後,可以看到右邊的檢查器中綁定的Player Movement的腳本,這個腳本就是控制人物移動的,雙擊這個腳本後我們開始進行代碼編輯。
增加一個VariableJoystick,屬性的public,這樣可以外部賦值。
然後在FixedUpdate()的方法裡,添加上面的兩行代碼,這裡說明一下,horizontal是水平移動的值,vertical是垂直移動的值,原代碼中通過Input.GetAxis的方法獲取到鍵盤移動的值,我們這裡的原理是:
當判斷horizontal和vertical的值為0時,說明沒有按鍵盤的方向鍵,這時我們再獲取Variable Joystick對應的horizontal和vertical的值。這樣就可以保證鍵盤和搖杆都可以操作,當然鍵盤的優先級更後,當按下鍵盤方向時,同時操作搖杆是不起作用的。using System.Collections;using System.Collections.Generic;using UnityEngine;
public class PlayerMovement : MonoBehaviour{ public float turnSpeed = 20f;
public VariableJoystick variableJoystick;
Vector3 m_Movement; Quaternion m_Rotation = Quaternion.identity; Animator m_Animator;
Rigidbody m_Rigidbody; AudioSource m_AudioSource;
void Start() { m_Animator = GetComponent<Animator>(); m_Rigidbody = GetComponent<Rigidbody>(); m_AudioSource = GetComponent<AudioSource>(); }
void FixedUpdate() { float horizontal = Input.GetAxis("Horizontal"); float vertical = Input.GetAxis("Vertical");
horizontal = horizontal == 0 ? variableJoystick.Horizontal : horizontal; vertical = vertical == 0 ? variableJoystick.Vertical : vertical;
m_Movement.Set(horizontal, 0f, vertical); m_Movement.Normalize();
bool hasHorizontalInput = !Mathf.Approximately(horizontal, 0f); bool hasVerticalINput = !Mathf.Approximately(vertical, 0f);
bool isWalking = hasHorizontalInput || hasVerticalINput;
m_Animator.SetBool("IsWalking", isWalking); if (isWalking) { if (!m_AudioSource.isPlaying) { m_AudioSource.Play(); } } else { m_AudioSource.Stop(); }
Vector3 desiredForward = Vector3.RotateTowards(transform.forward, m_Movement, turnSpeed * Time.deltaTime, 0f);
m_Rotation = Quaternion.LookRotation(desiredForward); }
void OnAnimatorMove() { m_Rigidbody.MovePosition(m_Rigidbody.position + m_Movement * m_Animator.deltaPosition.magnitude);
m_Rigidbody.MoveRotation(m_Rotation); }}
完成上面的代碼後,我們把腳本保存,這樣上面創建的Variable Joystick就會顯示在PlayerMovement的檢查器中了。
將Variable Joystick的組件拖到右下角Player Movement中定義的Variable Joystick中就實現綁定。
完成上面的步驟後,Joystick Pack搖杆控制就簡單的實現了。