mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 02:36:14 +00:00
提交
This commit is contained in:
@@ -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);
|
||||
|
||||
}
|
||||
}
|
@@ -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();
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fdc20d5f68c44f11ba0f08c304cb5fae
|
||||
timeCreated: 1706518761
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user