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.