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 obj = new List(); [XmlIgnore] Manager man; [XmlIgnore] public bool isLoaded = false; [XmlIgnore] public bool isXMLLoaded = false; public void Start() { if (man == null) man = GameObject.Find("Manager").GetComponent(); } public IEnumerator Load() { bool isWeb; string path = Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml"); string objectsText = ""; if(man == null) man = GameObject.Find("Manager").GetComponent(); Transform[] allPanels2D = man.canvas.transform.GetChild(0).GetComponentsInChildren(); Transform[] allPanels3D = man.copter.GetComponentsInChildren(); //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 recursList = new List(); //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 _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 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(); //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 linkedObj = new LinkedUnityObject(); linkedObj.name = object3D.name; linkedObj.type = object3D.type; if (!uObj.name.StartsWith("Panel")) { linkedObj.setState = new List(); // тренировочные примеры 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 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); 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(); uObj.states.Clear(); ObjectState objSt; int min = 360; int max = -360; foreach (CircleCollider2D gr in uObj.gameObject.transform.parent.GetComponentsInChildren()) { 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() != 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() != null) { min = (int)uObj.gameObject.GetComponent().endDragMin; max = (int)uObj.gameObject.GetComponent().endDragMax; def = (int)uObj.gameObject.GetComponent().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(); 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(); 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(); 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(); if (man.objects.isXMLLoaded && Application.platform != RuntimePlatform.WebGLPlayer) Serialize(this, Path.Combine(Application.streamingAssetsPath, "Objects", "Objects.xml")); } int CheckForExcessObjects(List 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(); //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(); 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(); 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(); 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(); 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="" // [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 states; // по умолчанию отсутствует, неоходимо создавать с помощью = new List(); [XmlElement("stateRange")] // состояние объекта в интервале min..max public ObjectStateInRange stateInRange; // по умолчанию отсутствует, неоходимо создавать с помощью = new ObjectStateRange() [XmlElement("stateText")] // состояние объекта string public ObjectTextState stateText; // по умолчанию отсутствует, неоходимо создавать с помощью = new ObjectTextState() [XmlElement("linkedObject")] public List linkedObjects; // по умолчанию отсутствует, неоходимо создавать с помощью = new List() [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(); if (!enabled) return true; UnityObject linkedObj = null; // изменяем состояния связанным объектам if(this.linkedObjects != null) for(int i=0;i= 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() != null) { if (newState == 0) this.gameObject.GetComponent().OnUp(); else this.gameObject.GetComponent().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() 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(); // if (bc == null) // Debug.Log(this.name); //} if (dim == "2D" && type == "buttonCheckable" && this.gameObject.GetComponent() != null) { this.gameObject.GetComponent().SetState(newState); } if (dim == "2D" && type == "lampButton" && this.gameObject.GetComponent() != null) { if (newState == 0) this.gameObject.GetComponent().EnableSprite(1); if (newState == 1) this.gameObject.GetComponent().EnableSprite(0); if (newState == 2 || newState == 3) this.gameObject.GetComponent().EnableSprite(newState); } if (dim == "3D" && type == "lamp3color") { Renderer[] objRenderers = this.gameObject.transform.GetComponentsInChildren(); 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() != null) { this.gameObject.GetComponent().EnableSprite(newState); } if (dim == "3D" && type == "lampNcolor") { Renderer[] objRenderers = this.gameObject.transform.GetComponentsInChildren(); 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() != null) { if (this.states != null && newState >= 0 && newState < this.states.Count) this.gameObject.GetComponent().setState(newState); else Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name); } if (dim == "2D" && type == "toggleNpos" && this.gameObject.GetComponent() != null) { if (this.states != null && newState >= 0 && newState < this.states.Count) this.gameObject.GetComponent().setState(newState); else Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name); } if (dim == "2D" && type == "toggle3pos" && this.gameObject.GetComponent() != null) { if (this.states != null && newState >= 0 && newState < this.states.Count) { if (newState == 0) this.gameObject.GetComponent().setState(1); // лево if (newState == 1) this.gameObject.GetComponent().setState(2); // право if (newState == 2) this.gameObject.GetComponent().setState(0); // центр } else Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name); } if (dim == "3D" && type == "toggleHorizontal" && this.gameObject.GetComponent() != null) { if (this.states != null && newState >= 0 && newState < this.states.Count) this.gameObject.GetComponent().RotateHorizontalSwitch(newState); else Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name); } if (dim == "3D" && type == "toggleVertical" && this.gameObject.GetComponent() != null) { if (this.states != null && newState >= 0 && newState < this.states.Count) this.gameObject.GetComponent().RotateVertikalSwitch(newState); else Debug.LogError("Ошибка установки состояния " + newState + " объекта " + this.name); } if (dim == "3D" && type == "toggleNpos") { // в 3D игнорируем, все равно не видно... } if (dim == "2D" && type == "cubeButton" && this.gameObject.GetComponent() != null) { this.gameObject.GetComponent().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(); if (arrowScript != null) { float ang = arrowScript.TransformStateToAngle(newState); this.gameObject.GetComponent().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() != null) { this.gameObject.GetComponent().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() != null) { if (callerObj.name == "Rampa0901" || callerObj.name == "Rampa0902") this.gameObject.GetComponent().RotatePedals(uNewState); if (callerObj.name == "view3_0801" || callerObj.name == "view3_0802") this.gameObject.GetComponent().RotateLeverHorizontal(uNewState); if (callerObj.name == "view2_0801" || callerObj.name == "view2_0802") this.gameObject.GetComponent().RotateLeverVertical(uNewState); if (callerObj.name == "Handle3_0701" || callerObj.name == "Handle3_0702") this.gameObject.GetComponent().RotateLeverOneVertical(uNewState); if(callerObj.name == "Handle1_1001") this.gameObject.GetComponent().RotateLeverOneVertical(uNewState); } } } if (dim == "2D" && type == "cover" && this.gameObject.GetComponent() != null && this.states != null) { this.gameObject.GetComponent().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() != null && this.states != null) { this.gameObject.GetComponent().EnableSprite(newState); } if (dim == "3D" && type == "cover3Dv" && this.gameObject.GetComponent() != null && this.states != null) { this.gameObject.GetComponent().Rotate(newState+1); } if (dim == "3D" && type == "cover3Dh" && this.gameObject.GetComponent() != null && this.states != null) { this.gameObject.GetComponent().RotateH(newState + 1); } if (dim == "2D" && type == "indicator" && this.gameObject.GetComponent() != null && this.stateInRange != null) { Indicator indicatorScript = this.gameObject.GetComponentInChildren(); float newAngle = indicatorScript.TransformStateToAngle(newState); this.gameObject.GetComponent().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(); Handler arrowHandlerScript = this.gameObject.GetComponentInChildren(); 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() != null) { this.gameObject.GetComponent().setState(newState); } if (dim == "2D" && type == "dragScale" && this.stateInRange != null && this.gameObject.GetComponent() != 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().SetState(uNewState); } if (dim == "2D" && type == "dragScale112" && this.stateInRange != null && this.gameObject.GetComponent() != 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().SetState(uNewState); } if (dim == "2D" && type.EndsWith("textField")) { TextMeshPro tmp = this.gameObject.GetComponent(); 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(); 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(); 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 FindChildsWithTag(string tag) { List list = new List(); 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(); //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 obj = new List(); } 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 setState; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<..>(); [XmlElement("setValue")] public List setCurVal; // по умолчанию отсутствует, неоходимо создавать с помощью = new List<..>(); // создавать только один элемент с пустой строкой, чтобы в xml имело вид [XmlElement("set")] public List 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; }