欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity實(shí)現(xiàn)虛擬搖桿

 更新時(shí)間:2020年04月14日 10:42:23   作者:LLLLL__  
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)虛擬搖桿,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C#實(shí)現(xiàn)員工IC卡的讀寫(xiě)功能

    基于C#實(shí)現(xiàn)員工IC卡的讀寫(xiě)功能

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)讀寫(xiě)員工IC卡的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器的示例代碼

    C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器的示例代碼

    這篇文章主要介紹了C# Socket編程實(shí)現(xiàn)簡(jiǎn)單的局域網(wǎng)聊天器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C#微信開(kāi)發(fā)之自定義菜單管理

    C#微信開(kāi)發(fā)之自定義菜單管理

    本文主要介紹了C#微信開(kāi)發(fā)中自定義菜單管理的相關(guān)知識(shí),具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 判斷圖片-判斷位圖是否是黑白圖片的方法

    判斷圖片-判斷位圖是否是黑白圖片的方法

    近來(lái)工作需要判斷圖片否是是彩色的,由于是十萬(wàn)張以上的大批量理處,所以通過(guò)序程來(lái)動(dòng)自判斷。
    2013-05-05
  • WPF利用ValueConverter實(shí)現(xiàn)值轉(zhuǎn)換器

    WPF利用ValueConverter實(shí)現(xiàn)值轉(zhuǎn)換器

    值轉(zhuǎn)換器在WPF開(kāi)發(fā)中是非常常見(jiàn)的,值轉(zhuǎn)換器可以幫助我們很輕松地實(shí)現(xiàn),界面數(shù)據(jù)展示的問(wèn)題。本文將通過(guò)WPF?ValueConverter實(shí)現(xiàn)簡(jiǎn)單的值轉(zhuǎn)換器,希望對(duì)大家有所幫助
    2023-03-03
  • 用C#繪制九宮格形式的圖片

    用C#繪制九宮格形式的圖片

    大家好,本篇文章主要講的是用C#繪制九宮格形式的圖片,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01
  • Ruby創(chuàng)建數(shù)組方法總結(jié)

    Ruby創(chuàng)建數(shù)組方法總結(jié)

    在本篇文章里小編給大家分享了關(guān)于Ruby創(chuàng)建數(shù)組方法的知識(shí)點(diǎn)內(nèi)容,對(duì)戲有興趣的朋友們學(xué)習(xí)下。
    2019-01-01
  • C#中的multipart/form-data提交文件和參數(shù)

    C#中的multipart/form-data提交文件和參數(shù)

    這篇文章主要介紹了C#中的multipart/form-data提交文件和參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • unity實(shí)現(xiàn)無(wú)限列表功能

    unity實(shí)現(xiàn)無(wú)限列表功能

    這篇文章主要介紹了unity實(shí)現(xiàn)無(wú)限列表功能,水平方向,豎直方向滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法示例

    C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法示例

    這篇文章主要介紹了C#實(shí)現(xiàn)讓窗體獲得焦點(diǎn)的方法,涉及C#窗體事件相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06

最新評(píng)論