跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Unity实现虚拟摇杆

本文实例为大家分享了Unity实现虚拟摇杆的具体代码,供大家参考,具体内容如下

面板上设置一些属性,比如摇杆拖拽的距离,是否始终可视,是否限制虚拟摇杆位置(我是把虚拟摇杆限制在了屏幕的左下区域)。

使用GetDirAndLength()方法去获得移动的方向和长度即可

using UnityEngine;

///

/// 虚拟摇杆管理器/// public class VirtualJoystickManager : MonoBehaviour{private static VirtualJoystickManager _instance;public static VirtualJoystickManager Instance{get{if (_instance == null){_instance = FindObjectOfType();}return _instance;}}

[Header("是否始终可视")]public bool alwaysVisible;//是否始终可视[Header("是否限制虚拟摇杆位置")]public bool restrictVirtualJoystickPos;//是否限制虚拟摇杆位置

[Header("虚拟摇杆物体")][Header("==========")]public GameObject virtualJoystick;//虚拟摇杆父物体public GameObject inside;//内环public GameObject outside;//外环

[Header("最大拖拽距离")][Header("==========")]public float maxDragLength;//最大拖拽距离

private Vector3 virtualJoystickCenter;//虚拟轴中心

private void Update(){//如果限制虚拟轴位置并且虚拟轴位置超出了限制范围则不进行任何操作if (restrictVirtualJoystickPos && JudgeIsValidRange() == false){return;}

//更新显示UpdateShow();

//更新虚拟摇杆位置if (Input.GetMouseButtonDown(0)){UpdateVirtualJoystickPos();}else if (Input.GetMouseButtonUp(0)){inside.transform.position = virtualJoystickCenter;}

//更新内环位置(限制拖拽范围) if (Input.GetMouseButton(0)){UpdateInsidePos();}}

///

/// 更新显示/// 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);}}}

///

/// 更新虚拟摇杆位置/// private void UpdateVirtualJoystickPos(){//得到虚拟轴的中心位置virtualJoystickCenter = ScreenToWorld(Input.mousePosition);

//设置虚拟轴的位置virtualJoystick.transform.position = virtualJoystickCenter;}

///

/// 更新内环位置/// 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;}}

///

/// 判断是否为有效的范围/// /// 是否为有效的范围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;}

///

/// 屏幕坐标转世界坐标/// /// 屏幕坐标位置/// 相机/// 转换后的世界坐标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;}

///

/// 得到运动的方向和长度/// /// 方向和长度public Vector3 GetDirAndLength(){return inside.transform.position - virtualJoystickCenter;}}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:Unity虚拟摇杆的实现方法unity实现虚拟摇杆控制Virtual Joystick unity实现手游虚拟摇杆Unity3D使用UGUI开发原生虚拟摇杆Unity实现简单虚拟摇杆unity实现手机端摇杆控制人物移动Unity实现虚拟摇杆效果Unity实现简单的虚拟摇杆Unity3D基于UGUI实现虚拟摇杆Unity实现简单虚拟摇杆Unity UGUI通过摇杆控制角色移动Unity使用ScrollRect制作摇杆

相关文章