Jump to content
UnitySpain
Sign in to follow this  
Centauro5legs

[Ayuda] Inicializar GameObject en Static Class Scripts

Recommended Posts

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?.

 

Edited by Centauro5legs

Share this post


Link to post
Share on other sites
6 hours ago, Centauro5legs said:

El 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 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 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 ...

6 hours ago, Centauro5legs said:

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.

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; 
	...
	
}

 

Edited by lightbug

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...