Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉
目錄
Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉
一、簡單介紹
二、實作原理
三、注意事項
五、實作步驟
六、關鍵代碼
七、附加:
一、簡單介紹
Unity中的一些知識點整理。
本節簡單介紹在Unity開發中的,這裡簡單實作虛拟搖杆,然後來操作控制旋轉和移動,當然你也可以使用Unity的 EasyTouch 插件封裝好的實作,直接用;這裡我使用 Unity 滑鼠Touch點選事件來從簡單實作,應該算從從原理上來讓你簡單認識虛拟搖杆的實作過程,如果你有新的方式也可以留言,多謝。
二、實作原理
1、這裡使用 Input.GetMouseButtonDown(0) 、Input.GetMouseButton(0) 、Input.GetMouseButtonUp(0) 相關事件來擷取位置相關資訊進行處理
2、然後你實作對應的接口IUnityTouchVirtualJoyStickCallback相關事件,來擷取對應的位置資訊
3、相關位置資訊,指派給UI和控制物體,控制物體旋轉可能要經過資料轉換(Quaternion.LookRotation 、Trans.Translate)才能使用
三、注意事項
1、這裡是點選螢幕任意位置,如果你是使用在,你可以使用 UGUI 的相關事件擷取滑鼠位置更合适,而不是這裡的 Input.GetMouseButton 相關事件,更為合适
2、移動什麼的需要調整,可以自行需要調整即可
3、使用場景不同,這個案例不一定适合你的使用場景,這裡僅供學習參考哈
4、其中 UnityTouchVirtualJoyStickWrapper 這個也可以繼承一個接口,然後你要重寫新的方法,繼承同一個接口,接口友善擴充,這裡不再贅述
四、效果預覽
五、實作步驟
1、打開 Unity ,建立空工程
2、布置場景,如圖,一個控制體,一些障礙物,一虛拟按鈕UI
3、其中需要注意的是,PlayerCube 上添加 剛體
4、其中需要注意的是, 虛拟按鈕的Anchors 位于左下角,如圖
5、然後編寫腳本實作相關邏輯,腳本包括:IUnityTouchVirtualJoyStickCallback,UnityTouchVirtualJoyStickWrapper,TestUnityTouchVirtualJoyStick
6、TestUnityTouchVirtualJoyStick 挂載到場景中,并對應指派
7、運作場景,效果如上
六、關鍵代碼
1、TestUnityTouchVirtualJoyStick
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace XANUtil {
public class TestUnityTouchVirtualJoyStick : MonoBehaviour,IUnityTouchVirtualJoyStickCallback
{
public Transform PlayerCubeTrans;
public Transform MainCameraTrans;
public RectTransform VJSBaseImageTrans;
public RectTransform VJSDirImageTrans;
private UnityTouchVirtualJoyStickWrapper mUnityTouchVirtualJoyStickWrapper = new UnityTouchVirtualJoyStickWrapper();
private const float SMOOTHSPEED = 5;
private Vector2 mVJSBasePos;
private Vector3 mOffsetCamera;
private const float SMOOTH_CAMERA_SPEED = 2.5f;
// Start is called before the first frame update
void Start()
{
Init();
}
// Update is called once per frame
void Update()
{
if (mUnityTouchVirtualJoyStickWrapper!=null)
{
mUnityTouchVirtualJoyStickWrapper.Update();
}
}
void Init() {
mUnityTouchVirtualJoyStickWrapper.Init(this);
SetVJSActive(false);
mOffsetCamera = MainCameraTrans.position - PlayerCubeTrans.position;
}
void SetVJSActive(bool isActive = true)
{
VJSBaseImageTrans.gameObject.SetActive(isActive);
VJSDirImageTrans.gameObject.SetActive(isActive);
}
void GameObjectRotateAndnMoveUpdate(Vector2 offset)
{
// 100 臨時調節值,根據需要自行調節即可
float length = offset.magnitude / 100;
// 旋轉注視
Quaternion qua = Quaternion.LookRotation(new Vector3(offset.normalized.x, 0, offset.normalized.y));
// 人物旋轉
PlayerCubeTrans.rotation = qua;
// 人物移動
PlayerCubeTrans.Translate(new Vector3(offset.normalized.x, 0, offset.normalized.y) * Time.deltaTime * SMOOTHSPEED * length, Space.World);
}
void CameraSmoothFollow(Transform targetTran)
{
//MainCameraTrans.position = Vector3.Lerp(MainCameraTrans.position, targetTran.position + mOffsetCamera, Time.deltaTime * SMOOTH_CAMERA_SPEED);
MainCameraTrans.position = targetTran.position + mOffsetCamera;
}
#region Interface
public void TouchDownPos(Vector2 pos) {
VJSBaseImageTrans.anchoredPosition = pos;
VJSBaseImageTrans.anchoredPosition = pos;
SetVJSActive();
mVJSBasePos = pos;
}
public void TouchDownMovePos(Vector2 pos) {
VJSDirImageTrans.anchoredPosition = pos;
GameObjectRotateAndnMoveUpdate(pos - mVJSBasePos);
CameraSmoothFollow(PlayerCubeTrans);
}
public void TouchDownMoveDeltraPos(Vector2 deltraPos) { }
public void TouchUp() {
SetVJSActive(false);
}
#endregion
}
}
2、UnityTouchVirtualJoyStickWrapper
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace XANUtil {
public class UnityTouchVirtualJoyStickWrapper
{
private Vector2 mOldPos;
private Vector2 mLstPos;
private IUnityTouchVirtualJoyStickCallback mCallback;
public void Init(IUnityTouchVirtualJoyStickCallback callback) {
mCallback = callback;
}
public void Update()
{
if (Input.GetMouseButtonDown(0))
{
mOldPos = Input.mousePosition;
mCallback?.TouchDownPos(mOldPos);
}
else if (Input.GetMouseButton(0))
{
mLstPos = Input.mousePosition;
Vector2 deltaPosition = (mLstPos - mOldPos);
mCallback?.TouchDownMovePos(mLstPos);
mCallback?.TouchDownMoveDeltraPos(deltaPosition);
}
else if (Input.GetMouseButtonUp(0))
{
mCallback?.TouchUp();
}
}
}
}
3、IUnityTouchVirtualJoyStickCallback
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace XANUtil
{
public interface IUnityTouchVirtualJoyStickCallback
{
void TouchDownPos(Vector2 pos);
void TouchDownMovePos(Vector2 pos);
void TouchDownMoveDeltraPos(Vector2 deltraPos);
void TouchUp();
}
}
七、附加:
後期有時間把,UGUI 上的對應 UnityTouchVirtualJoyStickWrapper 封裝實作,而不是現在的 Input.GetMouse相關事件,也非 EasyTouch插件,而是Unity UGUI 相關操作實作