Probado y funciona perfecto.
Mil gracias!!!
Mil gracias!!!
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes MenúCita de: pioj date=1557834598No pasa nada por mezclar temas de ECS y C# en el mismo foro de Scripting, tranquilo. Este sistema de programación llegará con el tiempo...
Lo que sí podemos ir preparando es una serie de "Buenas Prácticas" o consejos adicionales en el foro de Primeros Pasos, y preparar alguna Evaluación para que vayáis perfeccionando la técnica...
Cita de: juanma_teso date=1532793084Yo creo que sí sacamos varias cosas en claro, no son las listas y tampoco el hecho de que tenga las dos interfaces, el problema está en la implementación de las interfaces, prueba a registrar en cada lista con su función de interface:
public class ObjetoB : InterfaceA, InterfaceB
{
public ObjetoB ()
{
InterfaceA.Registrar();
InterfaceB.Registrar();
}
public void InterfaceA.Registrar ()
{
ListaA.Add();
}
public void InterfaceB.Registrar ()
{
ListaB.Add();
}
}
No sé si así lo hiciste cuando te dije que implementaras de forma explícita las interfaces...
Cita de: juanma_teso date=1532632464Solo para ir probando cosas nuevas, deja las funciones de la interfaz vacías y agrega los objetos a la lista de otra forma:
Así sabremos si lo que falla es que la lista no está iniciada o la implementación de la interfaz.
Cita de: juanma_teso date=1532571279Fíjate si tienes asignado el singleton, de lo contrario no podrás acceder a tu objeto a través de él.
Cita de: francoe1 date=1532573050Si utilizas la función Awake para las asignaciones y las funciones Start para los comportamientos de inicio jamas vas a tener errores de referencias nulas al trabajar con componentes compartidos.
Cita de: juanma_teso date=1532372666No ves algo raro en crear dos Interfaces con la misma función??
Aunque no creo que eso esté bien (crear dos interfaces con la misma función) prueba a implementar las interfaz de forma explícita:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation
public ClaseB : InterfaceA, InterfaceB {
void InterfaceA.Registrar ()
{
RegistrarEnA();
}
void InterfaceB.Registrar ()
{
RegistrarEnB();
}
}
Cita de: juanma_teso date=1532372666No ves algo raro en crear dos Interfaces con la misma función??
Aunque no creo que eso esté bien (crear dos interfaces con la misma función) prueba a implementar las interfaz de forma explícita:
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/explicit-interface-implementation
public ClaseB : InterfaceA, InterfaceB {
void InterfaceA.Registrar ()
{
RegistrarEnA();
}
void InterfaceB.Registrar ()
{
RegistrarEnB();
}
}
Cita de: FluXarTStudios date=1532367867No me considero programador, pero aquí no estás añadiendo en el método de InterfaceB f_Iregistra(), a la lista del tipo InterfaceB un objeto de InterfaceA?
public class UnoParaGuardarlosATodos : Monobehavior {
public static UnoParaGuardarlosATodos miSharedInstance;
public List<IMiInterfaceA> misObjetosConInterfaceA = new List<IMiInterfaceA>();
public List<IMiInterfaceB> misObjetosConnIterfaceB = new List<IMiInterfaceB>();
public void f_InstanciaObjetosConInterface(){
ObjetoTipoA miObjetoTipoA = new ObjetoTipoA();
ObjetoTipoB miObjetoTipoB = new ObjetoTipoB();
}
}
public interface IMiInterfaceA {
void f_Iregistra();
funcion1();
funcion2();
funcionN();
}
public interface IMiInterfaceB {
void f_Iregistra();
funcion1();
funcion2();
funcionN();
}
public class ObjetoTipoA : IMiInterfaceA {
public ObjetoTipoA() {
f_Iregistra()
}
public void f_Iregistra() {
UnoParaGuardarlosATodos.miSharedInstance.misObjetosConInterfaceA.add(this);
}
}
public class ObjetoTipoB : IMiInterfaceA, IMiInterfaceB {
public ObjetoTipoB() {
f_Iregistra()
}
public void f_Iregistra() {
UnoParaGuardarlosATodos.miSharedInstance.misObjetosConInterfaceA.add(this);
UnoParaGuardarlosATodos.miSharedInstance.misObjetosConInterfaceB.add(this);
}
}
NullReferenceException: Object reference not set to an instance of an object
Tzn.ObjetoTipoB.f_Iregistra () (at Assets/Scripts/Programa/ObjetoTipoB.cs:31)
Tzn.ObjetoTipoB..ctor () (at Assets/Scripts/Programa/ObjetoTipoB.cs:21)
[/quote]
El error me lo tira primero en la función f_Iregistra y después en el constructor. El problema es que me lo tira directamente en el editor, con lo que no puedo debuggearlo, y el único modo de saber que narices le pasa es comentando líneas. Así he llegado a lo que le molesta, que es cualquiera de las dos líneas:
UnoParaGuardarlosATodos.miSharedInstance.misObjetosConInterfaceA.add(this);
UnoParaGuardarlosATodos.miSharedInstance.misObjetosConInterfaceB.add(this);
[/quote]
Lo curioso es que he copiado y pegado la línea de la clase ObjetoTipoA, por si fuera un error de sintaxis, nada. No puede ser el Singleton, dado que es ese el que crea los objetos de las clases. Mi duda es si al tener dos interfaces con la misma función, pero todo lo que leo (A menos que lo interprete al revés, cosa a no descartar, soy medio así... ) no sólo es que se pueda, sino que es como se DEBE de hacer, para hacer código legible, mantenible y blabla... Pero el caso es que si hago que implemente sólo una de las dos Interfaces (Sea cual sea, la A o lasi me funciona...
Llegados a este punto, ya no sé por dónde tirar...
Acepto ideas, sugerencias y tirones de pelo.
Muchas gracias a todos.