Unity C#。如何将实例化的对象链接到寻路脚本,以及如何使游戏对象移动到节点列表?

时间:2018-11-23 14:05:55

标签: c# unity3d instantiation path-finding gameobject

我正在使用Unity和C#,而我对两者都还很陌生。

我有一个叫做Pathfinding的类附加到一个空的游戏对象上。它需要链接到开始游戏对象和结束游戏对象,并在最短路径中列出两者之间的节点列表。 (A *)。

我需要帮助的是:

  1. 如何从预制中实例化我的敌人游戏对象并将其链接到此脚本(通常是通过将游戏对象拖到编辑器中的相应图块上来完成)。

  2. 如何通过遵循寻路算法创建的列表来移动游戏对象(也许取列表中的第一个,然后移动并重新计算)?更多信息:我的电路板分为许多小立方体,算法使用这些立方体创建路径。存储路径(这些节点的列表)。我想要多个敌人

非常感谢。问我是否不清楚,我将尝试提供屏幕截图或信息。 :)

1 个答案:

答案 0 :(得分:1)

1。 实例化敌人并将其添加到列表中(位于您的脚本中):

using UnityEngine;

    public class Controller: MonoBehaviour
    {
        GameObject enemyPrefab;

        List<GameObject> enemiesList = new List<GameObject>();

        void Start()
        {
          GameObject enemy = Instantiate(enemiePrefab, transform.position, transform.rotation);
          enemiesList.Add(enemy);
        }
    }

2。 使对象在寻路中移动:

有很多方法可以做到这一点,但是我建议您将列表(数组)或其他任何类型的waypoints存储在列表,数组或其他任何内容中。 然后让敌人跟随一个接一个的航路点。

所以现在您的主脚本应如下所示:

using UnityEngine;

public class Controller : MonoBehaviour
{
    public GameObject enemyPrefab;

    private List<GameObject> enemiesList = new List<GameObject>();
    public List<GameObject> wayPoints = new List<GameObject>();

    void Start()
    {
      GameObject enemy = Instantiate(enemiePrefab, transform.position, transform.rotation);
      enemy.wayPoints = wayPoints;
      enemiesList.Add(enemy);
    }
}

您的敌人脚本应如下所示:

using UnityEngine;

    public class Enemy : MonoBehaviour
    {
       public List<GameObject> wayPoints = new List<GameObject>();

       public float speed;
       private Transform target;
       int waypointIndex = 0;

       private void Start()
       {
         target = List[waypointIndex].transform;
         waypointIndex++;
       }

        void Update()
        {
          // The step size is equal to speed times frame time.
          float step = speed * Time.deltaTime;

          // Move our position a step closer to the target.
          transform.position = Vector3.MoveTowards(transform.position, target.position, step);

          //If we arrive to the target, get the new target
          if(this.transform.position == target.position)
          {
            waypointIndex++;
            //if it is the last element, go to the first one again
            if(wayPointIndex > List.Count())
            {
              wayPointIndex = 0;
            }            
            target = List[waypointIndex].transform;      
          }              
        }
    }

请注意,您可以更改代码,以便控制器也可以移动每个敌人,但这取决于您!