Je me permets de poster sur ce forum dans l'espoir d'avoir une réponse, ou une piste, à un, voir deux, de mes problèmes. Pour expliquer rapidement mon code, j'ai une classe qui hérite de ScriptableObject, un custom inspector qui agit sur la classe précédement citée, et une classe permettant de sauvegarder les ScriptableObject en .asset
Le code permettant de créer les .asset à partir de la classe ScriptableObject "World". Le code provient d'un "live training" disponible sur le site de Unity.
Code : Tout sélectionner
public static class CustomAssetUtility
{
[MenuItem("Assets/Gameobject/Custom Assets/World")]
public static void CreateWorld () {
var world = ScriptableObject.CreateInstance(typeof(World));
AssetDatabase.CreateAsset(world, "Assets/new_world.asset");
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = world;
// Print the path of the created asset
Debug.Log(AssetDatabase.GetAssetPath(world));
}
}
Ma classe "World" qui hérite de ScriptableObject, qui contient un int worldX, et un tableau de Cube (définit juste en dessous). Le tableau est initialisé dans un autre bout de code que je n'ai pas montré car inutile pour ma question.
Code : Tout sélectionner
[System.Serializable]
public class World : ScriptableObject
{
[SerializeField]
private int _worldX;
[SerializeField]
private Cube[] _cube;
#region Get/Set
public int worldX {get; set;}
public Cube[] cube {get; set;}
#endregion
}
[System.Serializable]
public class Cube
{
public bool is_destroyable;
}
Code : Tout sélectionner
[CustomEditor(typeof(World)), CanEditMultipleObjects]
public class WorldInspector : Editor
{
SerializedObject world_serialize;
World world_class;
// properties
private SerializedProperty _worldX;
private SerializedProperty test;
void Awake()
{
world_class = (World)target;
Debug.Log(world_class.worldX);
}
void Init_ScriptableObject_Properties()
{
test = world_serialize.FindProperty("cube");
if (test.isArray)
{
Debug.Log("yes");
for (int i = 0; i < test.arraySize; i++)
Debug.Log(test.GetArrayElementAtIndex(i).FindPropertyRelative("is_destroyable");
}
}
void OnEnable()
{
world_class = (World)target;
world_serialize = new SerializedObject(target);
Init_ScriptableObject_Properties();
Debug.Log(world_class.worldX);
}
// define the world size
void gui_world_size()
{
world_class.worldX = EditorGUILayout.IntField(world_class.worldX);
EditorUtility.SetDirty(world_class);
}
public override void OnInspectorGUI()
{
gui_world_size();
}
}
- Si je change la valeur de mon int worldX via l'inspector (par exemple : 30), et que je recompile mon code, la valeur dans l'inspector ne change pas, elle est toujours égale à 30. En revanche, si je quitte Unity et que je le relance, la valeur de mon int retombe à 0 (c'est en tout cas ce que m'affiche le débug.log de la fonction Awake() du custom inspector, et l'inspector). Pourquoi alors que je fais un SetDirty ?
- On m'a conseillé d'utiliser la seconde méthode pour interagir avec les ScriptableObject (world_serialize = new SerializedObject(target);), mais je me retrouve avec le problème suivant : Comment accéder à mon tableau et aux valeurs contenues dans chacune des classes de ce tableau ? J'ai déjà fait un essai dans la fonction "void Init_ScriptableObject_Properties()" visible dans le custom inspector, mais ça ne fonctionne pas. Une idée ?
Je vous remercie d'avoir pris le temps de lire, et je vous remercie d'avance pour vos éventuelles réponses.
Bonne journée/soirée, et passez de bonnes fêtes !