【问题标题】:NPC Moving through the wallsNPC 穿墙而过
【发布时间】:2020-05-12 04:56:10
【问题描述】:

我目前正在开发一款战术角色扮演游戏,并且我设置了墙以防止 NPC 移动到游戏区域之外。然而,NPC 正在穿墙而过。他有一个刚体,一个盒子对撞机附在他身上,他被触发了。此外,还标记了使用重力选项和运动学。墙壁有一个刚体和一个盒子对撞机。它们不会被触发。

我正在使用此代码来移动 NPC:

targetPosition.y = 1.4f;
targetPosition.x = this.transform.position.x + 3;
targetPosition.z = this.transform.position.z;
this.transform.position = Vector3.MoveTowards(transform.position, targetPosition, velocity);

我了解到这种移动方式可能会导致问题。对吗?

【问题讨论】:

  • 您可能想要使用某种导航系统并通过给它一个目标来移动您的 NPC,从而计算出路径然后跟随它。 This should help
  • 如果你在你的游戏对象上使用了刚体,那么你真的不应该接触transform.position,而将这一切交给刚体来处理。您可以使用Rigidbody.MovePositionRigidbody.velocity 告诉您的对象如何移动 :)
  • @MaxPlay 我不知道如何使用导航系统。我认为如果我知道如何使用它会容易得多。
  • @JackJohn 我给你的链接是 Unity 的官方文档,甚至还有该主题的教程链接。这应该足以学习如何使用它。不仅要阅读我给您的页面,还要阅读子页面和链接。
  • @MaxPlay 该链接很棒,它包含有关此主题的所有内容。我目前正在阅读它并试图找到一种可以在我的游戏中使用的方法。谢谢你。

标签: c# unity3d


【解决方案1】:

如果你有一个Rigidbody 附加到你的游戏对象,你应该使用它来移动它,而不是Transform,因为它是与物理引擎对话并负责同步位置的刚体。在这种情况下,适当的函数应该是Rigidbody.MovePosition

using UnityEngine;
using System.Collections;
using System.Collections.Generics;

public class NPC: MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private Rigidbody rigidbody;

    void FixedUpdate()
    {
        rigidbody.MovePosition(rb.position + new Vector3(3f, 0f, 0f) * speed * Time.fixedDeltaTime;
    }
}

由于我们使用物理来移动游戏对象,所以逻辑必须放在FixedUpdate

【讨论】:

  • 我已将这一行 this.transform.position = Vector3.MoveTowards(transform.position, targetPosition, velocity) 更改为 ``` myRigidbody.MovePosition(Vector3.MoveTowards(transform.position, targetPosition, velocity))``` NPC 仍然穿过墙壁。
  • 然后检查你的 Collider 和 Rigidbody 设置,记得使用Time.fixedDeltaTime 使移动速度帧率独立。
  • 乐于助人。
猜你喜欢
  • 2023-02-20
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多