Files
tianrunCRM/Assets/CoolapeFrame/Editor/Inspectors/CLRoleAvataInspector.cs
2020-07-04 14:41:25 +08:00

396 lines
13 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;
using Coolape;
using System.Collections.Generic;
[CustomEditor (typeof(CLRoleAvata), true)]
public class CLRoleAvataInspector : CLBehaviour4LuaInspector
{
CLRoleAvata avata;
private static bool isShowNewBodyPart = false;
private static CLBodyPart newBodyPart = new CLBodyPart ();
private static string cellName = "";
private static GameObject onePartObj;
private static Material material;
private static int selectedPartindex = -1;
private string testPartName = "";
private string testCellName = "";
static bool isShowBones = false;
static bool isAddBones = false;
static string addBoneName = "";
static Transform addBone;
public override void OnInspectorGUI ()
{
avata = (CLRoleAvata)target;
ECLEditorUtl.BeginContents ();
{
if (isAddBones || isShowBones) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("Bone Name", GUILayout.Width (100));
EditorGUILayout.LabelField ("Bone Transform", GUILayout.Width (150));
}
GUILayout.EndHorizontal ();
}
if (isShowBones) {
for (int i = 0; i < avata.bonesNames.Count; i++) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.TextField (avata.bonesNames [i], GUILayout.Width (100));
EditorGUILayout.ObjectField (avata.bonesList [i], typeof(Transform), GUILayout.Width (150));
if (GUILayout.Button ("-")) {
if (EditorUtility.DisplayDialog ("Confirm", "确定要删除?", "Okay", "Cancel")) {
avata.bonesNames.RemoveAt (i);
avata.bonesList.RemoveAt (i);
EditorUtility.SetDirty (avata);
break;
}
}
}
GUILayout.EndHorizontal ();
}
}
if (isAddBones) {
GUILayout.BeginHorizontal ();
{
addBoneName = EditorGUILayout.TextField (addBoneName, GUILayout.Width (100));
addBone = (Transform)(EditorGUILayout.ObjectField (addBone, typeof(Transform), GUILayout.Width (150)));
if (GUILayout.Button ("+")) {
if (string.IsNullOrEmpty (addBoneName)) {
EditorUtility.DisplayDialog ("Confirm", "Bone Name can not null", "Okay");
return;
}
if (avata.bonesMap.ContainsKey (addBoneName)) {
EditorUtility.DisplayDialog ("Confirm", "Bone Name allready exsit, please check then name Uniqueness", "Okay");
return;
}
if (addBone == null) {
EditorUtility.DisplayDialog ("Confirm", "Bone can not null", "Okay");
return;
}
avata.bonesNames.Add (addBoneName);
avata.bonesList.Add (addBone);
avata.bonesMap [addBoneName] = addBone;
EditorUtility.SetDirty (avata);
addBone = null;
addBoneName = "";
}
}
GUILayout.EndHorizontal ();
}
GUILayout.BeginHorizontal ();
{
if (GUILayout.Button (isShowBones ? "Hide Bones" : "Show Bones")) {
isShowBones = !isShowBones;
}
if (GUILayout.Button ("Add Bones")) {
isAddBones = true;
}
}
GUILayout.EndHorizontal ();
}
ECLEditorUtl.EndContents ();
ECLEditorUtl.BeginContents ();
{
if (avata.bodyPartNames != null) {
for (int i = 0; i < avata.bodyPartNames.Count; i++) {
GUILayout.BeginHorizontal ();
{
if (selectedPartindex == i) {
GUI.color = Color.yellow;
}
if (GUILayout.Button (avata.bodyPartNames [i])) {
selectedPartindex = i;
isShowNewBodyPart = false;
}
GUI.color = Color.white;
if (GUILayout.Button ("-", GUILayout.Width (30))) {
if (EditorUtility.DisplayDialog ("Confirm", "确定要删除?", "Okay", "Cancel")) {
avata.bodyPartNames.RemoveAt (i);
break;
}
}
}
GUILayout.EndHorizontal ();
if (selectedPartindex == i) {
avata.bodyParts [i] = showOnePart (avata.bodyParts [i], false);
}
}
}
if (isShowNewBodyPart) {
newBodyPart = newBodyPart == null ? new CLBodyPart () : newBodyPart;
newBodyPart = showOnePart (newBodyPart, true);
GUILayout.BeginHorizontal ();
{
if (GUILayout.Button ("Clean")) {
newBodyPart.cellNames.Clear ();
// newBodyPart.materials.Clear ();
newBodyPart.materialNames.Clear ();
newBodyPart.partObjs.Clear ();
newBodyPart.animatorControllers.Clear ();
cellName = "";
onePartObj = null;
}
if (GUILayout.Button ("Save Body Part")) {
doAddBodyPart ();
}
}
GUILayout.EndHorizontal ();
}
if (GUILayout.Button ("Add Body Part")) {
selectedPartindex = -1;
newBodyPart = new CLBodyPart ();
isShowNewBodyPart = true;
}
}
ECLEditorUtl.EndContents ();
testPartName = EditorGUILayout.TextField ("Part Name", testPartName);
testCellName = EditorGUILayout.TextField ("Cell Name", testCellName);
if (GUILayout.Button ("test")) {
avata.setMapindex ();
avata.switch2xx (testPartName, testCellName);
}
if (GUILayout.Button ("clean Material")) {
avata.cleanMaterial ();
}
if (GUILayout.Button ("set Default Material")) {
avata.setDefaultMaterial ();
}
}
CLBodyPart showOnePart (CLBodyPart aBodyPart, bool isNew)
{
NGUIEditorTools.BeginContents ();
{
if (isNew) {
GUI.color = Color.red;
EditorGUILayout.LabelField ("新增一个部位", GUILayout.Width (200));
GUI.color = Color.yellow;
} else {
GUI.color = Color.white;
}
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("身体部位", GUILayout.Width (100));
aBodyPart.partName = GUILayout.TextField (aBodyPart.partName);
}
GUILayout.EndHorizontal ();
//=========================
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("换装方式", GUILayout.Width (100));
aBodyPart.switchType = (CLSwitchType)EditorGUILayout.EnumPopup ("", aBodyPart.switchType);
}
GUILayout.EndHorizontal ();
//=========================
EditorGUILayout.LabelField ("该部位中所有部件(" + aBodyPart.cellNames.Count + ")", GUILayout.Width (150));
if (aBodyPart.switchType == CLSwitchType.showOrHide) {
NGUIEditorTools.BeginContents ();
{
if (aBodyPart.cellNames.Count > 0) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("名字Key", GUILayout.Width (100));
EditorGUILayout.LabelField ("部件(GameObject)");
}
GUILayout.EndHorizontal ();
}
for (int i = 0; i < aBodyPart.cellNames.Count; i++) {
GUILayout.BeginHorizontal ();
{
aBodyPart.cellNames [i] = EditorGUILayout.TextField (aBodyPart.cellNames [i], GUILayout.Width (100));
aBodyPart.partObjs [i] = (GameObject)(EditorGUILayout.ObjectField (aBodyPart.partObjs [i], typeof(GameObject)));
if (GUILayout.Button ("-")) {
aBodyPart.cellNames.RemoveAt (i);
aBodyPart.partObjs.RemoveAt (i);
break;
}
}
GUILayout.EndHorizontal ();
//=========================
}
GUILayout.BeginHorizontal ();
{
cellName = EditorGUILayout.TextField (cellName, GUILayout.Width (100));
onePartObj = (GameObject)(EditorGUILayout.ObjectField (onePartObj, typeof(GameObject)));
if (cellName == "" && onePartObj != null) {
cellName = onePartObj.name;
}
if (GUILayout.Button ("+")) {
if (string.IsNullOrEmpty (cellName) || onePartObj == null) {
EditorUtility.DisplayDialog ("Alert", "名字和对象不能为空!", "ok");
} else {
aBodyPart.cellNames.Add (cellName);
aBodyPart.partObjs.Add (onePartObj);
cellName = "";
onePartObj = null;
}
}
}
GUILayout.EndHorizontal ();
//=========================
}
NGUIEditorTools.EndContents ();
//=========================
} else if (aBodyPart.switchType == CLSwitchType.switchShader) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("Render(渲染器)", GUILayout.Width (100));
aBodyPart.render = (Renderer)(EditorGUILayout.ObjectField (aBodyPart.render, typeof(Renderer)));
}
GUILayout.EndHorizontal ();
//=========================
NGUIEditorTools.BeginContents ();
{
if (aBodyPart.cellNames.Count > 0) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("名字Key", GUILayout.Width (100));
EditorGUILayout.LabelField ("部件(Material)");
}
GUILayout.EndHorizontal ();
}
for (int i = 0; i < aBodyPart.cellNames.Count; i++) {
GUILayout.BeginHorizontal ();
{
aBodyPart.cellNames [i] = EditorGUILayout.TextField (aBodyPart.cellNames [i], GUILayout.Width (100));
Material mat = null;
if (aBodyPart.materialNames.Count > i) {
mat = (Material)(EditorGUILayout.ObjectField (getMat (aBodyPart.materialNames [i]), typeof(Material)));
} else {
aBodyPart.materialNames = new List<string> (aBodyPart.cellNames.Count);
mat = (Material)(EditorGUILayout.ObjectField (mat, typeof(Material)));
}
if (mat != null) {
aBodyPart.materialNames [i] = getMatName (mat);
}
if (GUILayout.Button ("-")) {
aBodyPart.cellNames.RemoveAt (i);
// aBodyPart.materials.RemoveAt (i);
aBodyPart.materialNames.RemoveAt (i);
break;
}
}
GUILayout.EndHorizontal ();
//=========================
}
GUILayout.BeginHorizontal ();
{
cellName = EditorGUILayout.TextField (cellName, GUILayout.Width (100));
material = (Material)(EditorGUILayout.ObjectField (material, typeof(Material)));
if (cellName == "" && material != null) {
cellName = material.name;
}
if (GUILayout.Button ("+")) {
if (string.IsNullOrEmpty (cellName) || material == null) {
EditorUtility.DisplayDialog ("Alert", "名字和对象不能为空!", "ok");
} else {
aBodyPart.cellNames.Add (cellName);
aBodyPart.materialNames.Add (getMatName (material));
cellName = "";
material = null;
}
}
}
GUILayout.EndHorizontal ();
//=========================
}
NGUIEditorTools.EndContents ();
}
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("是否需要换动作", GUILayout.Width (100));
aBodyPart.needSwitchController = EditorGUILayout.Toggle (aBodyPart.needSwitchController);
}
GUILayout.EndHorizontal ();
if (aBodyPart.needSwitchController) {
if (aBodyPart.cellNames.Count > 0) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField ("名字Key", GUILayout.Width (100));
EditorGUILayout.LabelField ("部件(AnimatorController)");
}
GUILayout.EndHorizontal ();
}
for (int i = aBodyPart.animatorControllers.Count; i < aBodyPart.cellNames.Count; i++) {
aBodyPart.animatorControllers.Add (null);
}
for (int i = 0; i < aBodyPart.cellNames.Count; i++) {
GUILayout.BeginHorizontal ();
{
EditorGUILayout.LabelField (aBodyPart.cellNames [i], GUILayout.Width (100));
aBodyPart.animatorControllers [i] = (RuntimeAnimatorController)(EditorGUILayout.ObjectField (aBodyPart.animatorControllers [i], typeof(RuntimeAnimatorController)));
}
GUILayout.EndHorizontal ();
}
}
}
NGUIEditorTools.EndContents ();
GUI.color = Color.white;
return aBodyPart;
}
void doAddBodyPart ()
{
if (string.IsNullOrEmpty (newBodyPart.partName)) {
EditorUtility.DisplayDialog ("Alert", "身体部位名称不能为空!", "ok");
return;
}
if (newBodyPart.switchType == CLSwitchType.showOrHide) {
if (newBodyPart.partObjs.Count <= 0) {
EditorUtility.DisplayDialog ("Alert", "没有部件可保存!", "ok");
return;
}
newBodyPart.materialNames.Clear ();
} else if (newBodyPart.switchType == CLSwitchType.switchShader) {
if (newBodyPart.materialNames.Count <= 0) {
EditorUtility.DisplayDialog ("Alert", "没有部件可保存!", "ok");
return;
}
newBodyPart.partObjs.Clear ();
}
avata.bodyPartNames.Add (newBodyPart.partName);
avata.bodyParts.Add (newBodyPart);
Debug.LogError ("newBodyPart.materialNames.Count==" + newBodyPart.materialNames.Count);
Debug.LogError ("newBodyPart.partObjs.Count==" + newBodyPart.partObjs.Count);
EditorUtility.SetDirty (avata);
newBodyPart = null;
isShowNewBodyPart = false;
}
string getMatName (Material mat)
{
string materialPath = ECLEditorUtl.getPathByObject (mat);
materialPath = materialPath.Replace (CLPathCfg.self.basePath + "/upgradeRes4Dev/other/Materials/", "");
materialPath = materialPath.Replace (".mat", "");
materialPath = materialPath.Replace ("/", ".");
return materialPath;
}
Material getMat (string matName)
{
if (string.IsNullOrEmpty (matName))
return null;
string path = "Assets/" + CLPathCfg.self.basePath + "/upgradeRes4Dev/other/Materials/" + matName.Replace(".", "/") + ".mat";
Material mat = AssetDatabase.LoadAssetAtPath (path, typeof(Material)) as Material;
return mat;
}
}