上海杨浦大连路地铁站单机版电子沙盘
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.
 
 
 
 

137 lines
4.4 KiB

using UnityEngine;
using System.Collections;
using AX.InputSystem;
using System.Collections.Generic;
/// <summary>
/// 键鼠输入历史
/// </summary>
public struct CmdInfo
{
public SceneType sceneType;//场景(建筑)类型
public int frameNumber;//帧数
public object command;//发生的命令
//public GameObject gameObj;//操作的对象
public long gameObjID;//操作对象的id
public object arg;//命令参数
}
//public delegate void UIHandler(CmdArgs arg);
/// <summary>
/// UI输入历史
/// </summary>
public struct UIEventInfo
{
public SceneType sceneType;//场景(建筑)类型
public int frameNumber;//帧数
//public UIHandler handler;//响应的UI事件,以带CmdArgs参数类型的委托记录
public string uiComponentName;//控制UI行为的组件名
public string functionName;//响应的UI事件里调用的方法的名字(在组件中)
//public GameObject gameObj;//操作对象
public long gameObjID;//操作对象的id
public object arg;//参数
}
public class InputHistory
{
public static readonly InputHistory Instance = new InputHistory();
public List<CmdInfo> cmdInfos = new List<CmdInfo>();//记录键盘鼠标输入响应的命令信息
public List<UIEventInfo> UIEventInfos = new List<UIEventInfo>();//记录操作UI响应的事件信息
public void RegisterInputHistory(CmdInfo historyItem)
{
if (!(historyItem.command is Command))
{
throw (new System.ArgumentException("参数historyItem.command不是期望的Command类型!"));
}
if (historyItem.arg != null && !(historyItem.arg is CmdArgs))
{
throw (new System.ArgumentException("参数historyItem.arg不是期望的CmdArgs类型!"));
}
cmdInfos.Add(historyItem);
var command = historyItem.command;
//Debug.Log(command.GetType().Name + ":" + cmdInfos.Count);
}
public void RegisterInputHistory(UIEventInfo historyItem)
{
if (historyItem.arg != null && !(historyItem.arg is CmdArgs))
{
throw (new System.ArgumentException("参数historyItem.arg不是期望的CmdArgs类型!"));
}
UIEventInfos.Add(historyItem);
var componentName = historyItem.uiComponentName;
var functionName = historyItem.functionName;
//Debug.Log(componentName + "(" + functionName + ")" + ":" + UIEventInfos.Count);
}
public void TestCmdReplay()
{
GameSettings.othersSettings.isReplayMode = true;//控制回放不记录UI输入操作历史
Debug.Log(cmdInfos.Count);
for (int i = 0; i < cmdInfos.Count; i++)
{
//cmdInfos[i].command.Execute(cmdInfos[i].gameObj, cmdInfos[i].arg);
}
}
public void TestUIEventReplay()
{
GameSettings.othersSettings.isReplayMode = true;//控制回放不记录UI输入操作历史
Debug.Log(UIEventInfos.Count);
for (int i = 0; i < UIEventInfos.Count; i++)
{
//UIEventInfos[i].gameObj.SendMessage(UIEventInfos[i].functionName,UIEventInfos[i].arg);
}
}
private int cmdInfosIndex = 0;
private CmdInfo cmd = new CmdInfo();
private int UIEventInfosIndex = 0;
private UIEventInfo uiEvent = new UIEventInfo();
private GameObject uiObj;
public void Replay(InputHistory history)
{
while(cmdInfosIndex < history.cmdInfos.Count)
{
cmd = history.cmdInfos[cmdInfosIndex];
if (InputManager.frameCount >= cmd.frameNumber)
{
Debug.Log(cmdInfosIndex);
((Command)cmd.command).Execute(cmd.gameObjID, (CmdArgs)cmd.arg);
cmdInfosIndex++;
}
else
break;
}
while(UIEventInfosIndex < history.UIEventInfos.Count)
{
uiEvent = history.UIEventInfos[UIEventInfosIndex];
if (InputManager.frameCount >= uiEvent.frameNumber)
{
uiObj = EntitiesManager.Instance.GetEntityByID(uiEvent.gameObjID);
if (uiObj != null)
uiObj.SendMessage(uiEvent.functionName, uiEvent.arg);
UIEventInfosIndex++;
}
else
break;
}
if (cmdInfosIndex == history.cmdInfos.Count && UIEventInfosIndex == history.UIEventInfos.Count)
{
GameSettings.othersSettings.isReplayOver = true;
}
}
}