日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Unity实现虚拟摇杆的方法

發布時間:2023/12/15 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 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实现虚拟摇杆的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。