Unity實(shí)現(xiàn)虛擬搖桿
本文實(shí)例為大家分享了Unity實(shí)現(xiàn)虛擬搖桿的具體代碼,供大家參考,具體內(nèi)容如下

面板上設(shè)置一些屬性,比如搖桿拖拽的距離,是否始終可視,是否限制虛擬搖桿位置(我是把虛擬搖桿限制在了屏幕的左下區(qū)域)。
使用GetDirAndLength()方法去獲得移動(dòng)的方向和長(zhǎng)度即可

using UnityEngine;
/// <summary>
/// 虛擬搖桿管理器
/// </summary>
public class VirtualJoystickManager : MonoBehaviour
{
private static VirtualJoystickManager _instance;
public static VirtualJoystickManager Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<VirtualJoystickManager>();
}
return _instance;
}
}
[Header("是否始終可視")]
public bool alwaysVisible;//是否始終可視
[Header("是否限制虛擬搖桿位置")]
public bool restrictVirtualJoystickPos;//是否限制虛擬搖桿位置
[Header("虛擬搖桿物體")]
[Header("==========")]
public GameObject virtualJoystick;//虛擬搖桿父物體
public GameObject inside;//內(nèi)環(huán)
public GameObject outside;//外環(huán)
[Header("最大拖拽距離")]
[Header("==========")]
public float maxDragLength;//最大拖拽距離
private Vector3 virtualJoystickCenter;//虛擬軸中心
private void Update()
{
//如果限制虛擬軸位置并且虛擬軸位置超出了限制范圍則不進(jìn)行任何操作
if (restrictVirtualJoystickPos && JudgeIsValidRange() == false)
{
return;
}
//更新顯示
UpdateShow();
//更新虛擬搖桿位置
if (Input.GetMouseButtonDown(0))
{
UpdateVirtualJoystickPos();
}
else if (Input.GetMouseButtonUp(0))
{
inside.transform.position = virtualJoystickCenter;
}
//更新內(nèi)環(huán)位置(限制拖拽范圍)
if (Input.GetMouseButton(0))
{
UpdateInsidePos();
}
}
/// <summary>
/// 更新顯示
/// </summary>
private void UpdateShow()
{
if (alwaysVisible)
{
inside.SetActive(true);
outside.SetActive(true);
}
else if (alwaysVisible == false)
{
if (Input.GetMouseButtonDown(0))
{
inside.SetActive(true);
outside.SetActive(true);
}
if (Input.GetMouseButtonUp(0))
{
inside.SetActive(false);
outside.SetActive(false);
}
}
}
/// <summary>
/// 更新虛擬搖桿位置
/// </summary>
private void UpdateVirtualJoystickPos()
{
//得到虛擬軸的中心位置
virtualJoystickCenter = ScreenToWorld(Input.mousePosition);
//設(shè)置虛擬軸的位置
virtualJoystick.transform.position = virtualJoystickCenter;
}
/// <summary>
/// 更新內(nèi)環(huán)位置
/// </summary>
private void UpdateInsidePos()
{
inside.transform.position = ScreenToWorld(Input.mousePosition);
if (Vector3.Distance(inside.transform.position, virtualJoystickCenter) > maxDragLength)
{
Vector3 normalizedPos = (inside.transform.position - virtualJoystickCenter).normalized;
inside.transform.position = normalizedPos * maxDragLength + virtualJoystickCenter;
}
}
/// <summary>
/// 判斷是否為有效的范圍
/// </summary>
/// <returns>是否為有效的范圍</returns>
private bool JudgeIsValidRange()
{
if (inside.activeInHierarchy)
{
return true;
}
Vector2 v = Input.mousePosition;
if (v.x > Screen.width / 2 || v.x < 0)
{
return false;
}
else if (v.y > Screen.height / 2 || v.y < 0)
{
return false;
}
return true;
}
/// <summary>
/// 屏幕坐標(biāo)轉(zhuǎn)世界坐標(biāo)
/// </summary>
/// <param name="screenPos">屏幕坐標(biāo)位置</param>
/// <param name="camera">相機(jī)</param>
/// <returns>轉(zhuǎn)換后的世界坐標(biāo)</returns>
public static Vector3 ScreenToWorld(Vector3 screenPos, Camera camera = null)
{
if (camera == null)
{
camera = Camera.main;
}
Vector3 _screenPos = new Vector3(screenPos.x, screenPos.y, -camera.transform.position.z);
Vector3 v = camera.ScreenToWorldPoint(_screenPos);
return v;
}
/// <summary>
/// 得到運(yùn)動(dòng)的方向和長(zhǎng)度
/// </summary>
/// <returns>方向和長(zhǎng)度</returns>
public Vector3 GetDirAndLength()
{
return inside.transform.position - virtualJoystickCenter;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Unity虛擬搖桿的實(shí)現(xiàn)方法
- unity實(shí)現(xiàn)虛擬搖桿控制Virtual Joystick
- unity實(shí)現(xiàn)手游虛擬搖桿
- Unity3D使用UGUI開發(fā)原生虛擬搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
- unity實(shí)現(xiàn)手機(jī)端搖桿控制人物移動(dòng)
- Unity實(shí)現(xiàn)虛擬搖桿效果
- Unity實(shí)現(xiàn)簡(jiǎn)單的虛擬搖桿
- Unity3D基于UGUI實(shí)現(xiàn)虛擬搖桿
- Unity實(shí)現(xiàn)簡(jiǎn)單虛擬搖桿
- Unity UGUI通過搖桿控制角色移動(dòng)
- Unity使用ScrollRect制作搖桿
相關(guān)文章
C#判斷字符串是否存在字母及字符串中字符的替換實(shí)例
這篇文章主要介紹了C#判斷字符串是否存在字母及字符串中字符的替換,實(shí)例形式講述了C#針對(duì)字符串的正則操作,需要的朋友可以參考下2014-10-10
Unity 使用TexturePacker打包圖集的操作方法
這篇文章主要介紹了Unity 使用TexturePacker打包圖集的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法
這篇文章主要介紹了C#中實(shí)現(xiàn)抽象類里建立靜態(tài)方法,需要的朋友可以參考下2014-07-07
利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù)
這篇文章主要為大家詳細(xì)介紹了利用AOP實(shí)現(xiàn)SqlSugar自動(dòng)事務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

