Noticias

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

singleton de ScriptableObject

Iniciado por lightbug, Marzo 17, 2017, 04:15:21 AM

Tema anterior - Siguiente tema
Hola, estoy teniendo el siguiente problema: tengo un Scriptable Object llamado EnemyData que tiene datos de los enemigos del nivel, resulta que no quiero pasar el scriptableObject a los scripts de los enemigos, lo que quiero es usar un singleton para estos, lo cual he logrado asi:
 

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
[CreateAssetMenu(menuName = "ScriptableObject/Enemy Data")]
public class EnemyData : ScriptableObject {
    static EnemyData m_instance = null;
    public static EnemyData instance
    {
        get
        {
            if (!m_instance)
                m_instance = Resources.FindObjectsOfTypeAll<EnemyData>().FirstOrDefault();
            return m_instance;
        }
    }
//Variables...
}

 
El problema ---> Cuando arranco el editor todos los scripts que dependen del scriptableObject me dan NullReference! como si el FindObjectsofTypeAll no funcionara. Cuando selecciono, simplemente haciendo click sobre el scriptableObject este problema desaparece.
 
Si alguien sabe porque puede ser se lo agradeceria mucho.
 
Saludos

Buenos dias @lightbug
 
Se me ha antojado una situacion "rara" ... porque has utilizado un ScriptableObject para hacer un singleton ?
 
No lo habia pensado nunca, y utilizo mucho la clase ScriptableObject que va muy bien para crear multitud de objetos definidos con valores especificos de una clase concreta como podria ser Items, Enemigos, Vehiculos ... y tantos como se puedan imaginar. Mientras que lo bueno de los singleton es que te garantizas que solo habra un solo objeto de esa clase.
 
Al margen del problema que te surge, aunque puedas solucionarlo, creo que te encontraras con que estaras combinando dos "clases" (clases entre comillas porque el singleton no es una clase en si, pero para que se entienda ...) cuya gracia o beneficio sera totalmente opuesta a la otra. Seria como poner en el mismo equipo a Batman y el Joker ... se daran de ostias mutuamente.
 
Un consejo, por lo menos como yo lo hago y me va de maravilla, es utilizar la clase ScriptableObject para crear los objetos enemigos con sus valores especificos para cada objeto (que no gameobject), y despues un Singleton a parte para controlar el estado de los enemigos dentro del juego a modo de List o Dictionary pero con sus funciones propias (las que te interesen para manejar todo el tema).

Hola @Arthure la razon por la que deseaba una sola instancia es porque, en principio uso el scriptableObject como una base de datos (referencias a assets para ser mas especificos) y no queria que cada enemigo tenga que andar buscando en recursos el asset, ni tener que andar referenciando dentro del inspector (un caso tipico de porque usarlos), entonces se me ocurrio usar un ScrpObj para mantener toda la info ahí y luego que cada entidad la pida, con su propia variable para no pedirla en todo momento. La cuestion es que se la necesitan pedir a una instancia de ScrpObj, por eso el singleton. Si fuera el caso de referenciarlas manualmente no tendria sentido.
 
Cuando revise por internet me di cuenta que muchos intentaron los mismo, es mas me cruce con esta web que hizo exactamente lo que hice yo (el video tambien muy bueno):
 
http://baraujo.net/unity3d-making-singletons-from-scriptableobjects-automatically/
 
Entonces dije, bueno, tan errado no estuve, todo de 10, pero me di cuenta que si arranco Unity, doy play y aparecen las nullReference. Si simplemente clickeo la instancia del ScrpObj todo solucionado. No se la verdad si es un Bug Mio o del Unity jaja.
 
Saludos

Etiquetas: