【问题标题】:Enemy Pathfinding through WayPoints with Unity使用 Unity 通过 WayPoints 寻找敌人路径
【发布时间】:2021-03-07 12:18:51
【问题描述】:

所以我希望我的敌人移动到一个航点然后增加一个列表以便它可以移动到下一个航点,但不知何故我的敌人移动到第一个航点然后卡在这个位置。 遮阳篷将是一个梦想! 这是我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyPathing : MonoBehaviour
{
[SerializeField] List<Transform> waypoints;
[SerializeField] float moveSpeed = 2f;
int waypointIndex = 0;

// Start 
void Start()
{
    transform.position = waypoints[waypointIndex].transform.position;
}

// Update 
void Update()
{
    Move();
}

private void Move()
{
    if (waypointIndex <= waypoints.Count - 1)
    {
        var targetPosition = waypoints[waypointIndex].transform.position;
        var movementThisFrame = moveSpeed * Time.deltaTime;
        transform.position = Vector2.MoveTowards
            (transform.position, targetPosition, movementThisFrame);

        if (transform.position == targetPosition)
        {
            waypointIndex++;
        }
    }
    else
    {
        Destroy(gameObject);
    }
}

}

顺便说一句。在控制台 Unity 中说:Assets\Scripts\EnemyPathing.cs(7,38):warning CS0649: Field 'EnemyPathing.waypoints' is never assigned to and will always have its default value null

【问题讨论】:

  • 作为航点列表,我设置了 3 个空游戏对象,称为:“航点 (0)、航点 (1)、航点 (2)”,每个我都放置在不同的位置
  • 请使用正确的标签...unityscript 是或更好曾经是一种 JavaScript 风格,类似于早期 Unity 版本中使用的自定义语言,现在早已弃用...你的代码显然是c#

标签: c# visual-studio unity3d path-finding


【解决方案1】:

啊,自动类型转换,我的宿敌。

这里有一些代码需要考虑:

var v2 = new Vector2(21, 22);
var v3 = new Vector3(31, 32, 33);
v3 = v2;
print(v3.z);

上面的代码没有像你想象的那样打印出33。它打印出0。原因是第三行实际上是两个操作:从Vector2Vector3 的隐式类型转换,以及then 赋值。当您从较小的向量转换为较大的向量时,额外的组件将获得默认值0

所以当你这样做时:

transform.position = Vector2.MoveTowards
    (transform.position, targetPosition, movementThisFrame);

.. 你实际上是在悄悄地将transform.position.z 设置为0。这通常会很好,除了:

if (transform.position == targetPosition)

.. 如果 targetPosition.z 不是 0,这永远不会是真的,你永远不会超过第一个航路点。

这是让您的代码按照您的意愿执行的最简单的解决方案:

if ((Vector2)transform.position == (Vector2)targetPosition)

这将确保只有 xy 会被比较。

但是,请注意您的 transform.position.z 仍设置为 0,因此您可能需要对此做点什么。这是一个非常肮脏的解决方案:

var temp = transform.position.z;
transform.position = Vector2.MoveTowards
    (transform.position, targetPosition, movementThisFrame);
transform.position.z = temp;

【讨论】:

  • 感谢您帮助我。但是我自己让它工作我只需要将 if (transform.position == targetPosition) 更改为 if (Vector2.Distance(transform.position, targetPosition)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多