using QFramework; using QFramework.Example; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using XMLTool; using static UnityEditor.Progress; public class Body3DController : MonoSingleton { Body3DController() { } Dictionary objs = new Dictionary(); bool selectIsGroup = false; public List isOnList = new List(); public override void OnSingletonInit() { base.OnSingletonInit(); TypeEventSystem.Global.Register((arg) => { Refresh(); }).UnRegisterWhenGameObjectDestroyed(gameObject); TypeEventSystem.Global.Register(OnClear); TypeEventSystem.Global.Register(OnToggleSelectType); TypeEventSystem.Global.Register(OnBody3DSelectedHandler); } private void OnBody3DSelectedHandler(OnBody3DSelected selected) { if (selected.isOn) { if (isOnList.Contains(selected.obj) == false) { if (selectIsGroup == false) { ClearObjectToggle(); } isOnList.Add(selected.obj); } } else { if (isOnList.Contains(selected.obj)) { isOnList.Remove(selected.obj); selected.obj.GetComponent().Set(false); } } } public void Active(GameObject obj, bool isActive, bool isOther) { if (isOther) { foreach (var item in objs) { if (item.Key != obj) { item.Key.SetActive(isOther); } } } else { obj.SetActive(isActive); } } public void Transparent(GameObject obj, bool isTransparent, bool isOther) { if (isOther) { foreach (var item in objs) { if (item.Key != obj) { Utility.SetSurfaceType(item.Key.GetComponent().material, isTransparent); } } } else { Utility.SetSurfaceType(obj.GetComponent().material, isTransparent); } } private void OnToggleSelectType(OnBody3DGroupTypeChanged type) { selectIsGroup = type.isGroup; } private void OnClear(OnModuleQuit quit) { Clear(); } public void Refresh() { Parser(Global.Instance.cur3DPart); } public void Parser(Body3D.Body body) { GameObject obj = Utility.FindObj(body.Path); var bodyObjItem = obj.GetOrAddComponent(); bodyObjItem.Init(body); objs.Add(obj, bodyObjItem); if (body.subBody != null) { foreach (var item in body.subBody) { Parser(item.Value); } } } private void Update() { if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false) { // 从相机发射一条射线到当前鼠标位置 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { GameObject obj = hit.collider.gameObject; } else { if (selectIsGroup == false) { ClearObjectToggle(); } } } } public void ClearObjectToggle() { for (int i = isOnList.Count - (1); i >= 0; i--) { isOnList[i].GetComponent().Set(false); } } public void Clear() { objs.Clear(); } }