我正在 Unity 中制作 2.5d 游戏。场景中的地面是用矩形图块地图制作的。地面本身在 Z 轴上处于同一水平面。有些标高是使用 OrderInLayer 和碰撞器实现的。事实上,场景中有3个标高(图中标有数字)。每个关卡都包含有碰撞器的区域(这样从下层您就无法踩到上层)和没有碰撞器的区域(例如,这样玩家就可以从岩石后面穿过)。当经过梯子(图中的L)时会发生关卡之间的过渡,梯子上有碰撞器,因此实体的orderInLayer和layer发生变化。在LayerCollisionMatrix中,所有内容都经过配置,以便实体不会与自己级别上的碰撞器交互,而是与其他级别上的碰撞器交互 我的图层碰撞蒙版 我的场景
我想添加会跟随玩家并避开障碍物的敌人。我该怎么做?通过使用导航网格?使用我自己的算法实现还是使用一些第三方库?我如何实现这个?
我尝试使用嵌入式 NavMesh 和 NavMeshPlus 插件。我创建了三个对象,每个对象上都有一个 NavMeshSurface,配置了包含的图层并烘焙它们。事实证明,NavMeshSurfaces 在楼梯上相交。自动地,敌人就会被困在楼梯上。内置的 NavMeshLink 没有帮助(我只是无法设置它的宽度)。所以我编写了自己的 NavMeshLink 实现。但这并没有多大帮助,因为敌人仍然宁愿被困在墙上而不是通过楼梯 敌人陷入困境 我的导航网格
我的导航网格链接:
public class ElevationEntry : MonoBehaviour
{
[SerializeField] private int newOrderInLayer;
[SerializeField] private int newLayer;
[SerializeField] private GameObject endPos;
private void OnTriggerEnter2D(Collider2D collision)
{
var stalkingMovement = collision.gameObject.GetComponent<StalkingMovement>();
if(stalkingMovement != null) stalkingMovement.SetObjectToGoToPosition(endPos.transform.position);
collision.gameObject.layer = newLayer;
collision.gameObject.GetComponent<SpriteRenderer>().sortingOrder = newOrderInLayer;
}
}
public void SetObjectToGoToPosition(Vector2 pos)
{
_navMeshAgent.enabled = false;
isMovingByAI = false;
moveToPos = pos;
}
private void MoveToPosition(Vector2 position)
{
var pos = Vector2.MoveTowards(transform.position, position, speed * Time.fixedDeltaTime);
_rigidbody2D.MovePosition(pos);
if(Vector2.Distance(transform.position, position) < 0.01)
{
_navMeshAgent.enabled = true;
isMovingByAI = true;
}
}
我尝试使用A*寻路项目。我创建了 3 个网格图并按层自定义它们。敌人不想只是在图表之间移动。内置的 Link 和 Link2 没有帮助。我没有写自己的 Link 实现,但我认为情况会类似于 NavMesh
我不是专家,但也许你可以使用导航网格,并创建一个名为目标的变量,让敌人跟随,当玩家进入另一个级别时,敌人的目标成为距离他们位置最近的楼梯,当他们到达并离开时到了玩家等级,他们的目标可以重新变成玩家吗? 由于您有多个级别,因此您可能需要跟踪玩家所在的级别以及敌人所在的级别。