j'essaye de refaire le code de cette vidéo https://www.youtube.com/watch?v=c_3DXBrH-Is qui génère dynamiquement toute la partie GUI à partir d'un script.
à 6:25, il affiche tout un tas d'information dans la fenêtre alors que la mienne reste vide.
On ne voit jamais dans la vidéo ce qui est lu par le programme. Mon scriptableObject ressemble à
Code : Tout sélectionner
[CreateAssetMenu(fileName = "GameDataObject", menuName = "test/GameDataObject", order = 1)]
[System.Serializable]
public class GameDataObject : ScriptableObject
{
public List<Item> items = new List<Item>();
}
[System.Serializable]
public class Item : ScriptableObject
{
[SerializeField]
private string m_Id;
public string Id
{
get { return this.m_Id; }
set { this.m_Id = value; }
}
[SerializeField]
private string m_ItemName = "New Item";
public string Name
{
get { return this.m_ItemName; }
set { this.m_ItemName = value; }
}
}
quand au code de la vidéo, le voici :
Code : Tout sélectionner
using UnityEditor;
public class GameDataObjectEditorWindow : ExtendedEditorWindow
{
public static void Open(GameDataObject dataObject)
{
GameDataObjectEditorWindow window = GetWindow<GameDataObjectEditorWindow>("Game Data Editor");
window.serializedObject = new SerializedObject(dataObject);
}
private void OnGUI()
{
currentProperty = serializedObject.FindProperty("items");
DrawProperties(currentProperty, true);
}
}
Code : Tout sélectionner
using UnityEditor;
using UnityEditor.Callbacks;
public class AssetHandler
{
[OnOpenAsset()]
public static bool OpenEditor(int instanceId, int line)
{
GameDataObject obj = EditorUtility.InstanceIDToObject(instanceId) as GameDataObject;
if (obj != null)
{
GameDataObjectEditorWindow.Open(obj);
return true;
}
return false;
}
}
[CustomEditor(typeof(GameDataObject))]
public class GameDataObjectCustomEditor : Editor
{
public override void OnInspectorGUI()
{
if (GUILayout.Button("Open Editor"))
{
GameDataObjectEditorWindow.Open((GameDataObject)target);
}
}
}
Code : Tout sélectionner
using UnityEditor;
public class ExtendedEditorWindow : EditorWindow
{
protected SerializedObject serializedObject;
protected SerializedProperty currentProperty;
protected void DrawProperties(SerializedProperty prop, bool drawChildren)
{
string lastPropPath = string.Empty;
foreach(SerializedProperty p in prop)
{
if (p.isArray && p.propertyType == SerializedPropertyType.Generic)
{
EditorGUILayout.BeginHorizontal();
p.isExpanded = EditorGUILayout.Foldout(p.isExpanded, p.displayName);
EditorGUILayout.EndHorizontal();
if (p.isExpanded)
{
EditorGUI.indentLevel++;
DrawProperties(p, drawChildren);
EditorGUI.indentLevel--;
}
}
else
{
if(!string.IsNullOrEmpty(lastPropPath) && p.propertyPath.Contains(lastPropPath)) { continue; }
lastPropPath = p.propertyPath;
EditorGUILayout.PropertyField(p, drawChildren);
}
}
}
}
Merci pour votre aide.