Unity2D 模拟手柄实现玩家移动

news/2024/9/25 19:25:00

1,创建控制器UI

2,挂载脚本

3,脚本编写

  • 基本要素
[Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed = 1f;[Tooltip("玩家动画")]public Animator animator;public enum Mode {BUTTON,ROCKER,}[Tooltip("模式")]public Mode mode = Mode.ROCKER;
  • 模式切换---在Start()方法中根据mode的值,设置相关物体的Active
  • 基本移动逻辑
因为需要不断的更新移动(长按不松开),而Update方法每帧都在执行,所以在Update方法中执行移动操作。
void Update()
{doMove();
}
  • 具体移动逻辑
private void doMove()
{if (player == null) {return;}// 获取方向Vector2 dir = getDir();if (dir == Vector2.zero) return;Vector2 pos = player.position;// 10是随便设置的一个控制值,不然太慢pos.y += Time.deltaTime * speed * 10 * dir.y;pos.x += Time.deltaTime * speed * 10 * dir.x;player.MovePosition(pos);
}private Vector2 getDir()
{if (mode == Mode.BUTTON){if (curPointerObj == null) return Vector2.zero;switch(curPointerObj.name){case "Up":return Vector2.up;case "Down":return Vector2.down;case "Left":return Vector2.left;default:return Vector2.right;}}return rockerDir;
}

3.1,按钮模式实现

  • 基本逻辑
监听触摸事件,按下(IPointerDownHandler)为开始移动,抬起(IPointerUpHandler)为结束移动,实现按下按钮并松开的移动过程。
3.1.1,脚本
// 值为当前按下的按钮
private GameObject curPointerObj = null;
  • 按下
public void OnPointerDown(PointerEventData eventData)
{if (player == null || mode != Mode.BUTTON) {return;} GameObject pointerObj = eventData.pointerEnter;if (curPointerObj != null) {return;}curPointerObj = pointerObj;
}
  • 抬起
public void OnPointerUp(PointerEventData eventData)
{if (player == null || mode != Mode.BUTTON) {return;} GameObject pointerObj = eventData.pointerEnter;if (curPointerObj == null || curPointerObj != pointerObj) {return;}curPointerObj = null;
}

3.2,摇杆模式实现

  • 基本逻辑
监听拖拽事件,拖拽中(IEndDragHandler)为开始/移动中,拖拽结束(IDragHandler)为结束移动,实现拖拽并松开的移动过程。
3.1.1,脚本
// 摇杆内部可拖拽部分
private RectTransform rockerInnerTransform;
// 摇杆外部不可拖拽部分-边界
private RectTransform rockerOuterTransform;
// 当前摇杆方向
private Vector2 rockerDir = Vector2.zero;
  • 拖拽中
public void OnDrag(PointerEventData eventData)
{if (player == null || mode != Mode.ROCKER) return;Vector2 pos = Camera.main.ScreenToWorldPoint(eventData.position);Vector2 rockerOriginPosition = rockerOuterTransform.position;// 拖拽方向rockerDir = (pos - rockerOriginPosition).normalized;float distance = Vector2.Distance(pos, rockerOriginPosition);if (distance <= 1.5f) // 1.5f刚好是摇杆外部边界和摇杆内部可拖拽部分中心重合时的距离{rockerInnerTransform.position = pos;}else{Vector2 dir = pos - rockerOriginPosition;// 拖拽超过摇杆外部边界时,摇杆内部可拖拽的位置为:外部中心 + 当前拖拽方向指定的拖拽距离位置(此时设置为1.5f,到达边界)。rockerInnerTransform.position = rockerOriginPosition + dir.normalized * 1.5f;}
}
  • 拖拽结束
public void OnEndDrag(PointerEventData eventData)
{if (player == null || mode != Mode.ROCKER) return;// 恢复方向和位置rockerDir = Vector2.zero;rockerInnerTransform.position = rockerOuterTransform.position;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/30689.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【TransmittableThreadLocal】TransmittableThreadLocal的实现机制和原理

1 前言 前面我看过了 ThreadLocal的实现机制和原理 以及 InheritableThreadLocal的实现机制和原理 两种类型的 ThreadLocal,前者是普通的,后者是在前者的基础上套了一层父子线程关系,当使用后者的时候,会在线程创建的时候,浅拷贝一份父线程的变量值。那么今天空了,我来看…

自定义函数在LCD上显示一张不超过LCD像素大小的色深为 24bit的bmp图片

设计程序实现在LCD上任意位置显示一张任意大小的色深为 24bit的bmp图片,要求图像不失真可以在开发板的LCD上显示。 头文件包含 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #incl…

实验二 电子公文传输系统安全——读书笔记

《The.Security.Development.Lifecycle.CN.软件安全开发生命周期》 第一部分 对SDL的需求 隐私与安全: 隐私可以看作是遵守策略的一种方式,安全则看做是一种执行策略的方式。隐私问题的核心是符合监管部门的要求、公司策略和客户期望。关于安全还需要考虑的一个因素是与客户签…

多模态大模型 LLaVA 微调教程-大语言模型8

写完之后发现他好像不是很需要这个东西,所以就直接发在自己的博客好了。不投稿首页或者候选区应该本来也就不会有多少流量,所以应该不会干嘛的,大不了后面被说不让放网上以后就删掉这篇,嘻嘻。LLaVA 是最早出现的 Vision Language Model。本教程将教你微调 llava-v1.5-13b …

关押罪犯

S城现有两座监狱,一共关押着N名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示某两名罪犯之间的仇恨程度,怨气值越大,则这两名罪犯之间的积怨越多。如果两名怨…

csapp_实验_-__datalab

Datalab 前言该实验是《深入理解计算机系统》(英文缩写CSAPP)课程附带实验——Lab1:Data Lab,对应书中第二章内容(信息的表示和处理),是所有实验中的第一个实验,**实验目的 ** datalab实验提供了一个文件夹,我们的目的只是改写bits.c中的15个函数,使其完成相应的功能…

PXE高效网络装机与Kickstart无人值守安装

PXE高效网络装机与Kickstart无人值守安装 目录PXE高效网络装机与Kickstart无人值守安装一、PXE概述1、 PXE (Preboot eXcution Environment)的概念2、 PXE批量部署的优点3、部署PXE远程安装服务4、搭建PXE远程安装服务器二、 搭建PXE远程安装服务器的步骤1、安装软件2、配置DHC…

一名合格的程序猿修炼手册

一名合格的程序猿修炼手册📖 😄💯 Github 有个「清华大学计算机系课程攻略」的仓库。💻仓库地址 我看了下清华大学的计算机系课程表,我这里简单列一下跟计算机相关的课程,其实还有很多文化课、图形学、数字电路、高数等等。大一:C/C++语言;大二:Java语言、数据结构…