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.
574 lines
17 KiB
574 lines
17 KiB
using AX.MessageSystem; |
|
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using System.IO; |
|
using System.Xml; |
|
using UnityEngine; |
|
using UnityEngine.UI; |
|
|
|
public class ReplayManager : MonoBehaviour |
|
{ |
|
public SecondNodeObject replayNode; |
|
public static ReplayStatus ReplayStatus; |
|
public JsonData jsonData; |
|
public float replayTime; |
|
public int frameIndex; |
|
public int eventIndex; |
|
public int tagIndex; |
|
private TimeLineManager timeLineManager; |
|
public TagManager tagManager; |
|
public GameObject timeLineSlider; |
|
public GameObject nodeDetailShow; |
|
public Button lessen; |
|
public Button add; |
|
public Text speed; |
|
public Toggle auto; |
|
public Button playLast; |
|
public Button playNext; |
|
public Toggle playOrPause; |
|
public Button playOver; |
|
public static int playSpeed = 1; |
|
// Use this for initialization |
|
void Start() |
|
{ |
|
ReplayStatus = ReplayStatus.over; |
|
MessageDispatcher.AddListener("PlayStatusChanged", SetUIByPlayStatus); |
|
MessageDispatcher.AddListener("Replay", Replay); |
|
lessen.onClick.AddListener(Lesson); |
|
add.onClick.AddListener(Add); |
|
auto.onValueChanged.AddListener(Auto); |
|
playLast.onClick.AddListener(PlayLast); |
|
playNext.onClick.AddListener(PlayNext); |
|
playOrPause.onValueChanged.AddListener(PlayOrPause); |
|
playOver.onClick.AddListener(PlayOver); |
|
timeLineManager = timeLineSlider.GetComponent<TimeLineManager>(); |
|
MessageDispatcher.AddListener("DisasterUpdateCompelete", ResetUI);//更新完成重置回放状态 |
|
} |
|
void OnDestroy() |
|
{ |
|
MessageDispatcher.RemoveListener("PlayStatusChanged", SetUIByPlayStatus); |
|
MessageDispatcher.RemoveListener("Replay", Replay); |
|
MessageDispatcher.RemoveListener("DisasterUpdateCompelete", ResetUI);//更新完成重置回放状态 |
|
} |
|
private void ResetUI(IMessage obj) |
|
{ |
|
|
|
ReplayStatus = ReplayStatus.over; |
|
playOrPause.isOn = false; |
|
ReplaySetting.PlayStatus = PlayStatus.normal; |
|
ChangeReplaySpeed = null;//回放结束清空关心回放速度的事件 |
|
auto.isOn = false; |
|
} |
|
|
|
public static int GetNowSpeed() |
|
{ |
|
return playSpeed; |
|
} |
|
/// <summary> |
|
/// 接收播放通知,改变按钮属性 |
|
/// </summary> |
|
/// <param name="obj"></param> |
|
private void Replay(IMessage obj) |
|
{ |
|
playOrPause.isOn = true; |
|
} |
|
/// <summary> |
|
/// 播放结束,显示最后数据 |
|
/// </summary> |
|
private void PlayOver() |
|
{ |
|
auto.isOn = false; |
|
ReplayStatus = ReplayStatus.over; |
|
playOrPause.isOn = false; |
|
ReplaySetting.PlayStatus = PlayStatus.normal; |
|
var list = jsonData.frameDataList; |
|
if (list.Count<1) |
|
{ |
|
return; |
|
} |
|
var frameData = list[list.Count - 1]; |
|
MessageDispatcher.SendMessage("ClearObject"); |
|
var dataList = frameData.objectDataList; |
|
foreach (var data in dataList) |
|
{ |
|
MessageDispatcher.SendMessage("ReplayFrame", data); |
|
} |
|
tagManager.HideTagShow(); |
|
MessageDispatcher.SendMessage("ReplayStatusChanged", ReplayStatus); |
|
//在结束播放的时候如果正在显示提示信息,结束倒计时并隐藏信息窗口 |
|
nodeDetailShow.GetComponent<NodeDetailShow>().SetControl();// = false; |
|
nodeDetailShow.SetActive(false); |
|
|
|
} |
|
/// <summary> |
|
/// 播放暂停 |
|
/// </summary> |
|
/// <param name="isOn"></param> |
|
private void PlayOrPause(bool isOn) |
|
{ |
|
if (isOn) |
|
{ |
|
var secondNode = SecondNodeManager.selectNode; |
|
if (secondNode == null) |
|
{ |
|
ResourceLoadWindow.Instance.LoadTextHintWindow("请选择播放节点", 0.5f); |
|
playOrPause.isOn = false; |
|
return; |
|
} |
|
else if (secondNode == replayNode && ReplayStatus == ReplayStatus.pause)//续播 |
|
{ |
|
ReplayStatus = ReplayStatus.normal; |
|
MessageDispatcher.SendMessage("ReplayStatusChanged", ReplayStatus); |
|
tagManager.HideTagShow(); |
|
} |
|
else//开始播放 |
|
{ |
|
replayNode = secondNode; |
|
var flag = GetJsonData();//获取节点文件数据 |
|
if (flag) |
|
{ |
|
MessageDispatcher.SendMessage("ClearObject"); |
|
replayTime = 0; |
|
frameIndex = 0; |
|
eventIndex = 0; |
|
tagIndex = 0; |
|
//是否显示提示信息 |
|
if (string.IsNullOrEmpty(replayNode.nodeDetail)) |
|
{ |
|
Play(); |
|
} |
|
else |
|
{ |
|
nodeDetailShow.SetActive(true); |
|
nodeDetailShow.GetComponent<NodeDetailShow>().SetUI(replayNode.nodeDetail); |
|
} |
|
} |
|
else |
|
{ |
|
playOrPause.isOn = false; |
|
} |
|
} |
|
} |
|
else //暂停 |
|
{ |
|
if (ReplayStatus == ReplayStatus.normal) |
|
{ |
|
ReplayStatus = ReplayStatus.pause; |
|
MessageDispatcher.SendMessage("ReplayStatusChanged", ReplayStatus); |
|
} |
|
} |
|
} |
|
/// <summary> |
|
/// 提示信息显示后播放 |
|
/// </summary> |
|
public void Play() |
|
{ |
|
ReplaySetting.PlayStatus = PlayStatus.isReplay; |
|
ReplayStatus = ReplayStatus.normal; |
|
timeLineManager.SetSlider(jsonData.sumTime, jsonData.tagDataList); |
|
} |
|
private void PlayNext() |
|
{ |
|
playOrPause.isOn = false;//必须先暂停 |
|
tagManager.HideTagShow(); |
|
ReplayNextNode(); |
|
} |
|
|
|
private void PlayLast() |
|
{ |
|
playOrPause.isOn = false;//必须先暂停 |
|
tagManager.HideTagShow(); |
|
ReplayLastNode(); |
|
} |
|
|
|
private void Auto(bool isOn) |
|
{ |
|
|
|
} |
|
public static event Action<int> ChangeReplaySpeed; |
|
public static event Action<ReplayStatus> ChangeReplayStatus; |
|
private void Add() |
|
{ |
|
int Num = int.Parse(speed.text); |
|
if (Num == 1) |
|
{ |
|
speed.text = "2"; |
|
|
|
} |
|
else if (Num == 2) |
|
{ |
|
speed.text = "4"; |
|
|
|
} |
|
else if (Num == 4) |
|
{ |
|
speed.text = "8"; |
|
} |
|
playSpeed = Num; |
|
GlobalVariable.ReplaySpeed = int.Parse(speed.text); |
|
// MessageDispatcher.SendMessage("ReplaySpeed", GlobalVariable.ReplaySpeed);//回放速度改变事件 |
|
if (ChangeReplaySpeed != null) |
|
{ |
|
ChangeReplaySpeed(GlobalVariable.ReplaySpeed); |
|
} |
|
} |
|
|
|
private void Lesson() |
|
{ |
|
int Num = int.Parse(speed.text); |
|
if (Num == 8) |
|
{ |
|
speed.text = "4"; |
|
|
|
} |
|
else if (Num == 4) |
|
{ |
|
speed.text = "2"; |
|
|
|
} |
|
else if (Num == 2) |
|
{ |
|
speed.text = "1"; |
|
} |
|
playSpeed = Num; |
|
GlobalVariable.ReplaySpeed = int.Parse(speed.text); |
|
// MessageDispatcher.SendMessage("ReplaySpeed", GlobalVariable.ReplaySpeed);//回放速度改变事件 |
|
if (ChangeReplaySpeed != null) |
|
{ |
|
ChangeReplaySpeed(GlobalVariable.ReplaySpeed); |
|
} |
|
} |
|
/// <summary> |
|
/// 跳转到标签位置 |
|
/// </summary> |
|
/// <param name="tag"></param> |
|
public void MoveToTag(TagData tag) |
|
{ |
|
auto.isOn = false;//自动播放关闭 |
|
playOrPause.isOn = false;//播放暂停 |
|
timeLineManager.UpdateSlider(tag.time);//设置时间轴 |
|
tagManager.ShowTag(tag);//显示标签 |
|
//设置回放索引 |
|
var tagList = jsonData.tagDataList; |
|
for (int i = 0; i < tagList.Count; i++) |
|
{ |
|
var tagData = tagList[i]; |
|
if (tagData.time == tag.time) |
|
{ |
|
replayTime = tag.time;//设置时间 |
|
tagIndex = i + 1; |
|
break; |
|
} |
|
} |
|
var frameList = jsonData.frameDataList; |
|
for (int j = 0; j < frameList.Count; j++) |
|
{ |
|
var frameData = frameList[j]; |
|
if (frameData.time == tag.time) |
|
{ |
|
MessageDispatcher.SendMessage("ClearObject"); |
|
var dataList = frameData.objectDataList; |
|
foreach (var data in dataList) |
|
{ |
|
MessageDispatcher.SendMessage("ReplayFrame", data); |
|
} |
|
frameIndex = j + 1; |
|
break; |
|
} |
|
} |
|
var eventList = jsonData.eventDataList; |
|
for (int k = 0; k < eventList.Count; k++) |
|
{ |
|
var eventData = eventList[k]; |
|
if (eventData.time > tag.time) |
|
{ |
|
eventIndex = k; |
|
break; |
|
} |
|
} |
|
} |
|
// Update is called once per frame |
|
void FixedUpdate() |
|
{ |
|
if (ReplaySetting.PlayStatus == PlayStatus.isReplay && ReplayStatus == ReplayStatus.normal) |
|
{ |
|
ReplayFrameData(); |
|
ReplayEventData(); |
|
ReplayTagData(); |
|
timeLineManager.UpdateSlider(replayTime); |
|
replayTime += Time.deltaTime * int.Parse(speed.text); |
|
} |
|
} |
|
/// <summary> |
|
/// 根据游戏状态显示UI |
|
/// </summary> |
|
/// <param name="data"></param> |
|
private void SetUIByPlayStatus(IMessage data) |
|
{ |
|
var playStatus = ReplaySetting.PlayStatus; |
|
if (playStatus == PlayStatus.normal) |
|
{ |
|
gameObject.SetActive(true); |
|
timeLineSlider.SetActive(false); |
|
} |
|
else if (playStatus == PlayStatus.isEditor) |
|
{ |
|
gameObject.SetActive(false); |
|
timeLineSlider.SetActive(false); |
|
} |
|
else if (playStatus == PlayStatus.isReplay) |
|
{ |
|
gameObject.SetActive(true); |
|
timeLineSlider.SetActive(true); |
|
} |
|
} |
|
/// <summary> |
|
/// 获取节点数据 |
|
/// </summary> |
|
/// <returns></returns> |
|
private bool GetJsonData() |
|
{ |
|
string nodeName = replayNode.nodeName; |
|
string filePath = Application.dataPath + @"/Data/" + DisasterManager.disaster.Id + "/File/XmlData/" + nodeName + ".xml"; |
|
if (File.Exists(filePath)) |
|
{ |
|
XmlDocument xmlDoc = new XmlDocument(); |
|
xmlDoc.Load(filePath); |
|
XmlNode firstNodes = xmlDoc.SelectSingleNode("Record"); |
|
jsonData = JsonUtility.FromJson<JsonData>(firstNodes.InnerText); |
|
return true; |
|
} |
|
else |
|
{ |
|
ResourceLoadWindow.Instance.LoadTextHintWindow("节点数据文件不存在,无法正常播放", 1f); |
|
return false; |
|
} |
|
} |
|
/// <summary> |
|
/// 帧数据回放 |
|
/// </summary> |
|
private void ReplayFrameData() |
|
{ |
|
var list = jsonData.frameDataList; |
|
while (frameIndex < list.Count) |
|
{ |
|
var frameData = list[frameIndex]; |
|
if (replayTime >= frameData.time) |
|
{ |
|
MessageDispatcher.SendMessage("ClearObject"); |
|
var dataList = frameData.objectDataList; |
|
foreach (var data in dataList) |
|
{ |
|
MessageDispatcher.SendMessage("ReplayFrame", data); |
|
} |
|
frameIndex++; |
|
} |
|
else |
|
break; |
|
} |
|
} |
|
/// <summary> |
|
/// 事件回放 |
|
/// </summary> |
|
private void ReplayEventData() |
|
{ |
|
var list = jsonData.eventDataList; |
|
while (eventIndex < list.Count) |
|
{ |
|
var eventData = list[eventIndex]; |
|
if (replayTime >= eventData.time) |
|
{ |
|
MessageDispatcher.SendMessage("ReplayEvent", eventData); |
|
eventIndex++; |
|
} |
|
else |
|
break; |
|
} |
|
if (replayTime > jsonData.sumTime) |
|
{ |
|
ReplayStatus = ReplayStatus.over; |
|
nodeDetailShow.GetComponent<NodeDetailShow>().SetControl(); |
|
playOrPause.isOn = false; |
|
ReplaySetting.PlayStatus = PlayStatus.normal; |
|
ChangeReplaySpeed = null;//回放结束清空关心回放速度的事件 |
|
if (auto.isOn) |
|
{ |
|
ReplayNextNode(); |
|
} |
|
} |
|
} |
|
/// <summary> |
|
/// 标签回放 |
|
/// </summary> |
|
private void ReplayTagData() |
|
{ |
|
var list = jsonData.tagDataList; |
|
while (tagIndex < list.Count) |
|
{ |
|
var tagData = list[tagIndex]; |
|
if (replayTime >= tagData.time) |
|
{ |
|
playOrPause.isOn = false;//暂停播放 |
|
tagManager.ShowTag(tagData); |
|
tagIndex++; |
|
} |
|
else |
|
break; |
|
} |
|
} |
|
/// <summary> |
|
/// 播放下一节点 |
|
/// </summary> |
|
private void ReplayNextNode() |
|
{ |
|
var list = new List<SecondNodeObject>(); |
|
var firstSelected = FirstNodeManager.selectNode; |
|
var secondNode = DisasterManager.secondNodeObjects; |
|
foreach (var obj in secondNode) |
|
{ |
|
if (obj.ParentID == firstSelected.nodeID) |
|
{ |
|
list.Add(obj); |
|
} |
|
} |
|
var secondIndex = list.IndexOf(SecondNodeManager.selectNode); |
|
if (secondIndex == -1) |
|
{ |
|
return; |
|
} |
|
else if (secondIndex < list.Count - 1) |
|
{ |
|
//存在未播的二级节点 |
|
MessageDispatcher.SendMessage("ReplaySecondNode", list[secondIndex + 1].nodeID); |
|
} |
|
else if (secondIndex == list.Count - 1) |
|
{ |
|
//已是最后一个二级节点,播放下一个一级节点 |
|
var firstNode = DisasterManager.firstNodeObjects; |
|
var firstIndex = firstNode.IndexOf(firstSelected); |
|
if (firstIndex == -1) |
|
{ |
|
return; |
|
} |
|
else |
|
{ |
|
var nextIndex = GetNextFirstNodeIndex(firstIndex); |
|
if (nextIndex == -1) |
|
{ |
|
return; |
|
} |
|
else |
|
{ |
|
MessageDispatcher.SendMessage("ReplayFirstNode", firstNode[nextIndex].nodeID); |
|
} |
|
} |
|
} |
|
} |
|
/// <summary> |
|
/// 查找下一个非空一级节点的索引值,-1不存在 |
|
/// </summary> |
|
/// <param name="index"></param> |
|
/// <returns></returns> |
|
private int GetNextFirstNodeIndex(int index) |
|
{ |
|
var firstNode = DisasterManager.firstNodeObjects; |
|
if (index < firstNode.Count - 1) |
|
{ |
|
//存在下一个一级节点 |
|
var nextIndex = index + 1; |
|
//查找是否存在二级节点,即判断是否为空节点 |
|
var secondNode = DisasterManager.secondNodeObjects; |
|
foreach (var node in secondNode) |
|
{ |
|
if (node.ParentID == firstNode[nextIndex].nodeID) |
|
{ |
|
return nextIndex; |
|
} |
|
} |
|
return GetNextFirstNodeIndex(nextIndex); |
|
} |
|
else |
|
{ |
|
//已是最后一个一级节点 |
|
return -1; |
|
} |
|
} |
|
/// <summary> |
|
/// 播放上一节点 |
|
/// </summary> |
|
private void ReplayLastNode() |
|
{ |
|
var list = new List<SecondNodeObject>(); |
|
var firstSelected = FirstNodeManager.selectNode; |
|
var secondNode = DisasterManager.secondNodeObjects; |
|
foreach (var obj in secondNode) |
|
{ |
|
if (obj.ParentID == firstSelected.nodeID) |
|
{ |
|
list.Add(obj); |
|
} |
|
} |
|
var secondIndex = list.IndexOf(SecondNodeManager.selectNode); |
|
if (secondIndex == -1) |
|
{ |
|
return; |
|
} |
|
else if (secondIndex > 0) |
|
{ |
|
//存在未播的二级节点 |
|
MessageDispatcher.SendMessage("ReplaySecondNode", list[secondIndex - 1].nodeID); |
|
} |
|
else if (secondIndex == 0) |
|
{ |
|
//已是第一个二级节点,播放上一个一级节点 |
|
var firstNode = DisasterManager.firstNodeObjects; |
|
var firstIndex = firstNode.IndexOf(firstSelected); |
|
if (firstIndex == -1) |
|
{ |
|
return; |
|
} |
|
else |
|
{ |
|
var lastIndex = GetLastFirstNodeIndex(firstIndex); |
|
if (lastIndex == -1) |
|
{ |
|
return; |
|
} |
|
else |
|
{ |
|
MessageDispatcher.SendMessage("ReplayFirstNode", firstNode[lastIndex].nodeID); |
|
} |
|
} |
|
} |
|
} |
|
/// <summary> |
|
/// 查找上一个非空一级节点的索引值,-1不存在 |
|
/// </summary> |
|
/// <param name="index"></param> |
|
/// <returns></returns> |
|
private int GetLastFirstNodeIndex(int index) |
|
{ |
|
var firstNode = DisasterManager.firstNodeObjects; |
|
if (index > 0) |
|
{ |
|
//存在上一个一级节点 |
|
var lastIndex = index - 1; |
|
//查找是否存在二级节点,即判断是否为空节点 |
|
var secondNode = DisasterManager.secondNodeObjects; |
|
foreach (var node in secondNode) |
|
{ |
|
if (node.ParentID == firstNode[lastIndex].nodeID) |
|
{ |
|
return lastIndex; |
|
} |
|
} |
|
return GetLastFirstNodeIndex(lastIndex); |
|
} |
|
else |
|
{ |
|
//已是第一个一级节点 |
|
return -1; |
|
} |
|
} |
|
}
|
|
|