【问题标题】:Character cannot move after touching a wall角色触墙后无法移动
【发布时间】:2019-06-01 03:05:36
【问题描述】:

我正在使用在线教程制作 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# unity3d game-physics physics pacman


    【解决方案1】:

    您有几件事需要注意。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多