UP-Viagg-io/Viagg-io/Assets/Packages/MyBT/BTC/ComponentController.cs

218 lines
7.9 KiB
C#

//============= Copyright (c) Ludic GmbH, All rights reserved. ==============
//
// Purpose: Part of the My Behaviour Tree Controller Code
//
//=============================================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;
[CustomEditor(typeof(ComponentController))]
public class ComponentControllerInspector : Editor {
public override void OnInspectorGUI() {
ComponentController myTarget = (ComponentController)target;
if (myTarget.handlers == null || myTarget.handlers.Length == 0) {
Debug.Log($"myTarget.handlers is null or empty for {myTarget.name}: trigged list update");
UpdateObject(myTarget);
}
if (myTarget.handlers.Any(h => (h == null))) {
Debug.Log($"myTarget.handlers has null entry {myTarget.name}: trigged list update");
UpdateObject(myTarget);
}
// GUILayout.Toggle(myTarget.CheckHandlersModified(), "CheckHandlersModified");
if (myTarget.CheckHandlersModified()) {
Debug.Log("CheckHandlersModified: trigged list update");
UpdateObject(myTarget);
}
if (GUILayout.Button("UpdateObject")) {
UpdateObject(myTarget);
}
DrawDefaultInspector();
foreach (ComponentHandler compHand in myTarget.handlers) {
ComponentHandlerInspector e = Editor.CreateEditor(compHand) as ComponentHandlerInspector;
if (e != null) {
ComponentHandler theTarget = (ComponentHandler)e.target;
GUILayout.BeginVertical(EditorStyles.helpBox);
// // --------
// if (theTarget.helpText != null) {
// theTarget.showHelpText = EditorGUILayout.ToggleLeft("Show Info", theTarget.showHelpText);
// }
// // EditorGUILayout.Space();
// // EditorGUILayout.Space();
// // EditorGUILayout.EndHorizontal();
// EditorGUILayout.BeginHorizontal();
// if (theTarget.showHelpText) {
// if (theTarget.helpText != null) {
// // string[][] helpTextSplit = theTarget.helpText;
// for (int i=0; i<theTarget.helpText.Length; i++) {
// if (GUILayout.Button(new GUIContent($"{theTarget.helpText[i][0]} Command", theTarget.helpText[i][1]), GUILayout.MaxWidth(140))) {
// EditorGUIUtility.systemCopyBuffer = theTarget.helpText[i][2];
// }
// if (((i+1)%3)==0) {
// EditorGUILayout.EndHorizontal();
// EditorGUILayout.BeginHorizontal();
// }
// }
// }
// }
// EditorGUILayout.EndHorizontal();
// // --------
e.OnCustomInspectorGUI();
GUILayout.EndVertical();
}
}
}
public void UpdateObject (ComponentController myTarget) {
myTarget.UpdateObject();
BTC.Instance.ClearObjects();
BTC.Instance.UpdateObjects();
EditorUtility.SetDirty(myTarget);
EditorSceneManager.MarkSceneDirty(myTarget.gameObject.scene);
}
}
#endif
public class ComponentController : MonoBehaviour {
[HideInInspector]
public ComponentHandler[] handlers;
[HideInInspector]
public string roomId;
public string uniqueId;
public string objectName {
get {
return name;
}
set {
name = value;
}
}
public virtual void Awake () {
UpdateObject();
}
public ComponentHandler[] GetCurrentHandlers () {
List<ComponentHandler> handlersList = GetComponents<ComponentHandler>().ToList();
// Debug.Log("GetCurrentHandlers "+string.Join("/", handlersList.Select(e => e.TypeLabel())) + " old " + string.Join("/", handlers.Select(e => e.TypeLabel())));
return handlersList.OrderBy(o => o.TypeLabel()).ToArray();
}
public bool CheckHandlersModified () {
ComponentHandler[] currentHandlers = GetCurrentHandlers();
bool isModified = (HandlersAsTypeLabelString(handlers) != HandlersAsTypeLabelString(currentHandlers));
// Debug.Log("CheckHandlersModified: currentHandlers = "+string.Join("/", currentHandlers.Select(e => e.TypeLabel())) + " ; handlers = " + string.Join("/", handlers.Select(e => e.TypeLabel())) + " isModified " + isModified);
return isModified;
}
// the combination of all types
public string HandlersAsTypeLabelString (ComponentHandler[] h) {
return string.Join("/", h.Select(e => e.TypeLabel()));
}
// the combination of all types
public string ContentLabelAsString (List<string> labels) {
return string.Join("_", labels);
}
public string SanitizeString (string unicodeString) {
//// Create two different encodings.
//Encoding ascii = Encoding.ASCII;
//Encoding unicode = Encoding.Unicode;
//// Convert the string into a byte array.
//byte[] unicodeBytes = unicode.GetBytes(unicodeString);
//// Perform the conversion from one encoding to the other.
//byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
//// Convert the new byte[] into a char[] and then into a string.
//char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
//ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
//string asciiString = new string(asciiChars);
//return asciiString.Replace("_", "").Replace("/", "").Replace("-", "").Replace("&", "").Replace(" ", "").Replace("?", "");
return Regex.Replace(unicodeString, "[^A-Za-z0-9]", "");
}
public void UpdateObject () {
UpdateRoomId();
// the first content label
handlers = GetCurrentHandlers();
string handlersLabel = HandlersAsTypeLabelString(handlers);
List<string> contentLabels = new List<string>();
for (int i=0; i<handlers.Length; i++) {
string lbl = handlers[i].ContentLabel();
lbl = SanitizeString(lbl);
lbl = lbl.Substring(0,Mathf.Min(lbl.Length, 18));
if (!string.IsNullOrEmpty(lbl)) {
contentLabels.Add( lbl );
}
}
if (!string.IsNullOrEmpty(uniqueId)) {
contentLabels.Add(uniqueId);
}
string contentLabel = ContentLabelAsString(contentLabels);
// Debug.Log($"pre: {pre}");
// Debug.Log($"roomId: {roomId}");
// Debug.Log($"id: {id}");
// Debug.Log($"uniqueId: {uniqueId}");
List<string> gameObjectNameComponents = new List<string>();
if (!string.IsNullOrEmpty(handlersLabel)) {
gameObjectNameComponents.Add(handlersLabel);
}
if (!string.IsNullOrEmpty(roomId)) {
gameObjectNameComponents.Add(roomId);
}
if (!string.IsNullOrEmpty(contentLabel)) {
gameObjectNameComponents.Add(contentLabel);
}
string newName = string.Join(".", gameObjectNameComponents);
if (newName != gameObject.name) {
Debug.LogWarning($"BTC renamed {gameObject.name} to {newName}\n\n\n\n");
gameObject.name = newName;
}
// BTC.Instance.ClearObjects();
// BTC.Instance.UpdateObjects();
}
protected void UpdateRoomId() {
string[] rootName = transform.root.name.Split('.');
if (rootName.Length > 0) {
roomId = SanitizeString(rootName[0]);
}
else {
roomId = "undefined";
}
if (transform.parent == null) {
roomId = "";
}
}
}