mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 02:36:14 +00:00
提交Unity 联机Pro
This commit is contained in:
16
JNFrame2/Assets/JNGame/Sync/System/Data/SFrameDataSystem.cs
Normal file
16
JNFrame2/Assets/JNGame/Sync/System/Data/SFrameDataSystem.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
namespace JNGame.Sync.System.Data
|
||||
{
|
||||
/// <summary>
|
||||
/// 帧同步的数据系统 (不支持网络数据)
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public abstract class SFrameDataSystem<T> : SDataSystem<T> where T : ISData,new()
|
||||
{
|
||||
|
||||
public override void OnSyncUpdate()
|
||||
{
|
||||
Data = GetLatest();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6607845a00924069953887b35ecfa68a
|
||||
timeCreated: 1721722862
|
201
JNFrame2/Assets/JNGame/Sync/System/Data/SStateDataSystem.cs
Normal file
201
JNFrame2/Assets/JNGame/Sync/System/Data/SStateDataSystem.cs
Normal file
@@ -0,0 +1,201 @@
|
||||
using System.Collections.Generic;
|
||||
using DotRecast.Core.Collections;
|
||||
|
||||
namespace JNGame.Sync.System.Data
|
||||
{
|
||||
|
||||
public enum SStateDataEnum
|
||||
{
|
||||
Server,
|
||||
Client,
|
||||
ServerClient,
|
||||
}
|
||||
|
||||
public abstract class ISStateData : ISData
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 返回Byte数组
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public abstract byte[] GetByte();
|
||||
|
||||
/// <summary>
|
||||
/// 返回差值Byte
|
||||
/// </summary>
|
||||
/// <param name="diffValue"></param>
|
||||
/// <returns></returns>
|
||||
public abstract byte[] GetByteDifference(ISData diffValue = null);
|
||||
|
||||
/// <summary>
|
||||
/// 更新字节
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
public abstract void UByte(byte[] bytes);
|
||||
|
||||
}
|
||||
|
||||
public interface ISStateDataSystem
|
||||
{
|
||||
|
||||
//网络Id (用于确定网络通讯时找到这个数据系统)
|
||||
public int NetID { get; }
|
||||
|
||||
public void OnInsertUBytes(Dictionary<long, byte[]> bytes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 状态同步的数据系统 (支持网络数据)
|
||||
/// 注意:帧同步也可以使用不过不建议 因为会有额外开销 除非你的游戏 经常在帧同步或者状态同步之间切换
|
||||
/// </summary>
|
||||
public abstract class SStateDataSystem<T> : SDataSystem<T>,ISStateDataSystem where T : ISStateData,new()
|
||||
{
|
||||
|
||||
public abstract int NetID { get; }
|
||||
|
||||
//网络通讯的更新字节数据
|
||||
protected Dictionary<long, byte[]> UBytes = new();
|
||||
|
||||
public SStateDataEnum Type;
|
||||
|
||||
public bool isServer => Type is SStateDataEnum.ServerClient or SStateDataEnum.Server;
|
||||
public bool isClient => Type is SStateDataEnum.ServerClient or SStateDataEnum.Client;
|
||||
|
||||
protected SStateDataSystem(SStateDataEnum type)
|
||||
{
|
||||
Type = type;
|
||||
}
|
||||
|
||||
|
||||
public override void OnSyncUpdate()
|
||||
{
|
||||
|
||||
//服务器: 发送最近数据
|
||||
if (isServer)
|
||||
{
|
||||
var latest = GetLatest();
|
||||
latest.Keys.ForEach(key =>
|
||||
{
|
||||
if (Data.ContainsKey(key))
|
||||
{
|
||||
//更新数据
|
||||
Update(latest[key]);
|
||||
}
|
||||
else
|
||||
{
|
||||
//如果之前没有则添加
|
||||
Add(latest[key]);
|
||||
}
|
||||
});
|
||||
Data.ForEach(child =>
|
||||
{
|
||||
//没有则删除
|
||||
if (!(latest.ContainsKey(child.Key))) Delete(child.Key);
|
||||
});
|
||||
if (UBytes.Count > 0)
|
||||
{
|
||||
OnInsertUBytes(UBytes);
|
||||
OnSendUBytes(UBytes);
|
||||
UBytes.Clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送字节数据
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns>是否清空UBytes</returns>
|
||||
public abstract void OnSendUBytes(Dictionary<long, byte[]> bytes);
|
||||
|
||||
/// <summary>
|
||||
/// 插入字节
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public void OnInsertUBytes(Dictionary<long, byte[]> bytes)
|
||||
{
|
||||
//提交数据更新
|
||||
OnUByteUpdate(bytes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将UByte提交更新
|
||||
/// </summary>
|
||||
public virtual void OnUByteUpdate(Dictionary<long, byte[]> bytes)
|
||||
{
|
||||
foreach (var info in bytes)
|
||||
{
|
||||
if (SDByteOperate.IsDelete(info.Value))
|
||||
{
|
||||
Data.Remove(info.Key);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
if (Data.TryGetValue(info.Key, out var value))
|
||||
{
|
||||
value.UByte(info.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
Data[info.Key] = NewObject(info.Key,info.Value);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Byte解析新对象
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="bytes"></param>
|
||||
/// <returns></returns>
|
||||
public T NewObject(long id,byte[] bytes)
|
||||
{
|
||||
var data = new T();
|
||||
data.Id = id;
|
||||
data.UByte(bytes);
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刷新数据
|
||||
/// </summary>
|
||||
public virtual void Update(T data)
|
||||
{
|
||||
if (Data.TryGetValue(data.Id, out var value))
|
||||
{
|
||||
var diff = value.GetByteDifference(data);
|
||||
if (diff.Length > 0)
|
||||
{
|
||||
UBytes[data.Id] = diff;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UBytes[data.Id] = data.GetByte();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加数据
|
||||
/// </summary>
|
||||
public virtual void Add(T data)
|
||||
{
|
||||
UBytes[data.Id] = data.GetByte();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除数据
|
||||
/// </summary>
|
||||
public virtual void Delete(long id)
|
||||
{
|
||||
UBytes[id] = SDByteOperate.DELETE;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f86e0dbea9824eceb7de44e113c3f29b
|
||||
timeCreated: 1721722979
|
77
JNFrame2/Assets/JNGame/Sync/System/Data/STileDataSystem.cs
Normal file
77
JNFrame2/Assets/JNGame/Sync/System/Data/STileDataSystem.cs
Normal file
@@ -0,0 +1,77 @@
|
||||
using System.Collections.Generic;
|
||||
using DotRecast.Core.Collections;
|
||||
using JNGame.Sync.Entity;
|
||||
using JNGame.Sync.Frame.Entity.Components;
|
||||
using JNGame.Sync.State.Tile;
|
||||
using JNGame.Sync.State.Tile.Entity;
|
||||
|
||||
namespace JNGame.Sync.System.Data
|
||||
{
|
||||
|
||||
public abstract class ISTileData : ISStateData
|
||||
{
|
||||
public abstract bool IsHost { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 支持区块的数据类
|
||||
/// </summary>
|
||||
public abstract class STileDataSystem<T,E> : SStateDataSystem<T> where T : ISTileData,new() where E : JNTileEntity, new()
|
||||
{
|
||||
|
||||
public abstract JNTileContext<E> NodeContext { get; }
|
||||
|
||||
protected STileDataSystem(SStateDataEnum type) : base(type)
|
||||
{
|
||||
}
|
||||
|
||||
public override void OnUByteUpdate(Dictionary<long, byte[]> bytes)
|
||||
{
|
||||
base.OnUByteUpdate(bytes);
|
||||
if (isServer)
|
||||
{
|
||||
OnDataSyncContext();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将数据Data同步到Context
|
||||
/// </summary>
|
||||
protected virtual void OnDataSyncContext()
|
||||
{
|
||||
|
||||
var lIsTileData = new Dictionary<long, T>(Data);
|
||||
|
||||
NodeContext.GetEntities().ForEach(child =>
|
||||
{
|
||||
//如果有则删除
|
||||
if (lIsTileData.Remove(child.Id,out var data))
|
||||
{
|
||||
//并且同步属性到实体中
|
||||
child.TileSyncData(data);
|
||||
}
|
||||
});
|
||||
|
||||
//将数据同步到实体中
|
||||
foreach (var keyValue in lIsTileData)
|
||||
{
|
||||
var entity = NodeContext.TileSyncCreate(keyValue.Key);
|
||||
entity.TileSyncData(keyValue.Value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//只更新有权限的实体
|
||||
public override void Update(T data)
|
||||
{
|
||||
if (!data.IsHost) return;
|
||||
base.Update(data);
|
||||
}
|
||||
public override void Add(T data)
|
||||
{
|
||||
if (!data.IsHost) return;
|
||||
base.Add(data);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 64294f09974c48ca82724ebb3e1a3338
|
||||
timeCreated: 1722477295
|
Reference in New Issue
Block a user