上海苏宁宝丽嘉酒店,2020.11.17 15:30改为单机版本,以后合成单机版本可以以此版本为模板
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.

570 lines
17 KiB

4 years ago
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;
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>().control = 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;
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;
}
}
}