首页 > 解决方案 > 角色触墙后无法移动

问题描述

我正在使用在线教程制作 pacman 克隆。我刚刚了解了 pacman 的运动,当 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;
    }

}
}

标签: c#unity3dgame-physicsphysicspacman

解决方案


你有几件事需要注意。

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

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

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

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


推荐阅读