【问题标题】:Unity C#. How do I link instantiated objects to a pathfinding script and how do I make a gameobject move to a list of nodes?统一 C#。如何将实例化对象链接到寻路脚本以及如何使游戏对象移动到节点列表?
【发布时间】:2018-11-23 14:05:55
【问题描述】:

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

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

我需要帮助的是:

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

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

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

【问题讨论】:

    标签: c# unity3d instantiation path-finding gameobject


    【解决方案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;      
              }              
            }
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多