提交Cue案例

This commit is contained in:
DESKTOP-5RP3AKU\Jisol
2024-10-26 02:35:38 +08:00
parent 6cf78b53bb
commit 1ad20b67da
72 changed files with 24536 additions and 1264 deletions

View File

@@ -1,51 +0,0 @@
using System.Collections.Generic;
using GAS.General;
namespace GAS.Runtime
{
/// <summary>
/// Cue 处理
/// </summary>
public abstract partial class AbilitySystemComponent : IAbilitySystemComponent, IPool
{
/// <summary>
/// AbilitySpec 唯一Id
/// </summary>
private Dictionary<AbilitySpec, int> AbilitySpecId = new();
/// <summary>
/// Ability的Timeline轨道触发了持续型Cue的添加
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueAssetLocation">Cue资源地址</param>
/// <param name="durationTime">持续时间</param>
/// <returns></returns>
public int OnCueAdd(AbilitySpec abilitySpec, string cueAssetLocation, int durationTime)
{
return 0;
}
/// <summary>
/// Ability的Timeline轨道触发了持续型Cue的移除
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueClipIndex"></param>
public void OnCueRemove(AbilitySpec abilitySpec, int cueClipIndex)
{
}
/// <summary>
/// Ability的Timeline轨道触发了瞬时Cue的触发
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueAssetLocations"></param>
public void OnCueExecute(AbilitySpec abilitySpec, string[] cueAssetLocations)
{
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: fd84ebd1383e4e009578ebd2daae3200
timeCreated: 1729704061

View File

@@ -341,6 +341,29 @@ namespace GAS.Runtime
/// <param name="geSpec"></param>
public abstract void OnGERelease(GameplayEffectSpec geSpec);
/// <summary>
/// Ability的Timeline轨道触发了持续型Cue的添加
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueAssetLocation">Cue资源地址</param>
/// <param name="durationTime">持续时间</param>
/// <returns></returns>
public abstract int OnCueAdd(AbilitySpec abilitySpec, string cueAssetLocation, int durationTime);
/// <summary>
/// Ability的Timeline轨道触发了持续型Cue的移除
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueClipIndex"></param>
public abstract void OnCueRemove(AbilitySpec abilitySpec, int cueClipIndex);
/// <summary>
/// Ability的Timeline轨道触发了瞬时Cue的触发
/// </summary>
/// <param name="abilitySpec"></param>
/// <param name="cueAssetLocations"></param>
public abstract void OnCueExecute(AbilitySpec abilitySpec, string[] cueAssetLocations);
/// <summary>
/// Ability结束激活
/// </summary>

View File

@@ -30,6 +30,15 @@ namespace GAS.Runtime
return durationalCue;
}
public GameplayCueDurationalSpec ApplyFrom(params object[] customArguments)
{
var durationalCue = CreateSpec(new GameplayCueParameters
{
customArguments = customArguments
});
return durationalCue;
}
#if UNITY_EDITOR
public virtual void OnEditorPreview(UnityEngine.GameObject previewObject, int frameIndex, int startFrame, int endFrame)
{
@@ -49,6 +58,7 @@ namespace GAS.Runtime
public abstract void OnGameplayEffectActivate();
public abstract void OnGameplayEffectDeactivate();
public abstract void OnTick(int frame,int startFrame,int endFrame);
public abstract void OnTick(int deltaTime);
}
public abstract class GameplayCueDurationalSpec<T> : GameplayCueDurationalSpec where T : GameplayCueDurational

View File

@@ -1,3 +1,5 @@
using UnityEngine;
namespace GAS.Runtime
{
public struct GameplayCueParameters

View File

@@ -415,6 +415,7 @@ namespace GAS.Runtime
if (frame >= cueClip.startFrame && frame <= cueClip.endFrame)
{
cueClip.cueSpec.OnTick(frame,cueClip.startFrame,cueClip.endFrame);
cueClip.cueSpec.OnTick(deltaTime);
}
if (frame == cueClip.endFrame)

View File

@@ -25,6 +25,8 @@ namespace JNGame.Sync.Entity
public T GetComponent<T>() where T : JNComponent;
public T GetSystem<T>() where T : SLogicSystem;
}
public abstract class JNEntity : Entitas.Entity,IJNEntity,IComparable

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Threading;
using Entitas;
using JNGame.Runtime.Util;
using JNGame.Sync;
using JNGame.Sync.Entity;
using JNGame.Sync.Frame.Service;
using JNGame.Sync.System;
@@ -73,7 +74,7 @@ namespace JNGame.Runtime.Sync
public override Systems Add(ISystem system)
{
(system as SLogicSystem)?.OnSyncStart();
(system as IJNSyncCycle)?.OnSyncStart();
return base.Add(system);
}

View File

@@ -1,6 +1,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using HotScripts.JNGame.Runtime.Sync.System.Logic;
using JNGame.Sync.Frame;
using UnityEngine;
namespace JNGame.Sync.System.Data
{
@@ -12,10 +15,6 @@ namespace JNGame.Sync.System.Data
public abstract class SEventDataSystem : SDataSystemBase
{
/// <summary>
/// 服务器事件
/// </summary>
private Queue<SEvent> ServerEvents = new();
/// <summary>
/// 客户端事件
/// </summary>
@@ -39,35 +38,60 @@ namespace JNGame.Sync.System.Data
}
public override void OnSyncUpdate(int dt)
{
while (WaitUBytes.Count > 0)
{
OnUByteUpdate(WaitUBytes.Dequeue());
}
if (isServer)
JNEventSystem Event = GetSystem<JNEventSystem>();
if (Event is null)
{
if (ServerEvents.Count <= 0) return;
using (MemoryStream ms = new MemoryStream())
Debug.LogWarning("请保证逻辑层有 JNEventSystem 系统");
return;
}
//如果是帧同步系统则直接保存
if (Sync is JNSyncFrameService)
{
while (Event.ViewEvent.Count > 0)
{
using (BinaryWriter writer = new BinaryWriter(ms))
{
int count = ServerEvents.Count;
//写入数量
writer.Write(count);
for (int i = count - 1; i >= 0; i--)
{
var data = ServerEvents.Dequeue().ToByteArray();
//写入数据大小
writer.Write(data.Length);
//写入数据
writer.Write(data);
}
}
// 发送完整的字节数组
OnSendUBytes(ms.ToArray());
ClientEvents.Enqueue(Event.ViewEvent.Dequeue());
}
}
else
{
while (WaitUBytes.Count > 0)
{
OnUByteUpdate(WaitUBytes.Dequeue());
}
if (isServer)
{
if (Event.ViewEvent.Count <= 0) return;
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(ms))
{
int count = Event.ViewEvent.Count;
//写入数量
writer.Write(count);
for (int i = count - 1; i >= 0; i--)
{
var data = Event.ViewEvent.Dequeue().ToByteArray();
//写入数据大小
writer.Write(data.Length);
//写入数据
writer.Write(data);
}
}
// 发送完整的字节数组
OnSendUBytes(ms.ToArray());
}
}
}
//触发事件
while (ClientEvents.Count > 0)
{
ReceiveEvent(ClientEvents.Dequeue());
}
}
@@ -77,6 +101,11 @@ namespace JNGame.Sync.System.Data
/// <param name="bytes"></param>
/// <returns>是否清空UBytes</returns>
public abstract void OnSendUBytes(byte[] bytes);
/// <summary>
/// 接收事件 实现
/// </summary>
protected abstract void ReceiveEvent(SEvent @event);
/// <summary>
@@ -110,19 +139,6 @@ namespace JNGame.Sync.System.Data
}
}
public void AddEvent(int type,byte[] data)
{
//只有服务器才可以添加事件
if (isServer)
{
ServerEvents.Enqueue(new SEvent()
{
Type = type,
Data = data,
});
}
}
public class SEvent
{
/// <summary>

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using JNGame.Sync.Frame;
using UnityEngine;
namespace JNGame.Sync.System.Data
@@ -90,6 +91,14 @@ namespace JNGame.Sync.System.Data
public override void OnSyncUpdate(int dt)
{
//如果是帧同步系统则直接保存
if (Sync is JNSyncFrameService)
{
Data = GetLatest();
return;
}
while (WaitUBytes.Count > 0)
{

View File

@@ -0,0 +1,29 @@
using System.Collections.Generic;
using JNGame.Sync.System;
using JNGame.Sync.System.Data;
namespace HotScripts.JNGame.Runtime.Sync.System.Logic
{
public class JNEventSystem : SLogicSystem
{
/// <summary>
/// 渲染层 专用事件
/// </summary>
public Queue<SEventDataSystem.SEvent> ViewEvent = new();
/// <summary>
/// 添加数据层事件(用于通知渲染层)
/// </summary>
public void AddViewEvent(int type,byte[] data)
{
ViewEvent.Enqueue(new SEventDataSystem.SEvent()
{
Type = type,
Data = data,
});
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 1116c94f10954a2084f93bc6e8a61ece
timeCreated: 1729876016

View File

@@ -61,7 +61,7 @@ namespace JNGame.Sync.View
}
foreach (var delete in deletes)
{
ViewRemove(views[delete].Data);
ViewRemove(delete,views[delete].Data);
views.Remove(delete);
}
}
@@ -71,7 +71,7 @@ namespace JNGame.Sync.View
public abstract GameObject NewView(T data);
public abstract ConcurrentDictionary<ulong, T> GetData();
public abstract void ViewRemove(GameObject view);
public abstract void ViewRemove(ulong id,GameObject view);
public T GetService<T>() where T : SBaseSystem
{