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

相关推荐
广煜永不挂科27 分钟前
Devexpress.Dashboard的调用二义性
c#·express
/**书香门第*/38 分钟前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
初九之潜龙勿用2 小时前
C#校验画布签名图片是否为空白
开发语言·ui·c#·.net
九州ip动态4 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
吾与谁归in4 小时前
【C#设计模式(13)——代理模式(Proxy Pattern)】
设计模式·c#·代理模式
吾与谁归in4 小时前
【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】
设计模式·c#·责任链模式
神仙别闹5 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
向宇it14 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo15 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC16 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#