Files
MI-38/Heli_with_panels/Assets/Scripts/ScEditor/Mi38Objects.cs
2022-07-06 12:36:49 +03:00

1711 lines
87 KiB
C#
Raw 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 System.Collections.Generic;
using UnityEngine;
using System.Xml.Serialization;
using System.Xml;
using System.IO;
using System;
using System.Collections;
using UnityEngine.Networking;
using System.Text;
using TMPro;
using System.Runtime.InteropServices;
using System.Globalization;
[XmlRoot("Mi-38_objects")]
public class Mi38Objects
{
[XmlElement("object")]
public List<UnityObject> obj = new List<UnityObject>();
[XmlIgnore]
Manager man;
[XmlIgnore]
public bool isLoaded = false;
[XmlIgnore]
public bool isXMLLoaded = false;
public void Start()
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
}
public IEnumerator Load()
{
bool isWeb;
string path = Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml");
string objectsText = "";
if(man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
Transform[] allPanels2D = man.canvas.transform.GetChild(0).GetComponentsInChildren<Transform>();
Transform[] allPanels3D = man.copter.GetComponentsInChildren<Transform>();
//Debug.LogError("Trying Deserialize: " + path);
path = path.Replace("file:///", "");
// закомментируй блок для первичного заполнения (осторожно, пересоздаст objects.xml)
if (path.Contains("http"))
{
UnityWebRequest www = UnityWebRequest.Get(path);
www.downloadHandler = new DownloadHandlerBuffer();
yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError(www.error);
yield break;
}
else
{
objectsText = www.downloadHandler.text;
//Debug.LogError(" Web Deserialize: downloaded bytes " + objectsText.Length);
}
isWeb = true;
}
else
isWeb = false;
if (!isWeb && Application.platform == RuntimePlatform.WebGLPlayer)
{
Debug.LogError("Cannot open local files in WebGL");
}
else
{
var utf8 = Encoding.UTF8 as UTF8Encoding;
XmlSerializer serializer = new XmlSerializer(typeof(Mi38Objects));
Stream fs;
if (isWeb)
fs = new MemoryStream(utf8.GetBytes(objectsText));
else
fs = new FileStream(path, FileMode.Open);
XmlReader reader = new XmlTextReader(fs);
bool res = serializer.CanDeserialize(reader);
reader.Close();
fs.Close();
if (!res)
yield break;
if (isWeb)
fs = new MemoryStream(utf8.GetBytes(objectsText));
else
fs = new FileStream(path, FileMode.Open);
man.objects = (Mi38Objects)serializer.Deserialize(fs);
//Debug.LogError(" Deserialize: man.objects = " + man.objects.obj.Count);
fs.Close();
}
if (man.objects != null)
man.objects.isXMLLoaded = true;
else
yield break;
//Debug.Log("Mi38Objects: Deserialized " + man.objects.obj.Count + " root object(s).");
PostLoadProcessing();
if (Application.platform != RuntimePlatform.WebGLPlayer)
Serialize(man.objects, Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml"));
//Debug.Log("Mi38Objects: Load coroutine is done.");
man.objects.isLoaded = true;
}
struct postLoadStruct
{
public Transform _obj;
public string _dim;
public UnityObjectChilds _UOList;
public UnityObject _parent;
};
void PostLoadProcessing()
{
List<postLoadStruct> recursList = new List<postLoadStruct>();
//Debug.Log("Mi38Objects.PostLoadProcessing: Start CopyMFI1toOthers().");
CopyMFI1toOthers();
//Debug.Log("Mi38Objects.PostLoadProcessing: Finished CopyMFI1toOthers().");
//return;
int objCnt = 0;
//Debug.Log("Mi38Objects.PostLoadProcessing: Start postload 3D-objects.");
UnityObjectChilds ch = new UnityObjectChilds();
for (int i = 0; i < man.objects.obj.Count; i++)
ch.obj.Add(man.objects.obj[i]);
for (int i = 0; i < man.copter.transform.childCount; i++)
{
postLoadStruct recursItem = new postLoadStruct();
recursItem._obj = man.copter.transform.GetChild(i);
recursItem._dim = "3D"; recursItem._UOList = ch; recursItem._parent = null;
recursList.Add(recursItem);
}
while(recursList.Count > 0)
{
int ind = recursList.Count - 1;
ProcessObject(recursList[ind]._obj, recursList[ind]._dim, recursList[ind]._UOList, recursList[ind]._parent);
//postLoadStruct recursItem = recursList[ind];
recursList.RemoveAt(ind);
}
//Debug.Log("Mi38Objects.PostLoadProcessing: Start postload 2D-objects.");
for (int i = 0; i < man.canvas.transform.GetChild(0).transform.childCount; i++)
{
postLoadStruct recursItem = new postLoadStruct();
recursItem._obj = man.canvas.transform.GetChild(0).transform.GetChild(i);
recursItem._dim = "2D"; recursItem._UOList = ch; recursItem._parent = null;
recursList.Add(recursItem);
}
while (recursList.Count > 0)
{
int ind = recursList.Count - 1;
ProcessObject(recursList[ind]._obj, recursList[ind]._dim, recursList[ind]._UOList, recursList[ind]._parent);
recursList.RemoveAt(ind);
}
//Debug.Log("Mi38Objects.PostLoadProcessing: Finished postload.");
void ProcessObject(Transform _obj, string _dim, UnityObjectChilds _UOList, UnityObject _parent) //List<UnityObject> _uObjList
{
objCnt++;
UnityObject uObj = null;
for (int i = 0; i < _UOList.obj.Count; i++)
if (_UOList.obj[i].name == _obj.gameObject.name)
{
uObj = _UOList.obj[i];
uObj.gameObject = _obj.gameObject; uObj.tag = _obj.tag;
uObj.parent = _parent; uObj.foundInUnity = true;
if (uObj.gameObject == null)
Debug.Log("Load error: gameObject(" + uObj.name + ") == null");
break;
}
//GC.Collect();
if (uObj == null) // обработка вновь появившихся объектов
{
//Debug.Log("* Mi38Objects.PostLoadProcessing: Found NEW object "+ _obj.gameObject.name+" parent: "+_parent.gameObject.name+" ("+ recursList.Count + ")");
uObj = new UnityObject();
uObj.gameObject = _obj.gameObject;
if (uObj.gameObject == null)
Debug.Log("Load error: gameObject(" + uObj.name + ") == null");
uObj.name = _obj.gameObject.name; uObj.tag = _obj.gameObject.tag;
uObj.dim = _dim; uObj.type = ""; uObj.handler = "self";
uObj.parent = _parent; uObj.foundInUnity = true;
uObj.description = null; uObj.linkedObjects = null;
if (!uObj.name.StartsWith("Panel") && !uObj.type.EndsWith("textField"))
{
uObj.states = new List<ObjectState>(); // наполнение нового объекта "по-умолчанию"
ObjectState objSt = new ObjectState(); objSt.name = "состояние 1"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "состояние 2"; uObj.states.Add(objSt);
uObj.defaultState = new DefaultObjectState(); uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = new ObjectStateInRange(); uObj.stateInRange.min = 0; uObj.stateInRange.max = 90;
uObj.description = new ObjectDescription(); uObj.description.text = "";
//uObj.states = new List<ObjectState>();
//uObj.defaultState = new DefaultObjectState(); uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
//uObj.description = new ObjectDescription(); uObj.description.text = "";
}
if (uObj.type.EndsWith("textField") && uObj.stateText == null)
{
uObj.stateText = new ObjectTextState();
uObj.stateText.text = uObj.stateText.curtext = "0"; uObj.stateText.color = uObj.stateText.curcolor = "green";
}
if (_obj.childCount > 0)
uObj.childs = new UnityObjectChilds();
if (_dim == "2D")
{
UnityObject object3D = man.objects.Find(uObj.name + "_3D");
if (object3D != null)
{
uObj.linkedObjects = new List<LinkedUnityObject>();
LinkedUnityObject linkedObj = new LinkedUnityObject();
linkedObj.name = object3D.name; linkedObj.type = object3D.type;
if (!uObj.name.StartsWith("Panel"))
{
linkedObj.setState = new List<LinkedUnityObjectSetState>(); // тренировочные примеры
LinkedUnityObjectSetState linkedObjSetState = new LinkedUnityObjectSetState(); linkedObjSetState.value = 0;
linkedObj.setState.Add(linkedObjSetState);
linkedObjSetState = new LinkedUnityObjectSetState(); linkedObjSetState.value = 1;
linkedObj.setState.Add(linkedObjSetState);
linkedObj.set = new List<LinkedUnityObjectSet>();
LinkedUnityObjectSet linkedObjSet = new LinkedUnityObjectSet(); linkedObjSet.enabled = "true"; linkedObj.set.Add(linkedObjSet);
linkedObjSet = new LinkedUnityObjectSet(); linkedObjSet.enabled = "false"; linkedObj.set.Add(linkedObjSet);
linkedObj.setCurVal = null;
}
uObj.linkedObjects.Add(linkedObj);
//Debug.Log("Linked " + uObj.name + " and " + uObj.name.Substring(0, uObj.name.Length - 3));
}
}
_UOList.obj.Add(uObj);
}
else
{ // обработка уже загруженных объектов, не удалять!, может пригодиться
//Debug.Log(" "+_obj.gameObject.name + " (" + recursList.Count +")"); //+ ", totalMem "+ Mathf.Floor(GC.GetTotalMemory(false)/1024/1024) + " Mb)"
if (uObj.type.EndsWith("textField") && uObj.stateText == null)
{
uObj.stateText = new ObjectTextState();
uObj.stateText.text = uObj.stateText.curtext = "0"; uObj.stateText.color = uObj.stateText.curcolor = "green";
}
/*(if(uObj.linkedObjects != null)
for(int i=0;i < uObj.linkedObjects.Count;i++)
{
uObj.linkedObjects[i].setCurVal = null;
if (uObj.linkedObjects[i].setValue != null && uObj.linkedObjects[i].setValue.Count > 0)
{
uObj.linkedObjects[i].setCurVal = new List<bool>();
uObj.linkedObjects[i].setCurVal.Add(true);
uObj.linkedObjects[i].setValue = null;
}
} */
// начальная правка 2Д тумблеров и крышек(cover)
/*if (_dim == "2D" && uObj.parent != null && uObj.name.StartsWith(uObj.parent.name))
if(uObj.name.StartsWith("Tumbler") || uObj.name.StartsWith("Cover") || uObj.name.StartsWith("Lamp"))
{
string[] st = uObj.name.Split('_');
int t_num;
if (Int32.TryParse(st[st.Length - 1], out t_num))
if (t_num > 0 && t_num < 10)
{
uObj.handler = "parent";
uObj.description = null; uObj.defaultState = null; uObj.states = null; uObj.stateRange = null;
}
} */
//if(uObj.states != null)
// for(int i=0; i< uObj.states.Count; i++)
// uObj.states[i].name = "состояние " + (i+1);
//if (uObj.stateInRange != null)
//{ uObj.stateInRange.umin = 0; uObj.stateInRange.umax = 90; }
//if (uObj.name.StartsWith("Panel") && uObj.type == "")
// uObj.type = "panel" + _dim;
//if(uObj.type == "" && uObj.states != null && uObj.states.Count > 0 && uObj.states[0].name == "состояние 1")
//{
// uObj.states = null; uObj.defaultState = null;
// uObj.stateInRange = null; uObj.description = null;
//}
/*
if(uObj.tag == "buttons")
{
uObj.type = "button";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt = new ObjectState(); objSt.name = "Не нажата"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Нажата"; uObj.states.Add(objSt);
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Кнопка";
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if (uObj.tag == "buttonscheck")
{
uObj.type = "buttonCheckable";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt = new ObjectState(); objSt.name = "Не нажата"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Нажата"; uObj.states.Add(objSt);
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Кнопка западающая";
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if(uObj.tag == "toggle" && uObj.childs.obj.Count == 2)
{
uObj.type = "toggle2pos";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
bool isHorizontal = false;
if (uObj.linkedObjects != null && uObj.linkedObjects.Count > 0)
{
UnityObject lObj = man.objects.Find(uObj.linkedObjects[0].name);
if (lObj != null)
if (lObj.tag == "toggle3Dh")
isHorizontal = true;
}
//else
// Debug.LogError("(tag = toggle) No 3D objects linked to " + uObj.name);
ObjectState objSt;
if(isHorizontal)
{
objSt = new ObjectState(); objSt.name = "Влево"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Вправо"; uObj.states.Add(objSt);
}
else
{
objSt = new ObjectState(); objSt.name = "Вниз"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Вверх"; uObj.states.Add(objSt);
}
if(uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
if (isHorizontal)
uObj.description.text = "Тумблер горизонтальный";
else
uObj.description.text = "Тумблер вертикальный";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
{
if (isHorizontal)
linkedObj.type = "toggleHorizontal";
else
linkedObj.type = "toggleVertical";
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt;
sSt = new LinkedUnityObjectSetState(); sSt.value = 0; linkedObj.setState.Add(sSt);
sSt = new LinkedUnityObjectSetState(); sSt.value = 1; linkedObj.setState.Add(sSt);
lObj.type = linkedObj.type; lObj.description.text = uObj.description.text;
lObj.defaultState.value = 0;
lObj.states.Clear();
ObjectState lobjSt;
if (isHorizontal)
{
lobjSt = new ObjectState(); lobjSt.name = "Влево"; lObj.states.Add(lobjSt);
lobjSt = new ObjectState(); lobjSt.name = "Вправо"; lObj.states.Add(lobjSt);
}
else
{
lobjSt = new ObjectState(); lobjSt.name = "Вниз"; lObj.states.Add(lobjSt);
lobjSt = new ObjectState(); lobjSt.name = "Вверх"; lObj.states.Add(lobjSt);
}
}
}
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if (uObj.tag == "toggle" && uObj.gameObject.transform.childCount > 2)
{
uObj.type = "toggleNpos";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt;
int childCnt = uObj.gameObject.transform.childCount;
for (int i = 0; i < childCnt; i++)
{
objSt = new ObjectState(); objSt.name = "Положение "+(i+1)+" (переименовать!)"; uObj.states.Add(objSt);
}
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Тумблер "+ childCnt + " позиционный";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
//Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
{
linkedObj.type = "toggleNpos";
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt;
for (int i = 0; i < childCnt; i++)
{
sSt = new LinkedUnityObjectSetState(); sSt.value = i; linkedObj.setState.Add(sSt);
}
lObj.type = linkedObj.type; lObj.description.text = uObj.description.text;
lObj.defaultState.value = 0;
lObj.states.Clear();
ObjectState lobjSt;
for (int i = 0; i < childCnt; i++)
{
lobjSt = new ObjectState(); lobjSt.name = "Положение " + (i + 1) + " (переименовать!)"; lObj.states.Add(lobjSt);
}
}
}
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if (uObj.tag == "myBtnCheck")
{
uObj.type = "lampButton";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt = new ObjectState(); objSt.name = "Не нажата"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Нажата"; uObj.states.Add(objSt);
int childCnt = uObj.gameObject.transform.childCount;
for (int i = 1; i < childCnt - 1;i++)
{
objSt = new ObjectState(); objSt.name = "Цвет "+i + " (переименовать!)"; uObj.states.Add(objSt);
}
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Кнопка с подсветкой";
if(uObj.linkedObjects != null)
foreach(LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if(lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object "+ linkedObj.name + " not found!");
}
else
{
linkedObj.type = "lamp3color";
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt = new LinkedUnityObjectSetState(); sSt.value = 0; linkedObj.setState.Add(sSt);
sSt = new LinkedUnityObjectSetState(); sSt.value = 0; linkedObj.setState.Add(sSt);
for (int i = 0; i < childCnt - 2; i++)
{
sSt = new LinkedUnityObjectSetState(); sSt.value = i + 1; linkedObj.setState.Add(sSt);
}
lObj.type = "lamp3color"; lObj.description.text = "Лампа 3-х цветная";
lObj.defaultState.value = 0;
lObj.states.Clear();
ObjectState lobjSt = new ObjectState(); lobjSt.name = "Выкл."; lObj.states.Add(lobjSt);
lobjSt = new ObjectState(); lobjSt.name = "Цвет 1 (переименовать!)"; lObj.states.Add(lobjSt);
lobjSt = new ObjectState(); lobjSt.name = "Цвет 2 (переименовать!)"; lObj.states.Add(lobjSt);
}
}
//else
// Debug.LogError("(tag = myBtnCheck) No 3D objects linked to " + uObj.name);
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if (uObj.tag == "buttonscheck3")
{
uObj.type = "lamp";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt = new ObjectState(); objSt.name = "Выкл."; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Вкл."; uObj.states.Add(objSt);
int childCnt = uObj.gameObject.transform.childCount;
for (int i = 0; i < childCnt - 2; i++)
{
objSt = new ObjectState(); objSt.name = "Цвет " + (i+2) + " (переименовать!)"; uObj.states.Add(objSt);
}
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Лампа";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
{
linkedObj.type = "lampNcolor";
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt;
for (int i = 0; i < childCnt; i++)
{
sSt = new LinkedUnityObjectSetState(); sSt.value = i; linkedObj.setState.Add(sSt);
}
lObj.type = "lampNcolor"; lObj.description.text = "Лампа";
lObj.defaultState.value = 0;
lObj.states.Clear();
ObjectState lobjSt = new ObjectState(); lobjSt.name = "Выкл."; lObj.states.Add(lobjSt);
if(childCnt == 2)
{
lobjSt = new ObjectState(); lobjSt.name = "Вкл."; lObj.states.Add(lobjSt);
}
else
for (int i = 1; i < childCnt; i++)
{
lobjSt = new ObjectState(); lobjSt.name = "Цвет " + i + " (переименовать!)"; lObj.states.Add(lobjSt);
}
}
}
//else
// Debug.LogError("(tag = buttonscheck3) No 3D objects linked to " + uObj.name);
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
if(uObj.name == "Button0701" || uObj.name == "Button0702" || uObj.name == "Button0801" || uObj.name == "Button0802") // кубики
{
uObj.type = "cubeButton";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt = new ObjectState(); objSt.name = "Вид 1"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Вид 2"; uObj.states.Add(objSt);
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Переключатель вида";
}
if (uObj.tag == "rotateangle")
{
uObj.type = "tumblerRotate";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt;
int min = 360; int max = -360;
foreach (CircleCollider2D gr in uObj.gameObject.transform.parent.GetComponentsInChildren<CircleCollider2D>())
{
string s = gr.name;
if ((!s.Equals(uObj.gameObject.name)) && s.StartsWith(uObj.gameObject.name))
{
int at = (int) (Mathf.Atan2(gr.gameObject.transform.position.x - uObj.gameObject.transform.position.x, gr.gameObject.transform.position.y - uObj.gameObject.transform.position.y) * Mathf.Rad2Deg);
objSt = new ObjectState(); objSt.name = (uObj.states.Count + 1).ToString(); objSt.uval = at; uObj.states.Add(objSt);
if (at < min) min = at;
if (at > max) max = at;
UnityObject labelObj = man.objects.Find(gr.name);
if(labelObj != null)
{
labelObj.states = null; labelObj.linkedObjects = null; labelObj.description = null; labelObj.defaultState = null;
}
}
}
if (min > max) min = max;
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Тумблер " + uObj.states.Count + " позиционный";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
{
linkedObj.type = "tumblerRotate";
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt;
for (int i = 0; i < uObj.states.Count; i++)
{
sSt = new LinkedUnityObjectSetState(); sSt.value = uObj.states[i].uval; linkedObj.setState.Add(sSt);
}
lObj.type = "tumblerRotate"; lObj.description.text = "Тумблер " + uObj.states.Count + " позиционный";
lObj.defaultState.value = uObj.states[0].uval;
lObj.states = null;
lObj.stateInRange = new ObjectStateInRange();
lObj.stateInRange.min = min; lObj.stateInRange.max = max;
lObj.stateInRange.umin = min; lObj.stateInRange.umax = max;
}
}
//else
// Debug.LogError("(tag = buttonscheck3) No 3D objects linked to " + uObj.name);
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
} // tumblerRotate
if (uObj.tag == "handles" || uObj.gameObject.GetComponent<Handler>() != null)
{
uObj.type = "handleRotate";
if (uObj.stateInRange == null)
uObj.stateInRange = new ObjectStateInRange();
uObj.states = null;
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
int min=0, max=0, def=0;
if(uObj.tag == "handles")
{
min = 0; max = 0; def = 0;
}
if(uObj.gameObject.GetComponent<Handler>() != null)
{
min = (int)uObj.gameObject.GetComponent<Handler>().endDragMin;
max = (int)uObj.gameObject.GetComponent<Handler>().endDragMax;
def = (int)uObj.gameObject.GetComponent<Handler>().defaultAngle;
}
uObj.stateInRange.min = uObj.stateInRange.umin = min;
uObj.stateInRange.max = uObj.stateInRange.umax = max;
uObj.defaultState.value = def;
uObj.defaultState.enabled = true;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Переключатель свободного вращения";
if (min == 0 && max == 0)
uObj.description.text += " (круговой)";
else
uObj.description.text += " ("+min+".."+max+")";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
{
linkedObj.type = "handleRotate";
linkedObj.setState = null; linkedObj.set = null;
linkedObj.setValue = new List<LinkedUnityObjectSetValue>();
linkedObj.setValue.Add(new LinkedUnityObjectSetValue());
lObj.type = "handleRotate";
if (lObj.description == null) lObj.description = new ObjectDescription();
lObj.description.text = uObj.description.text;
if (lObj.defaultState == null) lObj.defaultState = new DefaultObjectState();
lObj.defaultState.value = uObj.defaultState.value;
lObj.states = null;
lObj.stateInRange = new ObjectStateInRange();
lObj.stateInRange.min = min; lObj.stateInRange.max = max;
lObj.stateInRange.umin = min; lObj.stateInRange.umax = max;
}
}
//else
// Debug.LogError("(tag = buttonscheck3) No 3D objects linked to " + uObj.name);
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
} // handleRotate
if (uObj.dim == "2D" && uObj.tag == "cover")
{
//Debug.Log("Linked to " + uObj.name + " objects: " + uObj.linkedObjects + " " + uObj.linkedObjects.Count);
uObj.type = "cover";
if (uObj.states == null)
uObj.states = new List<ObjectState>();
uObj.states.Clear();
ObjectState objSt;
objSt = new ObjectState(); objSt.name = "Закрыта"; uObj.states.Add(objSt);
objSt = new ObjectState(); objSt.name = "Открыта"; uObj.states.Add(objSt);
if (uObj.defaultState == null)
uObj.defaultState = new DefaultObjectState();
uObj.defaultState.value = 0; uObj.defaultState.enabled = true;
uObj.stateInRange = null;
if (uObj.description == null)
uObj.description = new ObjectDescription();
uObj.description.text = "Крышка";
if (uObj.linkedObjects != null)
foreach (LinkedUnityObject linkedObj in uObj.linkedObjects) //3D
{
UnityObject lObj = man.objects.Find(linkedObj.name);
if (lObj == null)
{
Debug.Log("Linked to " + uObj.name + " object " + linkedObj.name + " not found!");
}
else
if(lObj.tag == "cover3Dv" || lObj.tag == "cover3Dh")
{
linkedObj.type = lObj.tag;
linkedObj.setState.Clear(); linkedObj.set = null;
LinkedUnityObjectSetState sSt;
sSt = new LinkedUnityObjectSetState(); sSt.value = 0; linkedObj.setState.Add(sSt);
sSt = new LinkedUnityObjectSetState(); sSt.value = 1; linkedObj.setState.Add(sSt);
if (lObj.description == null)
lObj.description = new ObjectDescription();
lObj.type = lObj.tag; lObj.description.text = uObj.description.text;
if (lObj.defaultState == null)
lObj.defaultState = new DefaultObjectState();
lObj.defaultState.value = 0;
if (lObj.states == null)
lObj.states = new List<ObjectState>();
lObj.states.Clear();
ObjectState lobjSt;
lobjSt = new ObjectState(); lobjSt.name = "Закрыта"; lObj.states.Add(lobjSt);
lobjSt = new ObjectState(); lobjSt.name = "Открыта"; lObj.states.Add(lobjSt);
}
}
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
} //cover
*/
}
if (_obj.childCount > 0 && uObj.childs == null)
uObj.childs = new UnityObjectChilds();
for (int i = 0; i < _obj.childCount; i++)
{
//if (_obj == null || uObj == null || uObj.childs == null || uObj.childs.obj == null)
// Debug.Log("Objects: null");
postLoadStruct recursItem = new postLoadStruct();
recursItem._obj = _obj.GetChild(i);
recursItem._dim = _dim; recursItem._UOList = uObj.childs; recursItem._parent = uObj;
recursList.Add(recursItem);
}
} //ProcessObject
Debug.Log("Mi38Objects: Loaded " + objCnt + " object(s).");
int errCnt = CheckForExcessObjects(man.objects.obj, true);
if (errCnt != 0)
Debug.Log("В файле обнаружено " + errCnt + " объект(ов), отсутствующих в сцене Unity. Удалены.");
}
void ClearChildStates(UnityObject uObj)
{
uObj.description = null; uObj.defaultState = null;
if (uObj.states != null) uObj.states.Clear();
uObj.states = null; uObj.stateInRange = null;
if (uObj.childs != null)
foreach (UnityObject child in uObj.childs.obj)
ClearChildStates(child);
}
public void Save()
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
if (man.objects.isXMLLoaded && Application.platform != RuntimePlatform.WebGLPlayer)
Serialize(this, Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml"));
}
int CheckForExcessObjects(List<UnityObject> objList, bool deleteErrors)
{
int errCnt = 0;
for (int i = 0; i < objList.Count; i++)
{
if (!objList[i].foundInUnity)
{
if (deleteErrors)
{
objList.RemoveAt(i); i--;
}
else
{
if (objList[i].error == null)
objList[i].error = new ObjectErrorMessage();
objList[i].error.msg = "Соответствующий GameObject не найден. Удалите объект.";
}
}
else
{
if (deleteErrors)
objList[i].error = null;
if (objList[i].childs != null)
errCnt += CheckForExcessObjects(objList[i].childs.obj, deleteErrors);
}
}
return errCnt;
}
void CopyMFI1toOthers() // функция для клонирования объектов с первого экрана МФИ на остальные (при загрузке)
{
//GC.Collect();
//GC.WaitForPendingFinalizers();
//Debug.Log(" CopyMFI1toOthers: Find Panels");
UnityObject mfi1 = Find("Panel0110");
UnityObject mfi2 = Find("Panel0111"); UnityObject mfi3 = Find("Panel0116");
UnityObject mfi4 = Find("Panel0121"); UnityObject mfi5 = Find("Panel0122");
mfi2.childs.obj.Clear(); mfi3.childs.obj.Clear(); mfi4.childs.obj.Clear(); mfi5.childs.obj.Clear();
//Debug.Log(" CopyMFI1toOthers: Starting CloneWithStringReplace");
XmlSerializer serializer = new XmlSerializer(mfi1.childs.obj[0].GetType());
//Stream fs = new MemoryStream(0);
//StreamWriter writer = new StreamWriter(fs);
UnityObject res;
for (int i=0; i<mfi1.childs.obj.Count; i++)
{
//Debug.Log(" Clone "+ mfi1.childs.obj[i].name);
Stream fs = new MemoryStream(0);
StreamWriter writer = new StreamWriter(fs);
serializer.Serialize(writer.BaseStream, mfi1.childs.obj[i]);
fs.Position = 0;
byte[] buf = new byte[fs.Length + 10];
fs.Read(buf, 0, buf.Length);
writer.Close();
fs.Dispose(); writer.Dispose();
//Debug.Log(" - Serialized (" + buf.Length + " bytes)");
//if (man == null)
// man = GameObject.Find("Manager").GetComponent<Manager>();
//man.memLeak += buf.Length;
Encoding encoding = Encoding.Default;
string st = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length).ToString().Replace("mfi1_", "mfi2_");
buf = encoding.GetBytes(st);
Stream fs_buf = new MemoryStream(buf);
StreamReader reader = new StreamReader(fs_buf);
res = (UnityObject)serializer.Deserialize(reader.BaseStream);
reader.Close();
if (res == null) Debug.Log("Error: UnityObject clone fail");
fs_buf.Dispose(); reader.DiscardBufferedData(); reader.Dispose();
mfi2.childs.obj.Add(res);
st = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length).ToString().Replace("mfi2_", "mfi3_");
buf = encoding.GetBytes(st);
fs_buf = new MemoryStream(buf);
reader = new StreamReader(fs_buf);
res = (UnityObject)serializer.Deserialize(reader.BaseStream);
reader.Close();
if (res == null) Debug.Log("Error: UnityObject clone fail");
fs_buf.Dispose(); reader.DiscardBufferedData(); reader.Dispose();
mfi3.childs.obj.Add(res);
st = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length).ToString().Replace("mfi3_", "mfi4_");
buf = encoding.GetBytes(st);
fs_buf = new MemoryStream(buf);
reader = new StreamReader(fs_buf);
res = (UnityObject)serializer.Deserialize(reader.BaseStream);
reader.Close();
if (res == null) Debug.Log("Error: UnityObject clone fail");
fs_buf.Dispose(); reader.DiscardBufferedData(); reader.Dispose();
mfi4.childs.obj.Add(res);
st = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length).ToString().Replace("mfi4_", "mfi5_");
buf = encoding.GetBytes(st);
fs_buf = new MemoryStream(buf);
reader = new StreamReader(fs_buf);
res = (UnityObject)serializer.Deserialize(reader.BaseStream);
reader.Close();
if (res == null) Debug.Log("Error: UnityObject clone fail");
fs_buf.Dispose(); reader.DiscardBufferedData(); reader.Dispose();
mfi5.childs.obj.Add(res);
//Debug.Log(" - Deserialized");
//mfi2.childs.obj.Add(mfi1.childs.obj[i].CloneWithStringReplace("mfi1_", "mfi2_"));
//mfi3.childs.obj.Add(mfi1.childs.obj[i].CloneWithStringReplace("mfi1_", "mfi3_"));
//mfi4.childs.obj.Add(mfi1.childs.obj[i].CloneWithStringReplace("mfi1_", "mfi4_"));
//mfi5.childs.obj.Add(mfi1.childs.obj[i].CloneWithStringReplace("mfi1_", "mfi5_"));
//GC.Collect();
//GC.WaitForPendingFinalizers();
}
//GC.Collect();
//GC.WaitForPendingFinalizers();
//Debug.Log("MFI Memory allocated: " + Mathf.Floor(man.memLeak / (1024)) + " Kb");
}
public UnityObject Find(string objName)
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
if (!man.objects.isXMLLoaded) return null;
UnityObject result = null;
for (int i=0; i < man.objects.obj.Count; i++)
{
result = FindRecurs(man.objects.obj[i]);
if (result != null) break;
}
return result;
UnityObject FindRecurs(UnityObject _obj)
{
UnityObject res = null;
if (_obj.name == objName) return _obj;
if(_obj.childs != null)
for (int i = 0; i < _obj.childs.obj.Count; i++)
{
res = FindRecurs(_obj.childs.obj[i]);
if (res != null) break;
}
return res;
}
}
public UnityObject FindHandler(string objName)
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
if (!man.objects.isXMLLoaded) return null;
UnityObject result = Find(objName);
//Debug.Log("Find " + objName + ": " + result.name + " Handler: " + result.handler);
if (result == null) return result;
while(result != null)
{
if (result.handler == "self") break;
if (result.handler == "parent")
{
if(result.parent == null)
{
result.error = new ObjectErrorMessage();
result.error.msg = "Обработчик объекта " + objName + " не найден.";
Debug.Log("Mi38Objects: " + result.error.msg);
if (Application.platform == RuntimePlatform.WebGLPlayer)
Serialize(this, Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml"));
result = null;
}
else
{
result = result.parent;
continue;
}
}
else
{
UnityObject res = Find(result.handler);
if (res != null)
result = res;
else
{
result.error = new ObjectErrorMessage();
result.error.msg = "Обработчик объекта " + objName + " не найден.";
Debug.Log("Mi38Objects: " + result.error.msg);
result = null;
}
}
}
return result;
}
public void Serialize(object item, string path)
{
if (!man.objects.isXMLLoaded) return;
if (Application.platform == RuntimePlatform.WebGLPlayer) return;
XmlSerializer serializer = new XmlSerializer(item.GetType());
StreamWriter writer = new StreamWriter(path);
serializer.Serialize(writer.BaseStream, item);
writer.Close();
}
public void SetDefaultValues()
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
if (!man.objects.isLoaded) return;
int errCnt = 0;
for (int i = 0; i < this.obj.Count; i++)
if(this.obj[i].dim == "3D")
SetDefaultValuesRecurs(this.obj[i]);
for (int i = 0; i < this.obj.Count; i++)
if (this.obj[i].dim == "2D")
SetDefaultValuesRecurs(this.obj[i]);
//if(errCnt != 0)
// Debug.Log("SetDefaultValues: cant set values of " + errCnt + " object(s).");
man.mfi1.ses = man.mfi2.ses = man.mfi3.ses = man.mfi4.ses = man.mfi5.ses = true;
void SetDefaultValuesRecurs(UnityObject _obj)
{
if (_obj.defaultState != null)
{
_obj.enabled = _obj.defaultState.enabled;
if (!_obj.SetObjectState(_obj.defaultState.value))
errCnt++;
}
else
_obj.curState = -1;
if (_obj.type.EndsWith("textField") && _obj.stateText != null) {
_obj.SetObjectText(_obj.stateText.text, _obj.stateText.color);
}
if (_obj.childs != null)
for (int i = 0; i < _obj.childs.obj.Count; i++)
SetDefaultValuesRecurs(_obj.childs.obj[i]);
}
}
public void SetCurrentValues(UnityObject _obj)
{
if (man == null) man = GameObject.Find("Manager").GetComponent<Manager>();
if (!man.objects.isLoaded) return;
if (!_obj.type.EndsWith("textField"))
{
if (_obj.name.StartsWith("mfi") && _obj.name.Substring(5).StartsWith("Button"))
{ } //mfi button
else
_obj.SetObjectState(_obj.curState);
}
else
if (_obj.stateText != null) _obj.SetObjectText(_obj.stateText.curtext, _obj.stateText.curcolor);
//if(_obj.type != "")
// Debug.Log("SetCurrentValues: " + _obj.name + " ("+_obj.type+") is Active " + _obj.gameObject.activeInHierarchy);
if (_obj.childs != null)
for (int i = 0; i < _obj.childs.obj.Count; i++)
SetCurrentValues(_obj.childs.obj[i]);
}
}
public class UnityObject
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("tag")]
public string tag;
[XmlAttribute("dim")]
public string dim; // возможные значения: 2D, 3D
[XmlAttribute("type")]
public string type;
[XmlAttribute("handler")]
public string handler; // возможные значения: self, parent
//state uval=""
//<stateRange min="0" max="90" umin="0" umax="90"/>
[XmlElement("ERROR")]
public ObjectErrorMessage error; // по умолчанию отсутствует, неоходимо создавать с помощью = new ErrorMessage()
[XmlElement("description")]
public ObjectDescription description; // по умолчанию отсутствует, неоходимо создавать с помощью = new ObjectDescription()
[XmlElement("defaultState")] // значение value: указывает на состояние state по порядку (1,2,...) или имеет значение в интервале stateRange
public DefaultObjectState defaultState; // = new DefaultObjectState()
[XmlElement("state")] // список дискретных состояний
public List<ObjectState> states; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<ObjectState>();
[XmlElement("stateRange")] // состояние объекта в интервале min..max
public ObjectStateInRange stateInRange; // по умолчанию отсутствует, неоходимо создавать с помощью = new ObjectStateRange()
[XmlElement("stateText")] // состояние объекта string
public ObjectTextState stateText; // по умолчанию отсутствует, неоходимо создавать с помощью = new ObjectTextState()
[XmlElement("linkedObject")]
public List<LinkedUnityObject> linkedObjects; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<LinkedUnityObject>()
[XmlElement("childs")]
public UnityObjectChilds childs; // по умолчанию отсутствует, неоходимо создавать с помощью = new UnityObjectChilds()
[XmlIgnore]
public UnityObject parent;
[XmlIgnore]
public int curState;
[XmlIgnore]
public bool foundInUnity = false;
[XmlIgnore]
public bool enabled = true;
[XmlIgnore]
public GameObject gameObject;
[XmlIgnore]
Manager man = null;
[XmlIgnore]
public string textcolor = "";
[XmlIgnore]
public bool setTextFieldAsFloat = false;
//[XmlIgnore]
//XmlSerializer serializer = null;
public bool SetObjectState(int newState, UnityObject callerObj=null)
{
if (man == null)
man = GameObject.Find("Manager").GetComponent<Manager>();
if (!enabled) return true;
UnityObject linkedObj = null; // изменяем состояния связанным объектам
if(this.linkedObjects != null)
for(int i=0;i<this.linkedObjects.Count;i++)
{
linkedObj = man.objects.Find(this.linkedObjects[i].name);
if (linkedObj == null)
continue;
//if(this.linkedObjects[i].setState != null && newState < this.linkedObjects[i].setState.Count && newState < 0)
//{
// Debug.Log("tumblerRotate: " + name + " to " + newState);
//}
if (this.linkedObjects[i].setState != null && newState >= 0 && newState < this.linkedObjects[i].setState.Count)
linkedObj.SetObjectState(this.linkedObjects[i].setState[newState].value, this);
if (this.linkedObjects[i].set != null && newState >= 0 && newState < this.linkedObjects[i].set.Count)
{
if(this.linkedObjects[i].set[newState].enabled == "true")
linkedObj.enabled = true;
if (this.linkedObjects[i].set[newState].enabled == "false")
linkedObj.enabled = false;
if (this.linkedObjects[i].set[newState].visible == "true")
linkedObj.gameObject.SetActive(true);
if (this.linkedObjects[i].set[newState].visible == "false")
linkedObj.gameObject.SetActive(false);
}
if (this.linkedObjects[i].setCurVal != null && this.linkedObjects[i].setCurVal.Count > 0)
linkedObj.SetObjectState(newState, this);
}
// изменяем состояния объектов с таким же именем на других панелях МФИ
if (this.name.StartsWith("mfi") && ((callerObj != null && !callerObj.name.StartsWith("mfi")) || callerObj == null) && this.type != "")
for(int i=1;i<=5;i++)
{
if (this.name.StartsWith("mfi" + i.ToString())) continue; // не передаём состояния на другие МФИ:
if (this.name.Length > 11 && this.name.Substring(5, 6) == "Button") break; // кнопок (по периметру экрана)
if (this.name.Length > 9 && this.name.Substring(5, 4) == "Lamp") break; // надписей (по периметру экрана)
UnityObject linkedUO = man.objects.Find("mfi" + i.ToString() + this.name.Substring(4));
if (linkedUO != null) linkedUO.SetObjectState(newState, this);
}
// type: panel3D, panel2D, buttonAutoUncheck...
if (dim == "2D" && (type == "button" || type == "buttonAutoUncheck") && this.gameObject.GetComponent<myButton>() != null)
{
if (newState == 0)
this.gameObject.GetComponent<myButton>().OnUp();
else
this.gameObject.GetComponent<myButton>().OnDown();
if (newState == 1 && name.StartsWith("mfi")) // переключение экранов МФИ
{
int mfiNum = 0;
int.TryParse(name.Substring(3,1), out mfiNum);
string btnName = name.Substring(11);
switch (mfiNum)
{
case 1: man.mfi1.ButtonPressed(btnName); break; //objects.Find("Panel0110").gameObject.GetComponent<MFIScript>()
case 2: man.mfi2.ButtonPressed(btnName); break;
case 3: man.mfi3.ButtonPressed(btnName); break;
case 4: man.mfi4.ButtonPressed(btnName); break;
case 5: man.mfi5.ButtonPressed(btnName); break;
}
}
if (newState == 1 && this.name.StartsWith("Button") && (this.parent.name == "Panel0201" || this.parent.name == "Panel0203")) // кнопка на МФПУ
{
int mfpuBtnNum = -1;
int.TryParse(name.Substring(6, name.IndexOf("_")-6), out mfpuBtnNum);
//if(this.parent.name == "Panel0201")
man.mfpuScript.ButtonPressed(mfpuBtnNum);
//if (this.parent.name == "Panel0203")
// man.mfpu2Script.ButtonPressed(mfpuBtnNum);
}
}
//if (dim == "2D" && type == "buttonCheckable")
//{
// ButtonCheckable bc = this.gameObject.GetComponent<ButtonCheckable>();
// if (bc == null)
// Debug.Log(this.name);
//}
if (dim == "2D" && type == "buttonCheckable" && this.gameObject.GetComponent<ButtonCheckable>() != null)
{
this.gameObject.GetComponent<ButtonCheckable>().SetState(newState);
}
if (dim == "2D" && type == "lampButton" && this.gameObject.GetComponent<MyBtnCheck3>() != null)
{
if (newState == 0)
this.gameObject.GetComponent<MyBtnCheck3>().EnableSprite(1);
if (newState == 1)
this.gameObject.GetComponent<MyBtnCheck3>().EnableSprite(0);
if (newState == 2 || newState == 3)
this.gameObject.GetComponent<MyBtnCheck3>().EnableSprite(newState);
}
if (dim == "3D" && type == "lamp3color")
{
Renderer[] objRenderers = this.gameObject.transform.GetComponentsInChildren<Renderer>();
for (int i = 0; i < objRenderers.Length; i++)
{
Color clr = new Color(0f / 255f, 0f / 255f, 0f / 255f); // черный
if (newState == 1) // красный
clr = new Color(30f / 255f, 0f / 255f, 0f / 255f);
if (newState == 2) // миг.желтый
clr = new Color(100f / 255f, 65f / 255f, 0f / 255f);
objRenderers[i].material.SetColor("_EmissionColor", clr);
//Material mat = new Material(curObjRenderers[i].material);
//mat.SetColor("_EmissionColor", new Color(0 / 255f, 50f / 255f, 0f / 255f)); // 0 50 0
}
}
if (dim == "2D" && type == "lamp" && this.gameObject.GetComponent<ButtonCheckable3>() != null)
{
this.gameObject.GetComponent<ButtonCheckable3>().EnableSprite(newState);
}
if (dim == "3D" && type == "lampNcolor")
{
Renderer[] objRenderers = this.gameObject.transform.GetComponentsInChildren<Renderer>();
for (int i = 0; i < objRenderers.Length; i++)
{
Color clr = new Color(0f / 255f, 0f / 255f, 0f / 255f); // черный
if (newState >= 1) // желтый
clr = new Color(100f / 255f, 65f / 255f, 0f / 255f);
//if (newState == 1) // красный
// clr = new Color(30f / 255f, 0f / 255f, 0f / 255f);
objRenderers[i].material.SetColor("_EmissionColor", clr);
}
}
if (dim == "2D" && type == "toggle2pos" && this.gameObject.GetComponent<Switch>() != null)
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
this.gameObject.GetComponent<Switch>().setState(newState);
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "2D" && type == "toggleNpos" && this.gameObject.GetComponent<Switch>() != null)
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
this.gameObject.GetComponent<Switch>().setState(newState);
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "2D" && type == "toggle3pos" && this.gameObject.GetComponent<SwitchHold>() != null)
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
{
if (newState == 0)
this.gameObject.GetComponent<SwitchHold>().setState(1); // лево
if (newState == 1)
this.gameObject.GetComponent<SwitchHold>().setState(2); // право
if (newState == 2)
this.gameObject.GetComponent<SwitchHold>().setState(0); // центр
}
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "3D" && type == "toggleHorizontal" && this.gameObject.GetComponent<Switch3DHRotate>() != null)
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
this.gameObject.GetComponent<Switch3DHRotate>().RotateHorizontalSwitch(newState);
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "3D" && type == "toggleVertical" && this.gameObject.GetComponent<Switch3DRotate>() != null)
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
this.gameObject.GetComponent<Switch3DRotate>().RotateVertikalSwitch(newState);
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "3D" && type == "toggleNpos")
{ // в 3D игнорируем, все равно не видно...
}
if (dim == "2D" && type == "cubeButton" && this.gameObject.GetComponent<ButtonCubik>() != null)
{
this.gameObject.GetComponent<ButtonCubik>().SetView(newState);
}
if (dim == "2D" && type == "tumblerRotate")
{
if (this.states != null && newState >= 0 && newState < this.states.Count)
this.gameObject.transform.localRotation = Quaternion.Euler(0f, 0f, 180-this.states[newState].uval);
else
Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name);
}
if (dim == "3D" && type == "tumblerRotate")
{
if (this.stateInRange != null) // newState - значение в интервале физических значений (min..max),
{ // конвертируем в значение Unity в интервале (umin..umax), даже если одно и то же
int uNewState = newState;
if ((this.stateInRange.max - this.stateInRange.min) != 0 && (this.stateInRange.umax - this.stateInRange.umin) != 0)
{
uNewState = this.stateInRange.umin + (int)(((float)(newState - this.stateInRange.min) / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
//uNewState = (int)(((float)newState / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
//if (uNewState < this.stateInRange.umin) uNewState = this.stateInRange.umin;
//if (uNewState > this.stateInRange.umax) uNewState = this.stateInRange.umax;
}
this.gameObject.transform.localRotation = Quaternion.Euler(this.gameObject.transform.localRotation.eulerAngles.x, this.gameObject.transform.localRotation.eulerAngles.y, uNewState);
}
}
if (dim == "2D" && type == "handleRotate")
{
mfiArrowNumber arrowScript = this.gameObject.GetComponent<mfiArrowNumber>();
if (arrowScript != null)
{
float ang = arrowScript.TransformStateToAngle(newState);
this.gameObject.GetComponent<Handler>().SetCurAngle(ang);
}
else
if (this.stateInRange != null) // newState - значение в интервале физических значений (min..max),
{ // конвертируем в значение Unity в интервале (umin..umax), даже если одно и то же
int uNewState = newState;
if ((this.stateInRange.max - this.stateInRange.min) != 0 && (this.stateInRange.umax - this.stateInRange.umin) != 0)
{
uNewState = this.stateInRange.umin + (int)(((float)(newState - this.stateInRange.min) / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
//if (uNewState < this.stateInRange.umin) uNewState = this.stateInRange.umin;
//if (uNewState > this.stateInRange.umax) uNewState = this.stateInRange.umax;
}
//this.gameObject.transform.localRotation = Quaternion.Euler(0f, 0f, newState);
if(this.gameObject.GetComponent<Handler>() != null)
{
this.gameObject.GetComponent<Handler>().SetCurAngle(uNewState);
}
}
if (name == "Rampa0901" || name == "Rampa0902") man.cur090XangleHor = newState; //педали
if (name == "view3_0801" || name == "view3_0802") man.cur080XangleHor = newState;
if (name == "view2_0801" || name == "view2_0802") man.cur080XangleVert = newState;
if (name == "Handle3_0701" || name == "Handle3_0702") man.cur070XangleVert = newState;
}
if (dim == "3D" && type == "handleRotate")
{
if (callerObj != null && this.stateInRange != null)
{
int uNewState = newState;
if ((this.stateInRange.max - this.stateInRange.min) != 0 && (this.stateInRange.umax - this.stateInRange.umin) != 0)
{
uNewState = this.stateInRange.umin + (int)(((float)(newState - this.stateInRange.min) / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
//if (uNewState < this.stateInRange.umin) uNewState = this.stateInRange.umin;
//if (uNewState > this.stateInRange.umax) uNewState = this.stateInRange.umax;
}
if (this.gameObject.GetComponent<rotate3DPedals>() != null)
{
if (callerObj.name == "Rampa0901" || callerObj.name == "Rampa0902")
this.gameObject.GetComponent<rotate3DPedals>().RotatePedals(uNewState);
if (callerObj.name == "view3_0801" || callerObj.name == "view3_0802")
this.gameObject.GetComponent<rotate3DPedals>().RotateLeverHorizontal(uNewState);
if (callerObj.name == "view2_0801" || callerObj.name == "view2_0802")
this.gameObject.GetComponent<rotate3DPedals>().RotateLeverVertical(uNewState);
if (callerObj.name == "Handle3_0701" || callerObj.name == "Handle3_0702")
this.gameObject.GetComponent<rotate3DPedals>().RotateLeverOneVertical(uNewState);
if(callerObj.name == "Handle1_1001")
this.gameObject.GetComponent<rotate3DPedals>().RotateLeverOneVertical(uNewState);
}
}
}
if (dim == "2D" && type == "cover" && this.gameObject.GetComponent<Cover>() != null && this.states != null)
{
this.gameObject.GetComponent<Cover>().setState(newState);
// частные случаи работы крышек, переключателей и др., не предусматриваемые механикой файла objects.xml - короче "костыли"
if (this.name == "Cover1_0506" && this.curState == 1 && newState == 0)
for(int i=1;i<=8;i++)
{
UnityObject tumblerUO = man.objects.Find("Tumbler" + i + "_0506"); // опускаем вниз 8 тумблеров
tumblerUO.enabled = true; tumblerUO.SetObjectState(0); tumblerUO.enabled = false;
}
}
if (dim == "2D" && type == "cover2" && this.gameObject.GetComponent<Cover2>() != null && this.states != null)
{
this.gameObject.GetComponent<Cover2>().EnableSprite(newState);
}
if (dim == "3D" && type == "cover3Dv" && this.gameObject.GetComponent<Cover3DVrotate>() != null && this.states != null)
{
this.gameObject.GetComponent<Cover3DVrotate>().Rotate(newState+1);
}
if (dim == "3D" && type == "cover3Dh" && this.gameObject.GetComponent<Cover3DHrotate>() != null && this.states != null)
{
this.gameObject.GetComponent<Cover3DHrotate>().RotateH(newState + 1);
}
if (dim == "2D" && type == "indicator" && this.gameObject.GetComponent<Indicator>() != null && this.stateInRange != null)
{
Indicator indicatorScript = this.gameObject.GetComponentInChildren<Indicator>();
float newAngle = indicatorScript.TransformStateToAngle(newState);
this.gameObject.GetComponent<Indicator>().setState(newAngle); //(int)Math.Round(
}
if (dim == "2D" && type == "arrowIndicator" && this.stateInRange != null)
{
bool isActive = this.gameObject.activeSelf;
this.gameObject.SetActiveRecursively(true);
mfiArrowNumber arrowScript = this.gameObject.GetComponentInChildren<mfiArrowNumber>();
Handler arrowHandlerScript = this.gameObject.GetComponentInChildren<Handler>();
if (arrowScript == null || arrowHandlerScript == null)
Debug.LogError("arrowIndicator " + this.name + " have no script component.");
else
{
float newAngle = arrowScript.TransformStateToAngle(newState);
if (arrowScript != null && arrowHandlerScript != null)
{
arrowScript.setState(newAngle);
arrowHandlerScript.SetCurAngle(newAngle);
}
}
this.gameObject.SetActiveRecursively(isActive);
}
if (dim == "2D" && type == "clockIndicator" && this.gameObject.GetComponent<mfiClockIndicator>() != null)
{
this.gameObject.GetComponent<mfiClockIndicator>().setState(newState);
}
if (dim == "2D" && type == "dragScale" && this.stateInRange != null && this.gameObject.GetComponent<DragCollider>() != null)
{
int uNewState = newState;
if ((this.stateInRange.max - this.stateInRange.min) != 0 && (this.stateInRange.umax - this.stateInRange.umin) != 0)
{
//uNewState = (int)(((float)newState / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
uNewState = this.stateInRange.umin + (int)(((float)(newState - this.stateInRange.min) / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
}
this.gameObject.GetComponent<DragCollider>().SetState(uNewState);
}
if (dim == "2D" && type == "dragScale112" && this.stateInRange != null && this.gameObject.GetComponent<drCol112>() != null)
{
int uNewState = newState;
if ((this.stateInRange.max - this.stateInRange.min) != 0 && (this.stateInRange.umax - this.stateInRange.umin) != 0)
{
//uNewState = (int)(((float)newState / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
uNewState = this.stateInRange.umin + (int)(((float)(newState - this.stateInRange.min) / ((float)this.stateInRange.max - (float)this.stateInRange.min)) * ((float)this.stateInRange.umax - (float)this.stateInRange.umin));
}
this.gameObject.GetComponent<drCol112>().SetState(uNewState);
}
if (dim == "2D" && type.EndsWith("textField"))
{
TextMeshPro tmp = this.gameObject.GetComponent<TextMeshPro>();
if (tmp == null)
{
Debug.LogError("В объекте " + this.name + " с типом textField отсутствует TextMeshPro.");
return false;
}
if (!setTextFieldAsFloat)
tmp.text = newState.ToString();
else
tmp.text = string.Format(CultureInfo.InvariantCulture, "{0:0.0}", newState/10f); //{0:F1}
if (type == "o_textField" && tmp.text != "")
tmp.text = "\u25CF " + tmp.text;
if(this.stateText != null)
{
this.stateText.curtext = tmp.text; this.stateText.curcolor = this.textcolor;
}
tmp.color = Color.white;
if (this.textcolor == "red") tmp.color = Color.red;
if (this.textcolor == "green") tmp.color = Color.green;
if (this.textcolor == "yellow") tmp.color = Color.yellow;
if (this.textcolor == "white") tmp.color = Color.white;
}
// частные случаи работы крышек, переключателей и др., не предусматриваемые механикой файла objects.xml - короче "костыли"
//if (name == "Cover1_0502" && newState == 0)
// man.objects.Find("Tumbler2_0502").SetObjectState(2);
//if (name == "Cover2_0511" && newState == 0)
// man.objects.Find("Tumbler2_0511").SetObjectState(0);
curState = newState;
return true;
} //SetObjectState
public void SetObjectText(string newtext, string newcolor, UnityObject callerObj = null)
{
if (man == null)
man = GameObject.Find("Manager").GetComponent<Manager>();
if (!enabled) return;
// изменяем состояния объектов с таким же именем на других панелях МФИ
if (this.name.StartsWith("mfi") && ((callerObj != null && !callerObj.name.StartsWith("mfi")) || callerObj == null) && this.type != "")
for (int i = 1; i <= 5; i++)
{
if (this.name.StartsWith("mfi" + i.ToString())) continue; // не передаём состояния на другие МФИ:
if (this.name.Length > 11 && this.name.Substring(5, 6) == "Button") break; // кнопок (по периметру экрана)
if (this.name.Length > 9 && this.name.Substring(5, 4) == "Lamp") break; // надписей (по периметру экрана)
UnityObject linkedUO = man.objects.Find("mfi" + i.ToString() + this.name.Substring(4));
if (linkedUO != null) linkedUO.SetObjectText(newtext, newcolor, this);
}
if (this.stateText == null)
{
this.stateText = new ObjectTextState();
this.stateText.text = "0";
}
this.stateText.curtext = newtext; this.stateText.curcolor = newcolor;
TextMeshPro tmp = this.gameObject.GetComponent<TextMeshPro>();
if (tmp == null) {
Debug.LogError("В объекте " + this.name + " с типом textField отсутствует TextMeshPro.");
return;
}
if (this.type == "o_textField" && newtext != "")
newtext = "\u25CF " + newtext;
tmp.text = newtext;
tmp.color = Color.white;
if (newcolor == "red") tmp.color = Color.red;
if (newcolor == "green") tmp.color = Color.green;
if (newcolor == "yellow") tmp.color = Color.yellow;
if (newcolor == "white") tmp.color = Color.white;
}
public List<UnityObject> FindChildsWithTag(string tag)
{
List<UnityObject> list = new List<UnityObject>();
if (this.childs != null)
foreach (UnityObject rootobj in this.childs.obj)
FindTagRecurs(rootobj);
return list;
void FindTagRecurs(UnityObject obj)
{
if (obj.tag == tag)
list.Add(obj);
if (obj.childs != null)
foreach (UnityObject _obj in obj.childs.obj)
FindTagRecurs(_obj);
}
}
/*
public UnityObject CloneWithStringReplace(string oldStr, string newStr)
{
Debug.Log(" - to " + newStr + ": start");
UnityObject res;
if(serializer == null)
serializer = new XmlSerializer(this.GetType());
Stream fs = new MemoryStream(0);// utf8.GetBytes(scText)
StreamWriter writer = new StreamWriter(fs);
serializer.Serialize(writer.BaseStream, this);
fs.Position = 0;
byte[] buf = new byte[fs.Length + 10];
fs.Read(buf, 0, buf.Length);
writer.Close();
fs.Dispose(); writer.Dispose();
Debug.Log(" - to " + newStr + ": Serialized ("+ buf.Length+" bytes)");
//if (man == null)
// man = GameObject.Find("Manager").GetComponent<Manager>();
//man.memLeak += buf.Length;
if (oldStr != "")
{
Encoding encoding = Encoding.Default;
string st = System.Text.Encoding.UTF8.GetString(buf, 0, buf.Length).ToString().Replace(oldStr, newStr);
buf = encoding.GetBytes(st);
}
fs = new MemoryStream(buf);
StreamReader reader = new StreamReader(fs);
res = (UnityObject)serializer.Deserialize(reader.BaseStream);
reader.Close();
if (res == null)
Debug.Log("Error: UnityObject clone fail");
fs.Dispose(); reader.DiscardBufferedData(); reader.Dispose();
Debug.Log(" - to " + newStr + ": Deserialized");
return res;
}
*/
} // UnityObject
public class UnityObjectChilds
{
[XmlElement("object")]
public List<UnityObject> obj = new List<UnityObject>();
}
public class DefaultObjectState
{
[XmlAttribute("enabled")]
public bool enabled = true;
[XmlAttribute("value")]
public int value;
}
public class ObjectState
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("uval")]
public int uval;
}
public class ObjectTextState
{
[XmlAttribute("text")]
public string text;
[XmlAttribute("color")]
public string color;
[XmlIgnore]
public string curtext;
[XmlIgnore]
public string curcolor;
}
public class ObjectStateInRange
{
[XmlAttribute("min")]
public int min;
[XmlAttribute("max")]
public int max;
[XmlAttribute("umin")]
public int umin;
[XmlAttribute("umax")]
public int umax;
}
public class LinkedUnityObject
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("type")]
public string type;
[XmlElement("setState")]
public List<LinkedUnityObjectSetState> setState; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<..>();
[XmlElement("setValue")]
public List<string> setCurVal; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<..>();
// создавать только один элемент с пустой строкой, чтобы в xml имело вид <setValue />
[XmlElement("set")]
public List<LinkedUnityObjectSet> set; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<..>();
}
public class LinkedUnityObjectSetState
{
[XmlAttribute("value")]
public int value;
}
public class LinkedUnityObjectSet
{
[XmlAttribute("enabled")]
public string enabled;
[XmlAttribute("visible")]
public string visible="";
}
//public class LinkedUnityObjectSetValue
//{
//public LinkedUnityObjectSetValue() { }
// [XmlAttribute("current")]
// public bool curVal { get; set; }
//}
public class ObjectErrorMessage
{
[XmlAttribute("message")]
public string msg;
}
public class ObjectDescription
{
[XmlAttribute("text")]
public string text;
}