unity2022版本 实现手机虚拟操作杆

简介

在许多移动游戏中,虚拟操纵杆是一个重要的用户界面元素,用于控制角色或物体的移动。本文将介绍如何在Unity中实现虚拟操纵杆,提供了一段用于移动控制的代码。我们将讨论不同类型的虚拟操纵杆,如固定和跟随,以及如何在实际游戏中使用这些操纵杆。

界面节点设置

1. 添加一个Canvas节点

首先,我们需要创建一个画布节点,这是我们整个界面的基础。这个节点将允许我们绘制和排列其他元素。

2. 在Canvas节点下添加一个Panel节点

接下来,我们将在Canvas节点下创建一个Panel节点。这个Panel节点将充当容器,用于组织和管理我们的界面元素。

3. 在Panel节点下添加两个Image节点

在Panel节点中,我们将添加两个Image节点。这两个Image节点具有不同的用途:

a. 背景节点:第一个Image节点将用作背景,为整个界面提供背景图像或颜色。

b. 操作按钮节点:第二个Image节点将用于显示操作按钮或其他交互元素。

4. 结构示意图:

你可以使用以下结构示意图来更清晰地展示节点的层次关系:

css 复制代码
UiCanvas (画布)
│
└─ Joystick (面板)
   │
   ├─ Bg(背景)
   │
   └─ Btn(操作按钮)

截图可以这样:

脚本编写

简要说明:

因为编写的是虚拟操作杆 需要添加三个事件:

触摸开始(Pointer Down),拖动(Drag),触摸结束(Pointer Up)

在触摸开始记录拖动的一些起始坐标。

在拖动中移动操作按钮节点如果是操作角色移动这里就可以操作移动角色

在触摸结束的时候重置坐标

  1. PointerDown方法:描述PointerDown方法,它处理当玩家触摸操纵杆时的行为。根据操纵杆类型(固定或跟随),它设置操纵杆的初始位置。

  2. Drag方法:详细解释Drag方法,这是当玩家拖动操纵杆时执行的代码。说明如何计算操纵杆输入的方向,以及如何限制操纵杆的移动范围。

  3. PointerUp方法:描述PointerUp方法,用于当玩家释放操纵杆时重置相关变量和位置,同时停止玩家的移动。

在初始化引用的时候可以传入参数(JoystickType)控制虚拟操作杆是固定的还是跟随触摸点的

完整的脚本如下:

cs 复制代码
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class MovementJoystick : MonoBehaviour
{
    // 枚举类型,用于指定操纵杆的类型
    public enum JoystickType
    {
        FIXED,    // 固定类型的操纵杆
        FOLLOW    // 跟随类型的操纵杆
    }

    // 对操纵杆和其背景对象的引用
    public GameObject joystick;  // 操纵杆对象
    public GameObject joystickBG;  // 操纵杆背景对象

    // 存储当前操纵杆的输入值作为一个二维向量
    public Vector2 joystickVec;

    // 指定操纵杆的类型(固定或跟随)
    public JoystickType joystickType = JoystickType.FIXED;

    // 触摸操纵杆时的位置
    private Vector2 joystickTouchPos;

    // 操纵杆背景的原始位置
    private Vector2 joystickOriginalPos;

    // 操纵杆背景的半径,根据屏幕宽度计算而来
    private float joystickRadius;

    // 初始化
    void Start()
    {
        // 初始化操纵杆背景的原始位置
        joystickOriginalPos = joystickBG.transform.position;

        // 根据屏幕宽度计算操纵杆背景的半径
        joystickRadius = joystickBG.GetComponent<RectTransform>().sizeDelta.y * Screen.width / 800 / 2;
    }

    // 当玩家按下操纵杆时调用
    public void PointerDown()
    {
        if (joystickType == JoystickType.FIXED)
        {
            // 对于固定操纵杆,将触摸位置设置为操纵杆背景的原始位置
            joystickTouchPos = joystickOriginalPos;
        }
        else if (joystickType == JoystickType.FOLLOW)
        {
            // 对于跟随操纵杆,将操纵杆及其背景设置为触摸位置
            joystick.transform.position = Input.mousePosition;
            joystickBG.transform.position = Input.mousePosition;
            joystickTouchPos = Input.mousePosition;
        }
    }

    // 当玩家拖动操纵杆时调用
    public void Drag(BaseEventData baseEventData)
    {
        // 将基本事件数据强制转换为PointerEventData
        PointerEventData pointerEventData = (PointerEventData)baseEventData;

        // 获取当前拖动位置
        Vector2 dragPos = pointerEventData.position;

        // 计算操纵杆输入的方向
        joystickVec = (dragPos - joystickTouchPos).normalized;

        // 计算当前位置与触摸位置之间的距离
        float joystickDist = Vector2.Distance(dragPos, joystickTouchPos);

        // 限制操纵杆在指定半径范围内移动
        if (joystickDist < joystickRadius)
        {
            joystick.transform.position = joystickTouchPos + joystickVec * joystickDist;
        }
        else
        {
            joystick.transform.position = joystickTouchPos + joystickVec * joystickRadius;
        }

        // 根据操纵杆输入设置玩家的移动方向
        // HHSJ.Main.instance.PlayerEx.GetComponent<HHSJ.Player>().moveDir = dragPos - joystickTouchPos;
    }

    // 当玩家释放操纵杆时调用
    public void PointerUp()
    {
        // 重置操纵杆输入和位置到初始值
        joystickVec = Vector2.zero;
        joystick.transform.position = joystickOriginalPos;
        joystickBG.transform.position = joystickOriginalPos;

        // 将玩家的移动方向重置为零
        // HHSJ.Main.instance.PlayerEx.GetComponent<HHSJ.Player>().moveDir = Vector3.zero;
    }

    // 可以在这里添加其他方法和FixedUpdate以实现特定功能
}

大致效果如下:

社交:

QQ群:859055710

相关推荐
码农君莫笑13 分钟前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
呆呆小雅1 小时前
C#关键字volatile
java·redis·c#
boligongzhu1 小时前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
web147862107231 小时前
C# .Net Web 路由相关配置
前端·c#·.net
windwind20001 小时前
游戏关卡设计方法的杂感
游戏·关卡设计
Jasmine_llq2 小时前
《 火星人 》
算法·青少年编程·c#
军训猫猫头4 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
异次元的归来11 小时前
Unity DOTS中的share component
unity·游戏引擎
向宇it14 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
白乐天_n15 小时前
腾讯游戏安全移动赛题Tencent2016A
安全·游戏