Estoy agregando un conjunto de valores de matriz a través de la ventana del inspector. Estoy tratando de lograr activar una función, cuando cambio los valores de mi matriz. Es decir, mi secuencia de comandos debe verificar si los nuevos valores no son iguales a los valores anteriores y luego llamar a esta función. No quiero usar Actualizar ya que requerirá más memoria y potencia de procesamiento, entonces, ¿cuál podría ser la alternativa?
public class SetValues : MonoBehaviour { [Serializable] public struct SetValues { public float Position; public float Value; } public SetValues[] setValues; void Function_ValuesChanged() { Debug.Log("The Value is changed"); //Do Something } }Prueba MonoBehavior.OnValidate()
Ejemplo:
public class SetValues : MonoBehaviour { [Serializable] public struct SetValues { public float Position; public float Value; } public SetValues[] setValues; void OnValidate() { Debug.Log("The Value is changed"); //Do Something } }Si sucede algo en el juego y desea notificar a otros scripts, use eventos. Los eventos son ligeros y fáciles de implementar.
En la clase que contiene una matriz, cree una propiedad y cambie el valor de la matriz, solo desde la propiedad. Nunca interactúe directamente con el campo de matriz.
// Create Event Arguments public class OnArrayValueChangedEventArgs : EventArgs { public float Position; public float Value; } // Crate Event public event EventHandler<OnArrayValueChangedEventArgs> OnArrayValueChanged; Array[] myArray; // Change Array value only from this property, so when you change value, event will be called public Array[] MyArray { get { return myArray; } set { myArray = value; OnArrayValueChangedEvent(this, new OnArrayValueChangedEventArgs() { Position = myArray.Position, Value = myArray.Value };} }Desde la segunda clase, solo debe suscribirse a este evento y hacer las cosas. Llamaré a este evento desde mi clase GameManager Singleton.
private void Awake() { GameManager.Instance.OnArrayValueChanged += Instance_OnArrayValueChanged; } private void Instance_OnArrayValueChanged(object sender, GameManager.OnArrayValueChangedEventArgs e) { // Do the thing }