当前位置: 首页 > 编程笔记 >

Unity实现虚拟摇杆

颜修真
2023-03-14
本文向大家介绍Unity实现虚拟摇杆,包括了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实现手游虚拟摇杆,包括了unity实现手游虚拟摇杆的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了unity实现手游虚拟摇杆的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Unity实现简单虚拟摇杆,包括了Unity实现简单虚拟摇杆的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity虚拟摇杆的简单实现代码,供大家参考,具体内容如下 简单的Unity虚拟摇杆实现,有详细注释。 Game界面 Inspector界面 摇杆脚本 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍Android实现摇一摇功能,包括了Android实现摇一摇功能的使用技巧和注意事项,需要的朋友参考一下 实现“摇一摇”功能,其实很简单,就是检测手机的重力感应,具体实现代码如下: 1、在 AndroidManifest.xml 中添加操作权限 2、实现代码 这种摇一摇比较普通,没有经过算法的加强,重力加速度就是10。 算法优化如下 以上就是本文的全部内容,希望对大家的学习有所帮助,

  • 用于管理通过编排部署的虚拟机应用实例。 虚拟机实例用于管理基于应用市场部署的虚拟机应用。 入口:在云管平台单击左上角导航菜单,在弹出的左侧菜单栏中单击 “运维工具/编排/虚拟机实例” 菜单项,进入虚拟机实例页面。 新建虚拟机实例 该功能用于部署虚拟机实例。 在虚拟机实例页面,单击列表上方 “新建” 按钮,跳转到应用市场-虚拟机类型页面。 在应用市场页面部署应用,具体步骤请参考应用市场-部署虚拟机实

  • 本文向大家介绍Flask之pipenv虚拟环境的实现,包括了Flask之pipenv虚拟环境的实现的使用技巧和注意事项,需要的朋友参考一下 在 python 开发过程中,导入第三方库是最常见的操作,但是如果咋在本机自带 python 环境下安装第三方包。 就会造成库的冗余,比如某个项目只需要部分第三方库,但是其他项目又需要其他的第三方库。如此一来,在用 导出库依赖的时候,很可能会出现很多并不是本项

  • 本文向大家介绍Asp.Net Core 中的“虚拟目录”实现,包括了Asp.Net Core 中的“虚拟目录”实现的使用技巧和注意事项,需要的朋友参考一下 写在前面   现在部署Asp.Net Core应用已经不再限制于Windows的IIS上,更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的,IIS部署确实是又快又简单,图形化操作三下五除二就可以发布好一个系统了。在过去As