Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[Duda] Llamar un evento de un singleton desde otro script

Iniciado por Null, Agosto 18, 2017, 02:37:59 PM

Tema anterior - Siguiente tema
Agosto 18, 2017, 02:37:59 PM Ultima modificación: Agosto 18, 2017, 02:44:56 PM por Null
Aloha.
 
Estaba trasteando con un singleton, probando cosas, etc...

y resulta que declaré un evento dentro del singleton, al cual quiero llamar desde otro script, pero me da un error el cual antes no tenía.


Singleton!:
 

public class GameManager {
     #region "Singleton"
     static GameManager instance;
     public static GameManager Instance {
         get {
             if (instance == null) instance = new GameManager();
             return instance;
         }
     }
    #endregion
   
    public event Action OnPlayerGrounded; // El evento.
   
    CharacterController cc;
    public CharacterController CC => cc;
    void Awake() {
        cc = GameObject.FindGameObjectWithTag("Player").GetComponent<CharacterController>();
    }
}

 
 
 
Script desde el que intento llamar al evento:
 

public class PlayerController {
    void Update() {
        if (GameManager.Instance.CC.isGrounded)
            GameManager.Instance.OnPlayerGrounded?.Invoke(); // Aquí es donde obtengo el error.
    }
}

 
El error que me da es el Assets/Scripts/Player/PlayerController.cs(23,70): error CS0070: The event `GameManager.OnPlayerGrounded' can only appear on the left hand side of += or -= when used outside of the type `GameManager'...

Antes simplemente tenía el evento declarado dentro de PlayerController y simplemente decía:
 

if (cc.isGrounded) OnPlayerGrounded();

 
y funcionaba... pero ahora me dio por tener un poco más de orden y usar managers :P

Qué solución puede haber en este caso? Mil y una gracias.

Los eventos no pueden llamarse desde otra clase distinta a la que lo encapsula, deberias crear una función que accione el evento.
 
Por otra parte, hasta Unity5 no se puede utilizar ? en los eventos, debido a que esto fue integrado en versiones mas nuevas de .NET, deberias hacer la comprobación (evento == null)? ... 
 
 

ya te han respondido pero algo que te puedo recomendar es que tienes parte de tu codigo como si quisieras tener un singleton que extiende de mono, pero tu GameManager extiende de object podrias hacer la clase entera static, deshacerte de todo el codigo singleton poner todo static y listo, todo el proceso y codigo de singleton es cuando deseamos tener un singleton que pueda hacer uso del inspector y/o de metodos como Update o Start
 
Suerte 
 
 

Etiquetas: