【发布时间】:2021-10-13 16:25:14
【问题描述】:
我正在使用 noobtuts 的教程创建一个吃豆人游戏。 https://noobtuts.com/unity/2d-pacman-game 但是我想让 pacman 能够自行移动。我的想法是让它选择一个随机的方向移动,如果它是一个有效的移动,它就会朝那个方向移动。我该怎么做?感谢任何答案!
这是 noobtuts 的代码,它通过用户输入移动 pacman。
Vector2 dest = Vector2.zero;
void Start()
{
dest = transform.position;
disabled = false;
}
void FixedUpdate()
{
// Move closer to Destination
Vector2 p = Vector2.MoveTowards(transform.position, dest, speed);
GetComponent<Rigidbody2D>().MovePosition(p);
// Check for Input if not moving
if ((Vector2)transform.position == dest && !disabled)
{
if (DirectionEmulator.direction == "up" && valid(Vector2.up))
dest = (Vector2)transform.position + Vector2.up;
if (DirectionEmulator.direction == "right" && valid(Vector2.right))
dest = (Vector2)transform.position + Vector2.right;
if (DirectionEmulator.direction == "down" && valid(-Vector2.up))
dest = (Vector2)transform.position - Vector2.up;
if (DirectionEmulator.direction == "left" && valid(-Vector2.right))
dest = (Vector2)transform.position - Vector2.right;
}
// Animation Parameters
Vector2 dir = dest - (Vector2)transform.position;
GetComponent<Animator>().SetFloat("DirX", dir.x);
GetComponent<Animator>().SetFloat("DirY", dir.y);
}
bool valid(Vector2 dir)
{
// Cast Line from 'next to Pac-Man' to 'Pac-Man'
Vector2 pos = transform.position;
RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
return (hit.collider == GetComponent<Collider2D>());
}
【问题讨论】:
-
使用
Random类并将对用户输入的调用替换为对随机调用的调用。 -
我尝试过这样做(从逻辑上讲它应该可以工作),但是 pacman 不会移动。是不是我对 Vector2 的工作原理有什么误解?
-
您希望您的 Pacman 何时改变方向?如果你在每次更新时都这样做,它可能只会导致吃豆人每帧快速切换方向而无处可去。只在他到达十字路口时改变方向会更有意义。
-
@BenM 我没想到这会让吃豆人卡住...也许应该先选择一个随机的有效方向,然后当方向不再有效时,方向会改变?
-
@Naomikho - 这可能行得通,但它可能不像你想要的那样随机,因为他永远不会在 4 路交叉口(或他可以的 3 路交叉口)改变方向直接往前走)。但它可能很容易实现,所以在做任何更复杂的事情之前,确保你走在正确的轨道上是值得的。