This commit is contained in:
PC-20230316NUNE\Administrator
2024-01-29 19:07:52 +08:00
parent 01293d9c30
commit 09db51f67b
62 changed files with 17325 additions and 1910 deletions

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Plugins.JNGame.Sync.Frame.game;
@@ -10,6 +11,15 @@ using UnityEngine.SceneManagement;
namespace Plugins.JNGame.Sync.Frame
{
//帧同步 通知
public interface JNSyncFrameEvent
{
static string CLEAR = "JNSyncFrameEvent_CLEAR";
static string CREATE = "JNSyncFrameEvent_CREATE";
static string FRAME = "JNSyncFrameEvent_FRAME";
}
public abstract class JNSyncFrame : SystemBase
{
@@ -35,7 +45,7 @@ namespace Plugins.JNGame.Sync.Frame
private Dictionary<int,JNFrameInfo> _nFrameTempQueue = new();
//需要同步的Actor
private List<JNSyncFrameComponent<object>> _nSyncActors = new();
private List<IJNSyncFrameComponent> _nSyncActors = new();
//ID 每添加 JNSyncFrameComponent + 1
public Func<int> nSyncID = RandomUtil.Next(0);
@@ -61,21 +71,34 @@ namespace Plugins.JNGame.Sync.Frame
{
Physics.autoSimulation = false;
Physics.autoSyncTransforms = false;
this.OnReset();
return Task.CompletedTask;
}
//开始
public void onStart(){
public void OnStart(){
this._isStart = true;
}
//重置数据
public void onStop()
public void OnReset()
{
EventDispatcher.Event.Dispatch(JNSyncFrameEvent.CLEAR);
this._isStart = false;
this.nSyncID = RandomUtil.Next(0);
this.nRandom = RandomUtil.SyncRandom(100);
this.nRandomInt = RandomUtil.SyncRandomInt(100);
this._nSyncActors = new();
this._nFrameQueue = new();
this._nFrameTempQueue = new();
this._nLocalFrame = 0;
this._nFrameRun = 0;
Physics.SyncTransforms();
EventDispatcher.Event.Dispatch(JNSyncFrameEvent.CREATE);
}
//更新同步
@@ -122,13 +145,15 @@ namespace Plugins.JNGame.Sync.Frame
//更新帧
this._nSyncActors.ForEach(child =>
{
MethodInfo OnSyncUpdate = child.GetType().GetMethod("OnSyncUpdate");
MethodInfo Decoder = child.GetType().GetMethod("Decoder");
if (inputs.ContainsKey(child.NID))
{
child.OnSyncUpdate(dt,frame,child.Decoder(inputs[child.NID].Input.ToByteArray()));
OnSyncUpdate.Invoke(child,new []{dt,frame,Decoder.Invoke(child,new object[]{ inputs[child.NID].Input.ToByteArray() })});
}
else
{
child.OnSyncUpdate(dt,frame,null);
OnSyncUpdate.Invoke(child,new []{ dt,frame,(object)null });
}
});
@@ -177,8 +202,8 @@ namespace Plugins.JNGame.Sync.Frame
if(isLatestData){
//如果推的帧小于本地帧 则 重开
if(frame.Index < _nLocalFrame){
onStop();
onStart();
OnReset();
OnStart();
return;
}
}
@@ -236,11 +261,22 @@ namespace Plugins.JNGame.Sync.Frame
}
}
//添加同步组件
public void AddSyncActor(IJNSyncFrameComponent sync){
if(!this._nSyncActors.Contains(sync)){
this._nSyncActors.Add(sync);
}
}
//销毁同步组件
public void DelSyncActor(IJNSyncFrameComponent sync){
this._nSyncActors.Remove(sync);
}
//发送帧数据
protected abstract void OnSendInput(JNFrameInputs inputs);
//获取帧数据
protected abstract UniTask<JNFrameInfos> OnServerData(int start,int end);
}
}

View File

@@ -0,0 +1,17 @@
using UnityEngine;
namespace Plugins.JNGame.Sync.Frame.game
{
public abstract class IJNSyncFrameComponent : MonoBehaviour
{
//标识
[HideInInspector]
public int _nId;
[HideInInspector]
public int NID => _nId;
//获取同步类
protected abstract JNSyncFrame GetSync();
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: fdc20d5f68c44f11ba0f08c304cb5fae
timeCreated: 1706518761

View File

@@ -7,12 +7,8 @@ namespace Plugins.JNGame.Sync.Frame.game
{
//所有帧同步组件的基类
public abstract class JNSyncFrameComponent<T> : MonoBehaviour
public abstract class JNSyncFrameComponent<T> : IJNSyncFrameComponent
{
//标识
private int _nId;
public int NID => _nId;
//当前输入
private T _input;
@@ -21,31 +17,28 @@ namespace Plugins.JNGame.Sync.Frame.game
public Boolean isInput => this._input == null;
//是否初始化完成
[HideInInspector]
public Boolean isSyncInitSuccess = false;
//清空输入
public void ClearInput(){
this._input = default(T);
}
private void Awake()
{
//向帧同步获取Id
this._nId = GetSync().nSyncID();
this._nId = this.GetSync().nSyncID();
GetSync().AddSyncActor(this);
this.OnSyncLoad();
}
//初始化完成
public void OnSyncInitSuccess(){}
//获取同步类
protected abstract JNSyncFrame GetSync();
//加载
public abstract void OnSyncLoad();
//解析
public T Decoder(byte[] bytes)
{
@@ -57,7 +50,6 @@ namespace Plugins.JNGame.Sync.Frame.game
return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(input));
}
//帧同步
public abstract void OnSyncUpdate(int dt,JNFrameInfo frame,T input);

View File

@@ -9,6 +9,9 @@ namespace Plugins.JNGame.Util
/// </summary>
public class EventDispatcher
{
public static readonly EventDispatcher Event = new EventDispatcher();
public Dictionary<string, List<Delegate>> EventHandlers { get; private set; } = new();
/// <summary>
@@ -16,7 +19,7 @@ namespace Plugins.JNGame.Util
/// </summary>
/// <param name="eventId">事件标识符</param>
/// <param name="listener">事件监听器</param>
public void AddListener(string eventId, Delegate listener)
public void AddListener(string eventId, Action listener)
{
if (!EventHandlers.ContainsKey(eventId))
{
@@ -81,6 +84,21 @@ namespace Plugins.JNGame.Util
}
}
public void Dispatch(string eventId)
{
if (EventHandlers.ContainsKey(eventId) && EventHandlers[eventId] != null)
{
foreach(Delegate fun in EventHandlers[eventId])
{
// 确保 fun 实际上是指向一个 Action<T> 类型的函数
if (fun.Method.GetParameters().Length == 0)
{
((Action)fun)();
}
}
}
}
public void Reset()
{
EventHandlers = new();