项目名称:类摇杆四向移动脚本
功能:
①如题模仿摇杆,锁定人物只能进行上下左右四个正方向的移动
②及时反馈,永远优先执行最后被按下的方向,当两个反方向的键位被按下时人物不会出现停止的情况
③按键记忆,记录按键按下的先后顺序,在多个按住的键个别抬起时会根据按下的先后逆序执行剩下的按键。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class RPGMoveD4Plus : MonoBehaviour
{
Rigidbody2D rBody;
List<int> inputList;//通过检测按键的按下抬起来增删元素来给执行内容排序,从最后被添加的指令开始倒序执行
List<Vector2> deVectors;//创建一个向量集来模拟摇杆功能,变量名展开就是defaultVector
Vector2 direction;//移动方向向量,用来接住执行内容的值
int keyNum;//按键按下后添加到执行内容List<int>里的数字,每个键不一样,适用0~3是方便调用List<Vector2>的indexof来获取当前执行内容的向量
void Start()//这里面就只进行一些获取对象之类的操作
{
direction = Vector2.zero;
rBody = GetComponent<Rigidbody2D>();
deVectors = new List<Vector2>()
{ Vector2.up, Vector2.down, Vector2.left, Vector2.right ,Vector2.zero};//给向量集添加元素,最后一个0向量即deVector2[4]无法通过按键输入得到。
inputList = new List<int>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.W)) inputList.Add(0);
if (Input.GetKeyDown(KeyCode.S)) inputList.Add(1);
if (Input.GetKeyDown(KeyCode.A)) inputList.Add(2);
if (Input.GetKeyDown(KeyCode.D)) inputList.Add(3);
//开始检测按键按键按下,并把对应的数字加入到执行队列中,数字和按键一定要和前面List<Vector2>里面的元素对齐,使用0~3是方便后面对indexof的调用
if (!Input.GetKey(KeyCode.W)) inputList.Remove(0);
if (!Input.GetKey(KeyCode.S)) inputList.Remove(1);
if (!Input.GetKey(KeyCode.A)) inputList.Remove(2);
if (!Input.GetKey(KeyCode.D)) inputList.Remove(3);
//这里是删除元素,当你松开一个按键的时候,它的执行内容也从这个队列中被剔除了(不用GetKeyUp是为了防止意外切出游戏,此时检测不到GetKeyUp,但能检测到!GetKey,前者会出现list中元素没有正确移除,人物朝着一个方向一直移动的bug,而后者不会!)
//运行检测和移动方法
SetKeyNum();
Move();
}
void SetKeyNum()
{
if (inputList.Count > 0)//先检查有没有需要执行的内容
{
keyNum = inputList[inputList.Count - 1];//拿走最后一位元素的值,拿去做序号
}
else keyNum = 4;//如果没有执行内容就赋值0向量
}
void Move()
{
direction = deVectors[keyNum];//代入序号值获取对应向量
rBody.velocity = direction * 2;//生成速度
}
}