网上演练贵港万达广场(人员密集)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

634 lines
21 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using AX.MessageSystem;
using AX.NetworkSystem;
using UnityEngine.AI;
public class FireSpreadPanel : BaseAttributeSet {
private static FireSpreadPanel instance;
public static FireSpreadPanel Instance
{
get
{
if (instance == null)
{
GameObject obj = Resources.Load<GameObject>("Common/FireSpreadPanel");
GameObject clone = Instantiate(obj, GameObject.Find("Canvas").transform);
clone.transform.SetAsLastSibling();
clone.name = "FireSpreadPanel";
clone.transform.position = Vector3.zero;
instance = clone.GetComponent<FireSpreadPanel>();
instance.Init();
}
return instance;
}
}
InputField combustibleInputField;//燃烧物输入框
Dropdown combustibleDropdown;//燃烧物选择下拉框
Toggle combustibleToggle;//燃烧物输入和选择之间的切换
Dropdown InitialSizeDropdown;//火源初始大小设置下来框
InputField firePostion;//位置
Toggle roadSpread;//路径蔓延
Toggle areSpread;//区域蔓延
public Toggle aroundSpread;//四周蔓延
Toggle aotoSpread;//自动蔓延
Dropdown spreadSpeedDropdown;//蔓延速度
public bool isLoad;//是否是加载而不是换选蔓延方式和重置
Button sure;
Button Reset;
void Init()
{
combustibleInputField = transform.Find("Comburent/InputField").GetComponent<InputField>();
combustibleDropdown = transform.Find("Comburent/Dropdown").GetComponent<Dropdown>();
combustibleToggle = transform.Find("Comburent/Toggle").GetComponent<Toggle>();
firePostion = transform.Find("Position/InputField").GetComponent<InputField>();
InitialSizeDropdown = transform.Find("InitialSize/Dropdown").GetComponent<Dropdown>();
InitialSizeDropdown.onValueChanged.AddListener(InitialSizeSet);
roadSpread = transform.Find("FireSpread/SpreadType/RoadSpread").GetComponent<Toggle>();
roadSpread.onValueChanged.AddListener(RoadSpreadSelected);
areSpread = transform.Find("FireSpread/SpreadType/AreSpread").GetComponent<Toggle>();
areSpread.onValueChanged.AddListener(AreSpreadSelected);
aroundSpread = transform.Find("FireSpread/SpreadType/AroundSpread").GetComponent<Toggle>();
aroundSpread.onValueChanged.AddListener(AroundSpreadSelected);
aotoSpread = transform.Find("FireSpread/SpreadType/AotoSpread").GetComponent<Toggle>();
aotoSpread.onValueChanged.AddListener(AotoSpreadSelected);
spreadSpeedDropdown = transform.Find("FireSpread/SpreadSpeed/Dropdown").GetComponent<Dropdown>();
sure = transform.Find("Sure").GetComponent<Button>();
Reset = transform.Find("Reset").GetComponent<Button>();
}
public override void OnDisable()
{
base.OnDisable();
Close();
}
public override void OnDestroy()
{
base.OnDestroy();
InitialSizeDropdown.onValueChanged.RemoveListener(InitialSizeSet);
roadSpread.onValueChanged.RemoveListener(RoadSpreadSelected);
areSpread.onValueChanged.RemoveListener(AreSpreadSelected);
aroundSpread.onValueChanged.RemoveListener(AroundSpreadSelected);
aotoSpread.onValueChanged.RemoveListener(AotoSpreadSelected);
}
private void LoadUIDisaster()
{
if (GameSettings.othersSettings.isSelectedDisaster)
{
if (GameSettings.othersSettings.mode != Mode.DisasterManagement)
{//若是练习或演习模式进入导调组界面,则不可以修改
combustibleInputField.interactable = false;
combustibleDropdown.interactable = false;
combustibleToggle.interactable = false;
firePostion.interactable = false;
InitialSizeDropdown.interactable = false;
roadSpread.interactable = false;
areSpread.interactable = false;
aroundSpread.interactable = false;
aotoSpread.interactable = false;
spreadSpeedDropdown.interactable = false;
sure.interactable = false;
Reset.interactable = false;
//控制不能画蔓延范围
InputManager.skill = false;
InputManager.cloneObjType = CloneObjType.None;
}
else
{
if (!GameSettings.disasterSetting.isEdit)
{//若是灾情库设置模式的查看,则不可以修改
combustibleInputField.interactable = false;
combustibleDropdown.interactable = false;
combustibleToggle.interactable = false;
firePostion.interactable = false;
InitialSizeDropdown.interactable = false;
roadSpread.interactable = false;
areSpread.interactable = false;
aroundSpread.interactable = false;
aotoSpread.interactable = false;
spreadSpeedDropdown.interactable = false;
sure.interactable = false;
Reset.interactable = false;
//控制不能画蔓延范围
InputManager.skill = false;
InputManager.cloneObjType = CloneObjType.None;
}
else
{
//若是灾情库设置模式的编辑,则可以修改
}
}
}
}
private void InitialSizeSet(int arg0)
{
int selectedFireScale = int.Parse(InitialSizeDropdown.options[arg0].text.ToString());
MessageDispatcher.SendMessage(chooseObj.GetComponent<BaseGameObjInfo>().gameObjID, "FIRE_INITIALSIZE_SET", selectedFireScale);
}
private void RoadSpreadSelected(bool arg0)
{
if (arg0)
{
ResetSpreadPath();
spreadSpeedDropdown.interactable = true;
MessageDispatcher.SendMessage("ROAD_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
}
else
{
spreadSpeedDropdown.interactable = false;
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
MessageDispatcher.SendMessage("ROAD_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = -1;
}
}
private void AreSpreadSelected(bool arg0)
{
if (arg0)
{
ResetSpreadPath();
spreadSpeedDropdown.interactable = true;
MessageDispatcher.SendMessage("ARE_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
}
else
{
spreadSpeedDropdown.interactable = false;
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
MessageDispatcher.SendMessage("ARE_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = -1;
}
}
private void AroundSpreadSelected(bool arg0)
{
if (arg0)
{
ResetSpreadPath();
spreadSpeedDropdown.interactable = true;
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
MessageDispatcher.SendMessage("AROUND_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
}
else
{
spreadSpeedDropdown.interactable = false;
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
MessageDispatcher.SendMessage("AROUND_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = -1;
}
}
private void AotoSpreadSelected(bool arg0)
{
if (arg0)
{
ResetSpreadPath();
spreadSpeedDropdown.interactable = true;
MessageDispatcher.SendMessage("AOTO_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
}
else
{
spreadSpeedDropdown.interactable = false;
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
MessageDispatcher.SendMessage("AOTO_SPREAD_SELECTED", arg0);
CloneFireSpreadLine.instance.spreadedFireGameObjID = -1;
}
}
public override void OpenPanel()
{
if (!GameSettings.othersSettings.isStartDrill)
{
if (chooseObj.GetComponent<FireSpreadCtrl>().isSpreading)
{
LoadPromptWin.Instance.LoadTextPromptWindow("蔓延过程中不能重新设置!", 1f);
return;
}
}
else
{
LoadPromptWin.Instance.LoadTextPromptWindow("开始演练后不能设置!", 1f);
return;
}
base.OpenPanel();
LoadUIDisaster();
gameObject.SetActive(true);
}
/// <summary>
/// 打开火属性设置窗口时,加载数据
/// </summary>
public override void LoadObjData()
{
var fireSpreadCtrl = chooseObj.GetComponent<FireSpreadCtrl>();
//isLoad = true;
InputManager.skill = true;
InputManager.cloneObjType = CloneObjType.FireSpreadLine;
CloneFireSpreadLine.instance.spreadedFireGameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
RefreshFireAttribute(fireSpreadCtrl);
HideAllSpreadPath();
ShowSelectedFireSpreadPath();
}
/// <summary>
/// 刷新面板数据
/// </summary>
/// <param name="fireSpreadCtrl"></param>
private void RefreshFireAttribute(FireSpreadCtrl fireSpreadCtrl)
{
combustibleToggle.isOn = fireSpreadCtrl.combustibleInputWay;//设置燃烧物的输入方式
var fireAttribute = fireSpreadCtrl.fireAttribute;
if (!combustibleToggle.isOn)
{
List<Dropdown.OptionData> options = combustibleDropdown.options;
if (fireAttribute.comburent == "")
{
combustibleDropdown.value = 0;
}
else
{
for (int i = 0; i < options.Count; i++)
{
if (options[i].text == fireAttribute.comburent)
{
combustibleDropdown.value = i;
break;
}
}
}
combustibleInputField.text = "";
}
else
{
combustibleInputField.text = fireAttribute.comburent;
combustibleDropdown.value = 0;
}
firePostion.text = fireAttribute.position;
List<Dropdown.OptionData> InitialSizeOptions = InitialSizeDropdown.options;
if (fireAttribute.initialSize == 0)
{
InitialSizeDropdown.value = 2;
}
else
{
for (int i = 0; i < InitialSizeOptions.Count; i++)
{
if (InitialSizeOptions[i].text == fireAttribute.initialSize.ToString())
{
InitialSizeDropdown.value = i;
break;
}
}
}
if (!roadSpread.isOn && !areSpread.isOn && !aroundSpread.isOn && !aotoSpread.isOn)
{
isLoad = true;
}
switch (fireAttribute.spreadWay)
{
case SpreadWay.None:
roadSpread.isOn = false;
areSpread.isOn = false;
aroundSpread.isOn = false;
aotoSpread.isOn = false;
break;
case SpreadWay.Road:
roadSpread.isOn = true;
areSpread.isOn = false;
aroundSpread.isOn = false;
aotoSpread.isOn = false;
break;
case SpreadWay.Are:
roadSpread.isOn = false;
areSpread.isOn = true;
aroundSpread.isOn = false;
aotoSpread.isOn = false;
break;
case SpreadWay.Around:
roadSpread.isOn = false;
areSpread.isOn = false;
aroundSpread.isOn = true;
aotoSpread.isOn = false;
break;
case SpreadWay.Aoto:
roadSpread.isOn = false;
areSpread.isOn = false;
aroundSpread.isOn = false;
aotoSpread.isOn = true;
break;
default:
break;
}
List<Dropdown.OptionData> speedOptions = spreadSpeedDropdown.options;
if (fireAttribute.spreadSpeed == 0)
{
spreadSpeedDropdown.value = 0;
}
else
{
for (int i = 0; i < speedOptions.Count; i++)
{
if (speedOptions[i].text == fireAttribute.spreadSpeed.ToString())
{
spreadSpeedDropdown.value = i;
break;
}
}
}
CloneFireSpreadLine.instance.pathPoints.Clear();
foreach (Vector3 item in fireAttribute.pathPoints)
{
CloneFireSpreadLine.instance.pathPoints.Add(item);
}
CloneFireSpreadLine.instance.currentPathPointsCount = CloneFireSpreadLine.instance.pathPoints.Count;
if (CloneFireSpreadLine.instance.pathPoints.Count > 0)
{
CloneFireSpreadLine.instance.startPoint = CloneFireSpreadLine.instance.pathPoints[CloneFireSpreadLine.instance.pathPoints.Count - 1];
}
}
public override void ResetData(GameObject dataObj)
{
Cancel();
}
/// <summary>
/// 点击确定按钮
/// </summary>
public void Confirm()
{
if (roadSpread.isOn || areSpread.isOn || aroundSpread.isOn || aotoSpread.isOn)
{
if (spreadSpeedDropdown.value == 0)
{
string textPromptContent = "请选择蔓延速度!";
float stayTime = 1f;
LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime);
return;
}
if (CloneFireSpreadLine.instance.pathPoints.Count == 0 || CloneFireSpreadLine.instance.pathPoints.Count == 1)
{
string textPromptContent = "请设置蔓延路径或范围!";
float stayTime = 1f;
LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime);
return;
}
if (areSpread.isOn || aroundSpread.isOn)
{
if (CloneFireSpreadLine.instance.pathPoints.Count < 3)
{
string textPromptContent = "没有形成多边形!";
float stayTime = 1f;
LoadPromptWin.Instance.LoadTextPromptWindow(textPromptContent, stayTime);
return;
}
}
}
var fireSpreadCtrl = chooseObj.GetComponent<FireSpreadCtrl>();
var fireAttribute = fireSpreadCtrl.fireAttribute;
string comburent = "";
if (!combustibleToggle.isOn)
{
comburent = combustibleDropdown.options[combustibleDropdown.value].text.ToString();
}
else
{
comburent = combustibleInputField.text;
}
fireAttribute.comburent = comburent;
fireAttribute.position = firePostion.text;
int selectedFireScale = int.Parse(InitialSizeDropdown.options[InitialSizeDropdown.value].text.ToString());
fireAttribute.initialSize = selectedFireScale;
if (roadSpread.isOn)
{
fireAttribute.spreadWay = SpreadWay.Road;
}
else if (areSpread.isOn)
{
fireAttribute.spreadWay = SpreadWay.Are;
}
else if (aroundSpread.isOn)
{
fireAttribute.spreadWay = SpreadWay.Around;
}
else if (aotoSpread.isOn)
{
fireAttribute.spreadWay = SpreadWay.Aoto;
}
if (roadSpread.isOn || areSpread.isOn || aroundSpread.isOn || aotoSpread.isOn)
{
string spreadSpeed = spreadSpeedDropdown.options[spreadSpeedDropdown.value].text.ToString();
fireAttribute.spreadSpeed = int.Parse(spreadSpeed);
CloneFireSpreadLine.instance.SetPathPoints(fireAttribute.pathPoints);
CloneFireSpreadLine.instance.currentPathPointsCount = fireAttribute.pathPoints.Count;
fireSpreadCtrl.GetSpreadFirePositions();
}
//火初始状态同步
if (GameSettings.othersSettings.mode!=Mode.DisasterManagement)
{
FireOriginAttributeSyncData arg = new FireOriginAttributeSyncData();
arg.FireAttribute = fireAttribute;
arg.SendUserID = CurrentUserInfo.mySelf.Id;
arg.gameObjID = chooseObj.GetComponent<BaseGameObjInfo>().gameObjID;
NetworkManager.Default.SendAsync("FIRE_ORIGINAL_ATTRIBUTE", arg);
}
gameObject.SetActive(false);
}
public void Close()
{
HideAllSpreadPath();
CloneFireSpreadLine.instance.pathPoints.Clear();
InputManager.skill = false;
InputManager.cloneObjType = CloneObjType.None;
isLoad = false;
gameObject.SetActive(false);
}
public void Cancel()
{
HideAllSpreadPath();
//点击取消时执行删除不保存的路径点和已克隆出来的边。因确定而隐藏窗口调了Close()方法,但不执行删除。所以点击取消时单独封装个方法
CloneFireSpreadLine.instance.Cancel();
CloneFireSpreadLine.instance.pathPoints.Clear();
InputManager.skill = false;
InputManager.cloneObjType = CloneObjType.None;
isLoad = false;
gameObject.SetActive(false);
}
/// <summary>
/// 点击重置范围按钮
/// </summary>
public void ResetSpreadPath()
{
//重新初始化起始点
if (aroundSpread.isOn)
{
CloneFireSpreadLine.instance.startPoint = Vector3.zero;
}
else
{
RaycastHit hitDown;
Physics.Raycast(chooseObj.transform.position, Vector3.down, out hitDown, Mathf.Infinity);
NavMeshHit hit = new NavMeshHit();
bool isFindedPath = NavMesh.SamplePosition(hitDown.point, out hit, 0.5f, NavMesh.AllAreas);
if (/*hitDown.transform.gameObject.layer == LayerMask.NameToLayer("CarRoad")
|| hitDown.transform.gameObject.layer == LayerMask.NameToLayer("SoldierRoad")*/
isFindedPath)
{
CloneFireSpreadLine.instance.startPoint = new Vector3(chooseObj.transform.position.x,
hitDown.transform.position.y,
chooseObj.transform.position.z);
CloneFireSpreadLine.instance.pathPoints.Add(CloneFireSpreadLine.instance.startPoint);
}
}
if (isLoad)
{
isLoad = false;
return;
}
CloneFireSpreadLine.instance.ResetSpreadPath(chooseObj.GetComponent<BaseGameObjInfo>().GameObjID);
chooseObj.GetComponent<FireSpreadCtrl>().ResetSpreadPathsAndPoints();
DeleteSpreadedFire(chooseObj.transform.parent);
//重置完后,初始化下一次蔓延范围的初始点
if (CloneFireSpreadLine.instance.pathPoints.Count == 0
&& !aroundSpread.isOn)
{
RaycastHit hitDown;
Physics.Raycast(chooseObj.transform.position, Vector3.down, out hitDown, Mathf.Infinity);
NavMeshHit hit = new NavMeshHit();
bool isFindedPath = NavMesh.SamplePosition(hitDown.point, out hit, 0.5f, NavMesh.AllAreas);
if (/*hitDown.transform.gameObject.layer == LayerMask.NameToLayer("CarRoad")
|| hitDown.transform.gameObject.layer == LayerMask.NameToLayer("SoldierRoad")*/
isFindedPath)
{
CloneFireSpreadLine.instance.startPoint = new Vector3(chooseObj.transform.position.x,
hitDown.transform.position.y,
chooseObj.transform.position.z);
CloneFireSpreadLine.instance.pathPoints.Add(CloneFireSpreadLine.instance.startPoint);
}
}
}
private void DeleteSpreadedFire(Transform spreadedFireParent)
{
foreach (Transform child in spreadedFireParent)
{
if (child.GetComponent<SpreadedFireCtrl>()
&& child.GetComponent<SpreadedFireCtrl>().fireGameObjID == chooseObj.GetComponent<BaseGameObjInfo>().gameObjID)
{
EntitiesManager.Instance.DeleteObj(child.gameObject);
}
}
}
public void FireSpreadPreview()
{
}
private void HideAllSpreadPath()
{
MessageDispatcher.SendMessage("HIDE_ALL_SPREADPATH");
}
private void ShowSelectedFireSpreadPath()
{
MessageDispatcher.SendMessage("SHOW_SELECTEDFIRE_SPREADPATH", chooseObj.GetComponent<BaseGameObjInfo>().GameObjID);
}
}