触摸墙壁后角色无法移动

时间:2019-01-06 00:35:55

标签: c# unity3d game-physics physics 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;
    }

}
}

1 个答案:

答案 0 :(得分:1)

您需要注意几件事。

1)您永远不会在代码中的任何地方重置“目标”。当您基于将计算设置为“ p”进行移动时。我想你的角色正在撞墙,因为它尽可能接近“目标”,因此它无法靠近。 我无法预测您要如何使自己的游戏玩法成为现实,但是我可以想象您希望在OnCollision()中重置“目标”以保持对象移动而不是盯着墙。

作为一般建议,我不会将PacMac(由播放器控制的单元)设置为目的地。您想要基于输入来计算偏移,然后尝试将其添加到transform.position(通过RigidBody系统可能更安全),然后让仿真从那里接管。

2)您在移动时没有提及游戏时间。您应该真正更改偏移量,以考虑到Time.deltaTime进行计算。这对于在快速计算机或慢速计算机上运行时非常重要。 使用当前的代码,您可以在功能强大的计算机上更快地移动,而在速度较慢的计算机上速度更快。

3)基于您的pacman经验,您可能希望将其更改为else if语句。更好,但更难的是,仅接受最后一个输入。这将使您避免沿对角线方向移动(当前代码容易受到该干扰。如果执行第二种方法,则您将要保留一堆所有按钮,以防有人试图同时按下多个按钮。