mirror of
https://gitea.msk.dinamika-avia.ru/Constanta-Design/MI-38.git
synced 2026-01-23 15:25:44 +03:00
1711 lines
87 KiB
C#
1711 lines
87 KiB
C#
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;
|
||
} |