天天看點

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

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 這個也可以繼承一個接口,然後你要重寫新的方法,繼承同一個接口,接口友善擴充,這裡不再贅述

四、效果預覽

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

五、實作步驟

1、打開 Unity ,建立空工程

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

2、布置場景,如圖,一個控制體,一些障礙物,一虛拟按鈕UI

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

3、其中需要注意的是,PlayerCube 上添加 剛體

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

4、其中需要注意的是, 虛拟按鈕的Anchors 位于左下角,如圖

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

 5、然後編寫腳本實作相關邏輯,腳本包括:IUnityTouchVirtualJoyStickCallback,UnityTouchVirtualJoyStickWrapper,TestUnityTouchVirtualJoyStick

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

6、TestUnityTouchVirtualJoyStick 挂載到場景中,并對應指派

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

7、運作場景,效果如上

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉

六、關鍵代碼

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 相關操作實作

Unity 進階 之 簡單虛拟搖杆joystick的實作,并對應簡單控制物體移動和旋轉的整理Unity 進階 之 簡單虛拟搖杆的實作,并對應簡單控制物體移動和旋轉