Transform[] Array - fill it from another Script
Hello! I got two Scripts: 1 Enemy_mob script, with the Array on it, to search for new enemies on the fixed Update(). My Goal is to fill the enemy Array in the Start () of Script 2:
     public Transform[] monsterArray;
     private PlayerScript opponent;
 private Transform player;
     void Start () {
         player = GameObject.FindWithTag ("Player").transform;
         opponent = player.GetComponent<PlayerScript>();
     }
 
     void Update () {
 
         atktime += Time.deltaTime;
         if (player != null) {
             if (!isDead ()) {
                 if (!inRange ()) {
                     chase ();
                 } else {
                     attack ();
                 }
                 //    transformArray = GameObject.FindGameObjectsWithTag ("Player").Select (go => go.transform).ToArray ();
             } else {
                 dieMethod ();
             }
 
         } else {
             if (!newTarget ())
                 {
                 //player = GetNewTarget ();
                 player = GetClosestEnemy (monsterArray);
                 }
         }
 
     }
 
     Transform GetClosestEnemy(Transform[] enemies)
     {
         Transform bestTarget = null;
         float closestDistanceSqr = Mathf.Infinity;
         Vector3 currentPosition = transform.position;
 
         foreach(Transform potentialTarget in enemies)
             
         {
             Vector3 directionToTarget = potentialTarget.position - currentPosition;
             float dSqrToTarget = directionToTarget.sqrMagnitude;
 
             if(dSqrToTarget < closestDistanceSqr)
             {
                 closestDistanceSqr = dSqrToTarget;
                 bestTarget = potentialTarget;
                 player = bestTarget;
                 opponent = player.GetComponent<PlayerScript>();
 
             }
         }
         return bestTarget;
 
     }
 
     void attack()
     {
         if (atktime >= 3) 
         {
             Debug.Log(monsterArray);
             atktime = 0;
             Debug.Log("Angriff_opponent");
             opponent.getHit(damage);
             //    impacted = true;
         }
     }
 
     bool newTarget()
     {
         if (atktime >= 4) 
         {
 //            monsterArray = GameObject.FindWithTag ("Player").transform;
             //Debug.Log("newTargetBoolTrue");
             return true;
         } else 
         {
             //Debug.Log("FALSE");
             return false;
         }
     }
 
 
 
and Script 2, where I actually want to fill the monsterArray
     private MonsterScript opponent;
     private Transform enemy;
 
 void Start () {
         opponent.monsterArray[] += this.gameObject;         //put this gameobj. in the monsterArray of MonsterScript
         enemy = GameObject.FindWithTag ("Enemy").transform;
         opponent = enemy.GetComponent<MonsterScript>();
     }
 
 
If new Monster spawn, it will check in it's Start() to get put into monsterArray, so it will get a Focus if it is in nearest Range. Untill now the monsterArray is empty
Answer by TBruce · Apr 13, 2016 at 05:43 PM
@Flowered I am assuming that your classes look something like below (because of your remark I changed Update to FixedUpdate)
 public class MonsterScript : MonoBehaviour
 {
     public Transform[] monsterArray;
     private PlayerScript opponent;
     private Transform player;
 
     void Start ()
     {
         player = GameObject.FindWithTag ("Player").transform;
         opponent = player.GetComponent<PlayerScript>();
     }
 
     void FixedUpdate ()
     {
         atktime += Time.deltaTime;
         if (player != null)
         {
             if (!isDead ())
             {
                 if (!inRange ())
                 {
                     chase ();
                 }
                 else
                 {
                     attack ();
                 }
                 //    transformArray = GameObject.FindGameObjectsWithTag ("Player").Select (go => go.transform).ToArray ();
             }
             else
             {
                 dieMethod ();
             }
 
         }
         else
         {
             if (!newTarget ())
             {
                 //player = GetNewTarget ();
                 player = GetClosestEnemy (monsterArray);
             }
         }
     }
 
     Transform GetClosestEnemy(Transform[] enemies)
     {
         Transform bestTarget = null;
         float closestDistanceSqr = Mathf.Infinity;
         Vector3 currentPosition = transform.position;
 
         foreach(Transform potentialTarget in enemies)
 
         {
             Vector3 directionToTarget = potentialTarget.position - currentPosition;
             float dSqrToTarget = directionToTarget.sqrMagnitude;
 
             if(dSqrToTarget < closestDistanceSqr)
             {
                 closestDistanceSqr = dSqrToTarget;
                 bestTarget = potentialTarget;
                 player = bestTarget;
                 opponent = player.GetComponent<PlayerScript>();
             }
         }
         return bestTarget;
     }
 
     void attack()
     {
         if (atktime >= 3) 
         {
             Debug.Log(monsterArray);
             atktime = 0;
             Debug.Log("Angriff_opponent");
             opponent.getHit(damage);
             //    impacted = true;
         }
     }
 
     bool newTarget()
     {
         if (atktime >= 4) 
         {
             //            monsterArray = GameObject.FindWithTag ("Player").transform;
             //Debug.Log("newTargetBoolTrue");
             return true;
         }
         else 
         {
             //Debug.Log("FALSE");
             return false;
         }
     }
 }
and
 public class EnemyMobScript : MonoBehaviour
 {
     private MonsterScript opponent;
     private Transform enemy;
 
     void Start ()
     {
         opponent.monsterArray[] += this.gameObject;         //put this gameobj. in the monsterArray of MonsterScript
         enemy = GameObject.FindWithTag ("Enemy").transform;
         opponent = enemy.GetComponent<MonsterScript>();
     }
 }
 
The first problem is that in EnemyMobScript the opponent variable is never initialized when you try to access it like so
 opponent.monsterArray[] += this.gameObject;         //put this gameobj. in the monsterArray of MonsterScript
 
I am surprised that you are not getting an error. But it should look more like
 public class EnemyMobScript : MonoBehaviour
 {
     private MonsterScript opponent;
     private Transform enemy;
 
     void Start ()
     {
         enemy = GameObject.FindWithTag ("Enemy").transform; // find the first Enemy GameObject
         if ((enemy != null) && (enemy.GetComponent<MonsterScript>() != null))
         {
             opponent = enemy.GetComponent<MonsterScript>();     // get the MonsterScript attached to the Enemy GameObject
             opponent.monsterArray[] += this.gameObject;         // put this gameobj. in the monsterArray of MonsterScript
         }
     }
 }
Unless you only have one Enemy in the game you will most likely always be getting the same Enemy with
 enemy = GameObject.FindWithTag ("Enemy").transform; // find the first Enemy GameObject
which may be OK but you may still need to worry about circular reference.
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                