Noticias

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

[Ayuda] Inicializar GameObject en Static Class Scripts

Iniciado por Centauro5legs, Noviembre 17, 2018, 08:10:44 PM

Tema anterior - Siguiente tema
Noviembre 17, 2018, 08:10:44 PM Ultima modificación: Noviembre 17, 2018, 08:12:18 PM por Centauro5legs
Ok, tengo un problema. Tengo el siguiente Script:
 

using UnityEngine;
using System.Collections;
public static class DataParticle
{
    public static GameObject ItemCurativo;   //[01]
    public static GameObject PociónRoja;     //[02]
    public static GameObject PociónAzul;     //[03]
    public static GameObject PociónVerde;    //[04]
    public static GameObject PociónAmarilla; //[05]
    public static GameObject PociónMorada;   //[06]
    public static GameObject PociónNaranja;  //[07]
    public static GameObject PociónCeleste;  //[08]
    public static GameObject PociónBlanca;   //[09]
    public static GameObject PociónNegra;    //[10]
    public static GameObject Comida;         //[11]
    public static GameObject Bebida;         //[12]
public static GameObject GetItemCurativo (){
   return ItemCurativo;
}
public void SetItemCurativo(GameObject Entrada){
   ItemCurativo = Entrada;
}
}

 
Hasta aquí todo bien, no provoca error, y puede llamarlo desde otros Scripts sin tener que inicializarlo ni anclarlo a un objeto en la escena, que es lo que deseo. El problema es que no me deja cargar mis prefabs en las variables GameObject en el inspector. En teoría, seleccionando el Script en Unity, te permitiría inicializar las variables. Pero no me deja, muestra un mensaje que dice; "No Monobehaviour scripts in the file". Saben como solucionar el error?.
 
 

Noviembre 18, 2018, 02:24:16 AM #1 Ultima modificación: Noviembre 18, 2018, 02:26:27 AM por lightbug
Cita de: Centauro5legs date=1542481844El problema es que no me deja cargar mis prefabs en las variables GameObject en el inspector
   


No podrías, acordate que static lo que hace es imponer que ese campo pertenezca a la clase y no a las instancias de la misma (si tocas ese campo en dos scripts diferentes cambia uno solo, es decir que lo "comparten"). La otra es que tenés una clase generica, de ahí supongo el "No Monobehaviour scripts in the file". Para que una clase C# te permita mostrar sus campos necesitas decirle a la clase que sea serializable [System.Serializable] y decirle a cada campo que sea serializable [SerializeField] , no recuerdo si con solo el public te alcanza.
 
También tu clase es static, es decir que no soporta instancias de ella (de Microsoft):
 
"A https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/static" rel="external nofollow">static class is basically the same as a non-static class, but there is one difference: a static class cannot be instantiated. In other words, you cannot use the https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/new" rel="external nofollow">new keyword to create a variable of the class type."
 
Osea que si tenés este seteo olvidate de los típicos inspectores (de uno o de muchos), están pensados para componentes (y clases "comunes" de C#), varios en la escena, como monobehaviours, pero nada super general como seguro buscás. Probablemente quieras tener un lugar donde guardar cosas, o incluso tener alguna que otra funcionalidad general ...
 
Cita de: Centauro5legs date=1542481844Hasta aquí todo bien, no provoca error, y puede llamarlo desde otros Scripts sin tener que inicializarlo ni anclarlo a un objeto en la escena, que es lo que deseo.
   


Usá un ScriptableObject, se usa justamente para eso, es independiente de la escena/gameObject. Tenés que heredar de "Scriptable Object" , dentro poner tus publics o serializables, y finalmente darle un atributo para que aparezca en el Editor, así podés crear instancias (https://docs.unity3d.com/ScriptReference/CreateAssetMenuAttribute.html), creo que con:
 

[CreateAssetMenu(menuName = "Scriptable Objects/SCO1")]
public SCO1 : ScriptableObject
{
public GameObject A;
public GameObject B;
public GameObject C;
...

}

 
 

Etiquetas: