这篇文章主要为大家详细介绍了Unity实现虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Unity实现虚拟摇杆的具体代码,供大家参考,具体内容如下
面板上设置一些属性,比如摇杆拖拽的距离,是否始终可视,是否限制虚拟摇杆位置(我是把虚拟摇杆限制在了屏幕的左下区域)。
使用GetDirAndLength()方法去获得移动的方向和长度即可
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;//内环
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();
}
}
/// <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);
//设置虚拟轴的位置
virtualJoystick.transform.position = virtualJoystickCenter;
}
/// <summary>
/// 更新内环位置
/// </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>
/// 屏幕坐标转世界坐标
/// </summary>
/// <param name="screenPos">屏幕坐标位置</param>
/// <param name="camera">相机</param>
/// <returns>转换后的世界坐标</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>
/// 得到运动的方向和长度
/// </summary>
/// <returns>方向和长度</returns>
public Vector3 GetDirAndLength()
{
return inside.transform.position - virtualJoystickCenter;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持得得之家。
沃梦达教程
本文标题为:Unity实现虚拟摇杆
猜你喜欢
- user32.dll 函数说明小结 2022-12-26
- .NET CORE DI 依赖注入 2023-09-27
- c# 模拟线性回归的示例 2023-03-14
- Unity Shader实现模糊效果 2023-04-27
- Unity3D实现渐变颜色效果 2023-01-16
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- 如何使用C# 捕获进程输出 2023-03-10
- Oracle中for循环的使用方法 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29