u2d人物四向移动优化脚本(轻量版)

该脚本创建了一个类摇杆的四向移动系统,用于游戏中的角色控制。它确保角色只能沿上下左右四个正方向移动,优先执行最后按下的方向,并记住按键顺序,在多键同时按住时按顺序执行。此外,脚本使用Rigidbody2D组件处理移动,通过监听键盘输入(WASD)来更新移动方向。
摘要由CSDN通过智能技术生成

项目名称:类摇杆四向移动脚本

功能:

①如题模仿摇杆,锁定人物只能进行上下左右四个正方向的移动

②及时反馈,永远优先执行最后被按下的方向,当两个反方向的键位被按下时人物不会出现停止的情况

③按键记忆,记录按键按下的先后顺序,在多个按住的键个别抬起时会根据按下的先后逆序执行剩下的按键。

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;//生成速度

    }

}

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值