我正在使用在线教程制作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;
}
}
}
答案 0 :(得分:1)
您需要注意几件事。
1)您永远不会在代码中的任何地方重置“目标”。当您基于将计算设置为“ p”进行移动时。我想你的角色正在撞墙,因为它尽可能接近“目标”,因此它无法靠近。 我无法预测您要如何使自己的游戏玩法成为现实,但是我可以想象您希望在OnCollision()中重置“目标”以保持对象移动而不是盯着墙。
作为一般建议,我不会将PacMac(由播放器控制的单元)设置为目的地。您想要基于输入来计算偏移,然后尝试将其添加到transform.position(通过RigidBody系统可能更安全),然后让仿真从那里接管。
2)您在移动时没有提及游戏时间。您应该真正更改偏移量,以考虑到Time.deltaTime进行计算。这对于在快速计算机或慢速计算机上运行时非常重要。 使用当前的代码,您可以在功能强大的计算机上更快地移动,而在速度较慢的计算机上速度更快。
3)基于您的pacman经验,您可能希望将其更改为else if语句。更好,但更难的是,仅接受最后一个输入。这将使您避免沿对角线方向移动(当前代码容易受到该干扰。如果执行第二种方法,则您将要保留一堆所有按钮,以防有人试图同时按下多个按钮。