Best practices for managing dynamically instantiated gameobjects via script in editor mode?
I have a script that dynamically instantiates a number of GameObjects on Awake() based on a public Vector3[] of position variables. I would like the ability to use this script while in the editor to play around with the number and position of the GameObjects to get the correct values that I can then use when actually playing the scene.
The issue I'm facing is that I want the script to update the GameObjects (or destroy and re-create them) whenever the number of positions, or the positions themselves, change. Currently, I have the script ExecuteInEditorMode and call OnValidate to re-instantiate the GameObjects every time I change a value, but I'm having trouble figuring out how to clean up the previously-instantiated GameObjects. If I try to use Destroy, it complains that it cannot be called from edit mode, and if I try to use DestroyImmediate, I get an error about not being able to call DestroyImmediate from OnValidate.
I then tried to use Update with a check to make sure Application.isPlaying was false, but that fires too often (I can't even select the dynamically-instantiated GameObject, because it is destroyed and re-created every time I try to).
What's the best practice for managing these instantiated GameObjects in the editor so that they only update when any of the values that affect how they get instantiated change?
Example code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class Script : MonoBehaviour {
public Vector3[] gos;
public GameObject prefab;
private GameObject[] goInstances;
void Update() {
if (!Application.isPlaying) {
Instantiate(true);
}
}
public void Start() {
Instantiate(false);
}
public void DestroyGos() {
foreach (GameObject goInstance in goInstances) {
Destroy(goInstance);
}
}
public void Instantiate(bool destroy) {
if (destroy) {
DestroyGos();
}
goInstances = new GameObject[gos.Length];
for (int i = 0; i < gos.Length; i++) {
goInstances[i] = Instantiate(prefab, transform);
goInstances[i].transform.position += gos[i];
}
}
}
Your answer
Follow this Question
Related Questions
Instantiate works fine in Editor and does not work after building game 0 Answers
How to ensure singletons are initialized in Edit Mode 1 Answer
Assigning multiple assets to multiple variables on inspector 1 Answer
Camera Preview is empty 5 Answers
Unity Mac version 5.2.3f1 crash every time after 5 minutes 0 Answers