如何解决按下或点击按钮时如何使角色移动一定距离
所以我现在正在开发 2D 游戏,只是为了学习与制作 2D 游戏相关的不同内容或代码。 所以我遇到了一个麻烦,我对如何让角色移动一定距离感到好奇,比如每次点击按钮移动 1 个方块。我将在这里举一个例子。所以把网格想象成一块土地。
移动一定距离。
这是我的角色使用我当前的代码
这是我的运动代码using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class keycontrol : MonoBehaviour
{
private float moveSpeed;
private Rigidbody2D rb2d;
private Vector2 change;
private Animator animator;
bool isXMoving;
bool isYMoving;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
void Update()
{
change.x = Input.GetAxisRaw("Horizontal");
change.y = Input.GetAxisRaw("Vertical");
if (Mathf.Abs(change.x) > Mathf.Abs(change.y))
{
change.y = 0;
}
else
{
change.x = 0;
}
animator.SetFloat("walk_right",change.x);
animator.SetFloat("walk_left",-change.x);
animator.SetFloat("walk_down",-change.y);
animator.SetFloat("walk_up",change.y);
}
void FixedUpdate()
{
rb2d.MovePosition(rb2d.position + change * moveSpeed * Time.fixedDeltaTime);
if(Input.GetKey("left shift"))
{
moveSpeed = 150;
animator.speed = 1.5f;
}
else
{
moveSpeed = 70;
animator.speed = 1f;
}
}
}
非常感谢您的帮助
解决方法
我认为问题只是你的移动速度。您将速度与 Time.fixedDeltaTime
相乘,但这不是必需的,因为该值将是恒定的。相反,尝试将速度设置为 1 并删除 Time.fixedDeltaTime
。
注意:Time.deltaTime
用于使角色每帧移动一定量,因为帧之间的时间越短,角色移动的越少。 Time.fixedDeltaTime
保持不变,因为它是每个物理帧之间的时间。
如果我理解正确,它不断移动的原因是因为输入保持大于零。您可以添加一个变量来检查按键是否已经按下以停止移动。
我认为这里有两种选择,
- 让用户每次点击然后想要移动(按键、抬起手指、按键等)
- 添加一个计时器,让它每 N 秒移动一次
对于 (1),我们可以添加一个变量来表示我们已经在移动。
//Changes IsXMoving and IsYMoving to a single boolean
bool isMoving = false;
///Start,Update,etc
void FixedUpdate()
{
//Check if we are already moving - if we are not,update movement
if (!isMoving)
{
rb2d.MovePosition(rb2d.position + change * moveSpeed * Time.fixedDeltaTime);
if(Input.GetKey("left shift"))
{
moveSpeed = 150;
animator.speed = 1.5f;
}
else
{
moveSpeed = 70;
animator.speed = 1f;
}
}
//Check we are moving by getting the magnitude - if it zero,we are still
isMoving = (change.magnitude != 0);
}
第二个选项 (2) 基本上会用一个基本的计时器代替它。
//Removed IsXMoving and IsYMoving
//lastMove will store the time we last allowed movement and delay is
//the minimum time between movements in seconds
float lastMove;
float delay = 1; //1 second
void FixedUpdate()
{
//Check if enough time has passed to be allowed to move
if (lastMove + delay < Time.time)
{
rb2d.MovePosition(rb2d.position + change * moveSpeed * Time.fixedDeltaTime);
if(Input.GetKey("left shift"))
{
moveSpeed = 150;
animator.speed = 1.5f;
}
else
{
moveSpeed = 70;
animator.speed = 1f;
}
//Only update the time if we are moving
if (change.magnitude > 0)
lastMove = Time.time;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。