【Unity2022】Unity实现手机游戏操控摇杆(实现操控轮盘)

news/2024/7/23 11:05:33 标签: unity, 游戏引擎, c#, 游戏

文章目录

  • 运行效果预览
  • 创建物体
  • 脚本
    • 获取RectTransform
    • 处理玩家拖动事件
    • 完整代码
  • 获取输入
  • 运行
  • 其他文章

运行效果预览

首先展示一下本文章实现的效果:
在这里插入图片描述

创建物体

创建两个UI图像,一个用于表示背景,作为父物体,命名为JoyStick,一个表示摇杆,命名为Center。
在这里插入图片描述
背景图像选择一个圆,最好加点半透明的属性,最终完成图如下图所示。
在这里插入图片描述

脚本

创建一个脚本,命名为Joystick,然后将脚本挂载到JoyStick物体上,我们将通过这个脚本来实现摇杆。

获取RectTransform

我们首先需要在Awake() 方法中,获取摇杆背景的 RectTransform 组件和手柄的RectTransfomr组件。

background = GetComponent<RectTransform>();
handle = transform.GetChild(0).GetComponent<RectTransform>(); // 摇杆手柄是背景的子元素

background 变量保存了背景的 RectTransform 组件,handle 变量保存了摇杆手柄的 RectTransform 组件。

处理玩家拖动事件

接下来,编写一个方法,用于处理拖动事件,代码如下所示。

public void OnDrag(PointerEventData eventData)
{
    Vector2 touchPosition = Vector2.zero;
    if (RectTransformUtility.ScreenPointToLocalPointInRectangle(background, eventData.position, eventData.pressEventCamera, out touchPosition))
    {
        // 获取触摸位置相对于摇杆背景的百分比
        touchPosition.x = (touchPosition.x / background.sizeDelta.x)*2;
        touchPosition.y = (touchPosition.y / background.sizeDelta.y)*2;
        touchPosition = (touchPosition.magnitude > 1f) ? touchPosition.normalized : touchPosition;
        
        // 更新摇杆手柄的位置
        handle.anchoredPosition = new Vector2(touchPosition.x * (background.sizeDelta.x / 2), touchPosition.y * (background.sizeDelta.y / 2));
        // 更新输入方向
        inputDirection = touchPosition;
    }
}

OnDrag(PointerEventData eventData) 方法用于处理拖动事件。在该方法中,首先通过 RectTransformUtility.ScreenPointToLocalPointInRectangle() 方法将触摸位置从屏幕坐标系转换为摇杆背景的本地坐标系。然后将触摸位置转换成相对于摇杆背景的百分比,这样摇杆手柄就能够根据触摸位置的百分比调整自己的位置。最后更新输入方向变量。

完整代码

using UnityEngine;
using UnityEngine.EventSystems;

public class Joystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler
{
    private RectTransform background; // 摇杆背景
    private RectTransform handle; // 摇杆手柄

    private Vector2 inputDirection; // 输入方向

    private void Awake()
    {
        background = GetComponent<RectTransform>();
        handle = transform.GetChild(0).GetComponent<RectTransform>(); // 摇杆手柄是背景的子元素
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 touchPosition = Vector2.zero;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(background, eventData.position, eventData.pressEventCamera, out touchPosition))
        {
            // 获取触摸位置相对于摇杆背景的百分比
            touchPosition.x = (touchPosition.x / background.sizeDelta.x)*2;
            touchPosition.y = (touchPosition.y / background.sizeDelta.y)*2;
            touchPosition = (touchPosition.magnitude > 1f) ? touchPosition.normalized : touchPosition;
            
            // 更新摇杆手柄的位置
            handle.anchoredPosition = new Vector2(touchPosition.x * (background.sizeDelta.x / 2), touchPosition.y * (background.sizeDelta.y / 2));
            // 更新输入方向
            inputDirection = touchPosition;
        }
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        OnDrag(eventData);
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        // 重置摇杆位置和输入方向
        handle.anchoredPosition = Vector2.zero;
        inputDirection = Vector2.zero;
    }

    // 返回输入方向
    public Vector2 GetInputDirection()
    {
        return inputDirection;
    }
}

获取输入

接下来就可以在其他所需获取输入的地方调用我们的GetInputDirection方法,来获取玩家的输入了,具体示例代码如下所示;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : Ball
{
    public Joystick joystick;
    // Start is called before the first frame update
    protected override void Start()
    {
        base.Start();
        GameObject canvas = GameObject.FindGameObjectWithTag("UI");
        joystick = canvas.transform.Find("Input/JoyStick").GetComponent<Joystick>();
    }
// Update is called once per frame
void Update()
    {
        Vector2 joystickInput=joystick.GetInputDirection();
        Move(new Vector3(joystickInput.x,joystickInput.y,transform.position.z));
        //Debug.Log(Weight);
    }
}

运行

运行程序,效果如下所示:
在这里插入图片描述

其他文章

Unity实现在两个物体之间连出一条线

Unity如何生成随机数


http://www.niftyadmin.cn/n/5065971.html

相关文章

C++基础语法(多态)

多态的学习是建立在继承之上的&#xff0c;如果你没有事先了解学习过继承&#xff0c;请去看看笔者写的关于继承的文章&#xff0c;对继承有概念之后&#xff0c;再来学习多态。多态的坑是相当的多&#xff0c;如果未来就业&#xff0c;公司对多态的考察也是让人直呼&#xff1…

C#停车场管理系统

目录 一、绪论1.1内容简介及意义1.2开发工具及技术介绍 二、总体设计2.1系统总体架构2.2登录模块总体设计2.3主界面模块总体设计2.4停车证管理模块总体设计2.5停车位管理模块总体设计2.6员工管理模块总体设计2.7其他模块总体设计 三、详细设计3.1登录模块设计3.2主界面模块设计…

linux内核分析:网络协议栈

从本质上来讲,所谓的建立连接,其实是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,并用这样的数据结构来保证面向连接的特性。TCP 无法左右中间的任何通路,也没有什么虚拟的连接,中间的通路根本意识不到两端使用了 TCP 还是 UDP。 所谓的连接…

使用win_b64做CATIA的开发测试

文章目录 一、把win_b64文件夹放在无中文的路径下二、启动环境文件编辑器三、新建环境文件四、集成CAA代码五、去用户环境目录查看环境文件是否生成六、关闭环境文件编辑器七、去桌面双击新建的快捷方式即可启动CATIA&#xff0c;进行测试八、进入对应的开发模块&#xff0c;查…

SLAM从入门到精通(python开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ROS下面&#xff0c;开发的方法很多&#xff0c;可以是c&#xff0c;可以是python。大部分接口操作类的应用&#xff0c;其实都可以用python来开…

抖音聊天对话模板,制作一条一条冒出来的聊天对话短视频

聊天对话模板是一种非常有趣且实用的工具&#xff0c;它主要用于制作抖音聊天记录一条一条冒出来的视频。有了聊天对话模板&#xff0c;你再也不需要费心去写剧本&#xff0c;只需输入一些简单的文案&#xff0c;就能自动生成搞笑对话视频。 聊天对话工具下载&#xff1a; htt…

力扣:119. 杨辉三角 II(Python3)

题目&#xff1a; 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09…

XML文档基础

什么是XML XML (eXtensible Markup Language&#xff0c;可扩展标记语言) 是一种用于存储和传输数据的文本文件格式。用户可以按照XML规则自定义标记&#xff0c;XML 的设计目标是传输数据&#xff0c;而不是显示数据&#xff0c;因此它是一种通用的标记语言&#xff0c;可用于…