using System; using UniRx; using UnityEngine; using UnityEngine.EventSystems; public class PowerManager : MonoSingleton { //public GameObject PowerModel; public CreationMode CreateMode; public string powerName;//实例化物体名称 public LayerMask layerMask = -1; public bool isEnabled; public bool isCreate; public bool isWarningLine; public bool isHideName; private GameObject PowerGroup; private Vector3 Pos1;//第一碰撞点 private Vector3 Pos2;//第二碰撞点 public TaskType taskType; public DisposalPlanMode PlanMode; public Transform NodeParent; public string PlanName; public PlanController planController; public PowerButtonType powerButtonType; //快捷键 //功能键 public KeyCode fn = KeyCode.LeftShift; //主臂上仰 public KeyCode up = KeyCode.W; //主臂下俯 public KeyCode down = KeyCode.S; //转台左转 public KeyCode leftR = KeyCode.A; //转台右转 public KeyCode rightR = KeyCode.D; //水炮(枪)上扬 public KeyCode waterGunUp = KeyCode.U; //水炮(枪)下俯 public KeyCode waterGunDown = KeyCode.J; //水枪射程增加 public KeyCode hoseIncrease = KeyCode.Equals; //水枪射程缩短 public KeyCode hoseReduce = KeyCode.Minus; //重置 public KeyCode reset = KeyCode.R; private void Start() { Hide(); Observable.EveryUpdate() .Subscribe(_ => InstantiatePower()); Observable.EveryLateUpdate() .Subscribe(_ => { if(MainMenu.Instance.MenuMode == MainMenuMode.态势标绘) { if (Input.GetKey(KeyCode.LeftArrow)) { LeftRotate(); } if (Input.GetKey(KeyCode.RightArrow)) { RightRotate(); } if (Input.GetKey(KeyCode.Delete)) { PowerDelete(); } if (Input.GetKeyDown(KeyCode.F)) { PowerFocus(); } } }).AddTo(gameObject); } public void Show() { Instance.gameObject.SetActive(true); } public void Hide() { Instance.gameObject.SetActive(false); } public void Initialization() { switch (CreateMode) { case CreationMode.Single: isCreate = true; isWarningLine = false; break; case CreationMode.Multipoint: isCreate = false; isWarningLine = false; break; case CreationMode.Pipeline: isCreate = false; if (powerName == "JJX") isWarningLine = true; else isWarningLine = false; break; } } private async void InstantiatePower() { if (isEnabled) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, layerMask)) { if (!EventSystem.current.IsPointerOverGameObject()) { if (Input.GetMouseButtonDown(0)) { switch (CreateMode) { case CreationMode.Effact: if (hit.collider.GetComponent()) { if (hit.collider.GetComponent().Power) { var id = hit.collider.GetComponent().floorId; Pos1 = new Vector3(hit.point.x, hit.point.y, hit.point.z); var prefab= AssetManager.Instance.powerEffacts.Find(go => go.name == powerName); GameObject power = Instantiate(prefab, Pos1, Quaternion.identity) as GameObject; power.transform.parent = transform.Find("Powers" + id); power.name = $"{powerName}{AX.Network.Common.GUID.NewGuid()}"; //PowerSelectionManager.Sets.Add(power); SelectionManager.Instance.Sets.Add(power); } } break; case CreationMode.Single: if (isCreate) { if (hit.collider.GetComponent()) { if (hit.collider.GetComponent().Power) { var id = hit.collider.GetComponent().floorId; Pos1 = new Vector3(hit.point.x, hit.point.y, hit.point.z); //GameObject power = Instantiate(AssetManager.Instance.Powers.Find(p => p.name == powerName), Pos1, Quaternion.identity) as GameObject; var p = transform.Find("Powers" + id); var power = await PowerPool.Instance.GetPower(powerName, Pos1, Quaternion.identity, p); power.name = $"{powerName}{AX.Network.Common.GUID.NewGuid()}"; //PowerSelectionManager.Sets.Add(power); SelectionManager.Instance.Sets.Add(power); } } } break; case CreationMode.Multipoint: if (hit.collider.GetComponent()) { var id = hit.collider.GetComponent().floorId; if (hit.collider.GetComponent().Power) { if (!isCreate) { Pos1 = new Vector3(hit.point.x, hit.point.y, hit.point.z); isCreate = true; PowerGroup = new GameObject(); PowerGroup.transform.parent = transform.Find("Powers" + id); PowerGroup.name = $"{"Powers"}{id}{"|Group"}{powerName}{AX.Network.Common.GUID.NewGuid()}"; } else { Vector3 vertPos; Pos2 = new Vector3(hit.point.x, hit.point.y, hit.point.z); var ABdistance = Vector3.Distance(Pos1, Pos2); int count = Mathf.FloorToInt(ABdistance / 2); if (count < 1) count = 1; for (int i = 0; i < count; i++) { vertPos = new Vector3(Pos1.x + (i / (float)count) * (Pos2.x - Pos1.x), Pos1.y + (i / (float)count) * (Pos2.y - Pos1.y), Pos1.z + (i / (float)count) * (Pos2.z - Pos1.z)); //GameObject power = Instantiate(AssetManager.Instance.Powers.Find(p => p.name == powerName), vertPos, Quaternion.identity) as GameObject; var power = await PowerPool.Instance.GetPower(powerName, vertPos, Quaternion.identity, PowerGroup.transform); power.name = $"{powerName}{AX.Network.Common.GUID.NewGuid()}"; power.transform.forward = (-(Pos2 - Pos1)).normalized; //PowerSelectionManager.Sets.Add(power); SelectionManager.Instance.Sets.Add(power); } Pos1 = Pos2; } } } break; case CreationMode.Pipeline: Transform parent = null; if (hit.collider.GetComponent()) { if (hit.collider.GetComponent().Power) parent = transform.Find("Powers" + hit.collider.GetComponent().floorId); } if (hit.collider.CompareTag("power")) { parent = hit.collider.transform.parent; } if (hit.collider.CompareTag("Equipment")) { var EquipmentParent = hit.collider.transform.parent; var num = EquipmentParent.name.Substring(10); parent = transform.Find("Powers" + num); } if (parent != null) { if (!isCreate) { Pos1 = new Vector3(hit.point.x, hit.point.y, hit.point.z); isCreate = true; PowerGroup = new GameObject(); PowerGroup.transform.parent = parent; PowerGroup.name = $"{parent.name}{"|Group"}{powerName}{AX.Network.Common.GUID.NewGuid()}"; } else { Pos2 = new Vector3(hit.point.x, hit.point.y, hit.point.z); Vector3 tempPos = (Pos1 + Pos2) / 2; //GameObject power = Instantiate(AssetManager.Instance.Powers.Find(p => p.name == powerName), tempPos, Quaternion.identity) as GameObject; var power = await PowerPool.Instance.GetPower(powerName, tempPos, Quaternion.identity, PowerGroup.transform); power.name = $"{powerName}{Guid.NewGuid()}"; power.transform.forward = (-(Pos2 - Pos1)).normalized; //power.transform.parent = PowerGroup.transform; power.transform.up = (power.transform.position - Pos1).normalized; //PowerSelectionManager.Sets.Add(power); SelectionManager.Instance.Sets.Add(power); float distance = Vector3.Distance(Pos1, Pos2);//计算两点的距离 power.transform.localScale = new Vector3(1f, distance * 2, 1f); if (!isWarningLine) Pos1 = Pos2; else { isCreate = false; } } } break; } } } } } } private void LeftRotate() { var list = SelectionManager.GetSelectedObjects(); foreach (GameObject go in list) { go.transform.Rotate(0, Time.deltaTime * -60, 0, Space.World); } } private void RightRotate() { var list = SelectionManager.GetSelectedObjects(); foreach (GameObject go in list) { go.transform.Rotate(0, Time.deltaTime * 60, 0, Space.World); } } private void PowerDelete() { var list = SelectionManager.GetSelectedObjects(); foreach (GameObject go in list) { SelectionManager.Instance.Sets.Remove(go); if (go != null) { if (go.GetComponent().PowerMode == CreationMode.Single|| go.GetComponent().PowerMode == CreationMode.Effact) { Destroy(go); } else { Destroy(go.transform.parent.gameObject); } } } } /// /// 聚焦选中物体 /// private void PowerFocus() { if (SelectionManager.Instance. SingleObject!= null) { var pos = SelectionManager.Instance.SingleObject.transform.position; Camera.main.GetComponent().target.position = new Vector3(pos.x, pos.y + 1, pos.z); Camera.main.GetComponent().distance = 5f; } } /// /// 清除全部力量 /// public void ClearAll() { if(MainMenu.Instance.MenuMode == MainMenuMode.态势标绘) { foreach (GameObject go in SelectionManager.Instance.Sets) { if (go != null) { if (go.GetComponent().selectMode == SelectMode.Single) Destroy(go); else Destroy(go.transform.parent.gameObject); } } SelectionManager.Instance.Sets.Clear(); } } }