// Magica Cloth.
// Copyright (c) MagicaSoft, 2020-2022.
// https://magicasoft.jp
using UnityEditor;
using UnityEngine;
namespace MagicaCloth
{
///
/// アバターのエディタ拡張
///
[CustomEditor(typeof(MagicaAvatar))]
public class MagicaAvatarInspector : Editor
{
public override void OnInspectorGUI()
{
MagicaAvatar scr = target as MagicaAvatar;
// データ状態
EditorInspectorUtility.DispVersionStatus(scr);
EditorInspectorUtility.DispDataStatus(scr);
serializedObject.Update();
//Undo.RecordObject(scr, "CreateBoneCloth");
// メイン
MainInspector();
// モニターボタン
//EditorInspectorUtility.MonitorButtonInspector();
//DrawDefaultInspector();
// パーツリスト
if (EditorApplication.isPlaying)
{
if (DrawPartsList())
{
serializedObject.ApplyModifiedProperties();
}
}
// イベント
Events();
serializedObject.ApplyModifiedProperties();
}
//=========================================================================================
private void MainInspector()
{
//MagicaAvatar scr = target as MagicaAvatar;
//EditorGUILayout.Space();
}
private void Events()
{
EditorGUILayout.Space();
EditorGUILayout.LabelField("Events", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(serializedObject.FindProperty("OnAttachParts"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("OnDetachParts"));
}
//=========================================================================================
///
/// パーツ一覧表示
///
private bool DrawPartsList()
{
MagicaAvatar scr = target as MagicaAvatar;
bool change = false;
EditorGUILayout.LabelField("Attach Parts", EditorStyles.boldLabel);
// ドラッグ&ドロップ
change = DrawPartsDragAndDropArea();
// パーツ一覧
MagicaAvatarParts removeParts = null;
for (int i = 0; i < scr.Runtime.AvatarPartsCount; i++)
{
var parts = scr.Runtime.GetAvatarParts(i);
if (parts)
{
EditorGUILayout.BeginHorizontal(GUI.skin.box);
GUILayout.Space(30);
EditorGUILayout.HelpBox(parts.name, MessageType.None);
GUI.backgroundColor = Color.red;
if (GUILayout.Button("Remove"))
{
removeParts = parts;
}
GUI.backgroundColor = Color.white;
EditorGUILayout.EndHorizontal();
}
}
EditorGUILayout.Space();
if (removeParts)
{
// パーツ削除
scr.DetachAvatarParts(removeParts);
change = true;
}
return change;
}
///
/// アバターパーツのドラッグ&ドロップ受け付け
///
///
private bool DrawPartsDragAndDropArea()
{
bool change = false;
var evt = Event.current;
var dropArea = GUILayoutUtility.GetRect(0.0f, 50.0f, GUILayout.ExpandWidth(true));
var style = new GUIStyle(GUI.skin.box);
style.normal.textColor = Color.white;
style.alignment = TextAnchor.MiddleCenter;
GUI.backgroundColor = new Color(0.7f, 0.7f, 0.7f);
GUI.Box(dropArea, "Drag & Drop\n[Avatar Parts]", style);
GUI.backgroundColor = Color.white;
GameObject attachPartsObject = null;
int id = GUIUtility.GetControlID(FocusType.Passive);
switch (evt.type)
{
case EventType.DragUpdated:
case EventType.DragPerform:
if (!dropArea.Contains(evt.mousePosition)) break;
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
DragAndDrop.activeControlID = id;
if (evt.type == EventType.DragPerform)
{
DragAndDrop.AcceptDrag();
foreach (var draggedObject in DragAndDrop.objectReferences)
{
//Debug.Log("Drag Object:" + AssetDatabase.GetAssetPath(draggedObject));
//m_FilePath.stringValue = AssetDatabase.GetAssetPath(draggedObject);
//Debug.Log("GameObject:" + (draggedObject is GameObject));
//Debug.Log("AvatarParts:" + (draggedObject is MagicaAvatarParts));
if (draggedObject is GameObject)
{
var go = draggedObject as GameObject;
if (go.GetComponent())
{
//Debug.Log("Avatar Parts!!");
attachPartsObject = go;
}
}
}
DragAndDrop.activeControlID = 0;
}
Event.current.Use();
//change = true;
break;
}
if (attachPartsObject)
{
// パーツ追加
MagicaAvatar scr = target as MagicaAvatar;
scr.AttachAvatarParts(attachPartsObject);
change = true;
}
return change;
}
}
}