接触墙壁后角色无法移动

Character cannot move after touching a wall

我正在使用在线教程制作 pacman 克隆。我刚了解吃豆人的动作,当吃豆人碰到一堵墙时,他就不能再移动了。这是运动脚本

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

public class pacman : MonoBehaviour
{
public int speed;
Vector2 dest;
// Start is called before the first frame update
void Start()
{
    dest = transform.position;
    speed = 5;

}

// Update is called once per frame
void FixedUpdate()
{
    Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
    GetComponent<Rigidbody2D>().MovePosition(p);

    // Check for Input if not moving
    if ((Vector2)transform.position == dest)
    {
        if (Input.GetKey("w") )
            dest = (Vector2)transform.position + Vector2.up;
        if (Input.GetKey("d"))
            dest = (Vector2)transform.position + Vector2.right;
        if (Input.GetKey("s"))
            dest = (Vector2)transform.position - Vector2.up;
        if (Input.GetKey("a"))
            dest = (Vector2)transform.position - Vector2.right;
    }

}
}

您有几件事应该注意。

1) 您永远不会在代码中的任何地方重置 "dest"。当您根据设置为 "p" 的计算移动时。我想你的角色正在撞墙,它尽可能接近 "dest",因此它不能再靠近了。 我无法预测你想让你的游戏玩法变成什么样,但我想你会想在你的 OnCollision() 中重置 "dest" 以保持物体移动而不是盯着墙看。

作为一般性建议,我不会将 PacMac(玩家控制的单位)设置为前往目的地。您想要根据输入计算偏移量,然后尝试将其添加到 transform.position(通过 RigidBody 系统可能更安全),然后让模拟从那里接管。

2) 你在移动时没有参考游戏时间。您真的应该更改要计算的偏移量,同时考虑 Time.deltaTime 。当您 运行 在快速或慢速计算机上时,这很重要。 使用您当前的代码,您将在功能强大的计算机上移动得更快,而在慢速计算机上移动得更慢。

3) 根据您的 pacman 经验,您可能希望将这些更改为 else if 语句。更好,但更难,只接受最后的输入。这将防止您沿对角线移动(您当前的代码容易受到影响。如果您执行第二种方法,您将需要保留所有按下的按钮的堆栈,以防有人试图同时按住多个按钮。