服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - Unity实现虚拟摇杆

Unity实现虚拟摇杆

2022-08-31 16:02LLLLL__ C#

这篇文章主要为大家详细介绍了Unity实现虚拟摇杆,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

Unity实现虚拟摇杆

面板上设置一些属性,比如摇杆拖拽的距离,是否始终可视,是否限制虚拟摇杆位置(我是把虚拟摇杆限制在了屏幕的左下区域)。
使用GetDirAndLength()方法去获得移动的方向和长度即可

Unity实现虚拟摇杆

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/LLLLL__/article/details/105485460

延伸 · 阅读

精彩推荐
  • C#C#获取网页源代码的方法

    C#获取网页源代码的方法

    这篇文章主要介绍了C#获取网页源代码的方法,涉及C#基于自定义函数读取网页html代码的方法,具有一定参考借鉴价值,需要的朋友可以参考下...

    C#教程网9592021-10-26
  • C#C#向线程中传递多个参数的解决方法(两种)

    C#向线程中传递多个参数的解决方法(两种)

    这篇文章主要介绍了C#向线程中传递多个参数的解决方法(两种)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...

    C#教程网10262021-12-02
  • C#C# SQlite操作方法小结

    C# SQlite操作方法小结

    这篇文章主要介绍了C# SQlite操作方法,较为详细的讲述了SQLite的下载与C#针对SQLite的连接、创建、与执行SQL语句等操作相关技巧,需要的朋友可以参考下...

    雪岢奇8272021-11-30
  • C#C#中Hash table的一些操作方法讲解

    C#中Hash table的一些操作方法讲解

    今天小编就为大家分享一篇关于C#中Hash table的一些操作方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    chenqiangdage8602022-03-08
  • C#c# linq的差集,并集,交集,去重代码(分享)

    c# linq的差集,并集,交集,去重代码(分享)

    下面小编就为大家分享一篇c# linq的差集,并集,交集,去重代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    凤小九6882022-02-12
  • C#90分钟实现一门编程语言(极简解释器教程)

    90分钟实现一门编程语言(极简解释器教程)

    本文介绍了如何使用 C# 实现一个简化 Scheme——iScheme 及其解释器,需要的朋友可以参考下...

    C#教程网7722021-12-11
  • C#C#操作RabbitMQ的完整实例

    C#操作RabbitMQ的完整实例

    这篇文章主要为大家详细介绍了C#操作RabbitMQ的完整实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    YSWALLE10482022-01-20
  • C#C#读写指定编码格式的文本文件

    C#读写指定编码格式的文本文件

    这篇文章主要为大家详细介绍了C#读写指定编码格式文本文件的方法,感兴趣的小伙伴们可以参考一下...

    吴超10842021-11-15