[DB-AL]Easy Editor Windows in Unity with Serialized Properties
Publié : 29 Mars 2021 15:48
Bonjour,
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 à
quand au code de la vidéo, le voici :
J'ai juste changé ce qu'il y avait dans FindProperty par items
ps ; Mes connaissances dans Unity et c# sont parsemés d’incompréhension..
Merci pour votre aide.
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.