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

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

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

unity实现手游虚拟摇杆

2022-09-01 11:21玉骨寒 C#

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

本文实例为大家分享了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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 绑定到摇杆上的摇杆类,参考半径50
/// </summary>
public class Rocker : MonoBehaviour {
 
  Vector2 m_offet;//偏移向量
  Vector2 m_originalPos;//摇杆原始屏幕坐标
  Touch[] touches;//屏幕上触控点数组
  int touch_Id = -1;//触控点数组下标
  bool isMove = false;//是否移动
  float m_ScreenScale;
  /// <summary>
  /// 给外部调用的偏移向量,告知摇杆参数
  /// </summary>
  public Vector3 Offet
  {
    get
    {
      return m_offet;
    }
  }
 
  // Use this for initialization
  void Start () {
 
    m_originalPos = transform.position;//摇杆中心的屏幕坐标位置
    m_ScreenScale = Screen.width / 800f;
  }
 
  // Update is called once per frame
  void Update () {
    //得到屏幕触控数组
    touches = Input.touches;
    if (touches.Length > 0)//如果触点开启
    {
      //得到离摇杆中心最近的触点下标 touch_Id;
      if (touches.Length == 1)//只有一个触点时
      {
        touch_Id = 0;
      }
      else if (touches.Length > 1)//触点大于1个时
      {
        touch_Id = 0;//先假设下标为0
        for (int i = 1; i < touches.Length; i++)//遍历触点数组
        {
          if (Vector2.SqrMagnitude(touches[i].position - m_originalPos) < Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos))//第i个点比假设的点近
          {
            touch_Id = i;//假设的点改为第i个点
          }
        }
 
      }
 
      //如果得到的触点不是取消或抬起
      if (Input.GetTouch(touch_Id).phase != TouchPhase.Canceled && Input.GetTouch(touch_Id).phase != TouchPhase.Ended)
      {
        //触点在摇杆范围内
        if(Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos) <= 50*50 * m_ScreenScale * m_ScreenScale)//50为背景半径
        {
          isMove = true;//开启遥控
          //摇杆开始控制,计算偏移量
          SetOffetIn();
        }
        else if(isMove)//触点在摇杆范围外,但是遥控已经开启
        {
          SetOffetOut();
        }
      }
      else// 手指抬起,摇杆回归原始位置
      {
        transform.position = m_originalPos;
        m_offet = Vector2.zero;
        isMove = false;
        touch_Id = -1;
      }
    }
 
  }
  /// <summary>
  /// 触点在操作盘内时
  /// 摇杆控制方法
  /// </summary>
  void SetOffetIn()
  {
    //距离过小视为不偏移摇杆位置不变
    if(Vector2.SqrMagnitude(touches[touch_Id].position - m_originalPos) < 5 * m_ScreenScale)
    {
      GetComponent<Image>().rectTransform.position = m_originalPos;//摇杆定位在原始位置
      m_offet = Vector3.zero;
    }
    else
    {
      //摇杆位置追踪
      GetComponent<Image>().rectTransform.position = touches[touch_Id].position;
      m_offet = touches[touch_Id].position - m_originalPos;//赋值偏移值
      m_offet = m_offet.normalized;//归一化
    }
  }
  /// <summary>
  /// 触点在操作盘外时
  /// 摇杆控制方法
  /// </summary>
  void SetOffetOut()
  {
    Vector2 tempDir;//临时偏移向量
    tempDir = touches[touch_Id].position - m_originalPos;
    //更新摇杆位置:距离原始位置127各单位
    GetComponent<Image>().rectTransform.position = m_originalPos + (tempDir.normalized) * 25*m_ScreenScale;
    //偏移量
    m_offet = tempDir.normalized;//归一化
  }
  private void OnGUI()
  {
    GUIStyle style = new GUIStyle(); //实例化一个新的GUIStyle,名称为style ,后期使用
    style.fontSize = 50; //字体的大小设置数值越大,字越大,默认颜色为黑色
    style.normal.textColor = new Color(1, 1, 1); //设置文本的颜色为 新的颜色(0,0,0)修改值-代表不同的颜色,值为整数 我个人觉得有点像RGB的感觉
    GUI.Label(new Rect(20, 30, 300, 60), "原始位置:" + m_originalPos.ToString(),style);
    GUI.Label(new Rect(20, 100, 300, 60), "摇杆位置:" + GetComponent<Image>().rectTransform.position.ToString(), style);
    GUI.Label(new Rect(20, 170, 300, 60), "触点位置:" + touches[touch_Id].position.ToString(), style);
    GUI.Label(new Rect(20, 240, 300, 60), "屏幕分辨率:" + Screen.currentResolution, style);
 
 
  }
}

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

原文链接:https://blog.csdn.net/yanggenye/article/details/73087773

延伸 · 阅读

精彩推荐
  • C#C#深度优先遍历实现全排列

    C#深度优先遍历实现全排列

    这篇文章主要介绍了C#深度优先遍历实现全排列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    Leaderxin5232022-08-10
  • C#WPF的ListView控件自定义布局用法实例

    WPF的ListView控件自定义布局用法实例

    这篇文章主要介绍了WPF的ListView控件自定义布局的方法,结合实例形式分析了WPF中ListView控件的布局方法,需要的朋友可以参考下...

    kagula9972021-11-30
  • C#详解c# AutoMapper 使用方式

    详解c# AutoMapper 使用方式

    本篇文章主要介绍了详解c# AutoMapper 使用方式 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    大稳·杨4232022-02-13
  • C#C#事件(event)使用方法详解

    C#事件(event)使用方法详解

    本文给大家介绍了在C#中,事件(event)的概念和使用方法,文章适合一些初学者学习,主要讲解了一些概念和一些代码案例。...

    uml10032022-02-19
  • C#深入理解C#中的Delegate

    深入理解C#中的Delegate

    委托是一种安全地封装方法的类型,它与 C 和 C++ 中的函数指针类似。与 C 中的函数指针不同,委托是面向对象的、类型安全的和保险的。委托的类型由委...

    ShirlySaku6552021-12-01
  • C#C#中ZipHelper 压缩和解压帮助类

    C#中ZipHelper 压缩和解压帮助类

    本文介绍C#实现压缩与解压缩帮助类ZipHelper,主要是通过ICSharpCode.SharpZipLib 类库实现的。...

    杨恒连5182021-11-21
  • C#c#读取XML多级子节点

    c#读取XML多级子节点

    本文主要介绍了c#读取XML多级子节点的方法。具有很好的参考价值。下面跟着小编一起来看下吧...

    gl博越11772021-12-30
  • C#C#实现在启动目录创建快捷方式的方法

    C#实现在启动目录创建快捷方式的方法

    这篇文章主要介绍了C#实现在启动目录创建快捷方式的方法,涉及C#快捷方式的创建技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧7842021-10-25