chore: initial commit

This commit is contained in:
2026-05-08 11:04:00 +08:00
commit f55d2a57c3
6278 changed files with 866081 additions and 0 deletions

View File

View File

@@ -0,0 +1,61 @@
using System;
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 泛型 SO 事件频道基类。T 为负载类型。
/// </summary>
public abstract class BaseEventChannelSO<T> : ScriptableObject
{
[Multiline] public string description;
public event Action<T> OnEventRaised;
public void Raise(T value)
{
#if UNITY_EDITOR
EventBusMonitor.Record(name, value?.ToString() ?? "null",
OnEventRaised?.GetInvocationList().Length ?? 0);
#endif
OnEventRaised?.Invoke(value);
}
/// <summary>
/// 订阅并返回可 Dispose 的订阅句柄,配合 CompositeDisposable 使用。
/// </summary>
public EventSubscription Subscribe(Action<T> callback)
{
OnEventRaised += callback;
return new EventSubscription(() => OnEventRaised -= callback);
}
}
/// <summary>
/// 无负载事件频道基类。
/// </summary>
public abstract class VoidBaseEventChannelSO : ScriptableObject
{
[Multiline] public string description;
public event Action OnEventRaised;
public void Raise()
{
#if UNITY_EDITOR
EventBusMonitor.Record(name, "<void>",
OnEventRaised?.GetInvocationList().Length ?? 0);
#endif
OnEventRaised?.Invoke();
}
/// <summary>
/// 订阅并返回可 Dispose 的订阅句柄。
/// </summary>
public EventSubscription Subscribe(Action callback)
{
OnEventRaised += callback;
return new EventSubscription(() => OnEventRaised -= callback);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: adcb05b71d0e3f94f8c4446dee4c253b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,14 @@
{
"name": "BaseGames.Core.Events",
"rootNamespace": "BaseGames.Core.Events",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: bf44e3f184fd4214eb09a80e6e04d7df
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,22 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// Boss 技能事件负载。
/// </summary>
[System.Serializable]
public struct BossSkillEvent
{
public string BossId;
public string SkillId;
}
/// <summary>
/// Boss 阶段切换事件负载。
/// </summary>
[System.Serializable]
public struct BossPhaseEvent
{
public string BossId;
public int Phase;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ac3dc174ca0e12544a31550b5f61e70b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/BossPhase")]
public class BossPhaseEventChannelSO : BaseEventChannelSO<BossPhaseEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 647b6596e515ba64483b7ff337c76699
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/BossSkill")]
public class BossSkillEventChannelSO : BaseEventChannelSO<BossSkillEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8230eab2acba8c24499b2d20df81adb7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,14 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 色觉辅助模式枚举16_SupportingModules §AccessibilityManager
/// </summary>
public enum ColorblindMode
{
None = 0,
Protanopia = 1,
Deuteranopia = 2,
Tritanopia = 3,
Achromatopsia = 4
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f7f46e87b21f6a045bc324853efecf9c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/ColorblindMode")]
public class ColorblindModeEventChannelSO : BaseEventChannelSO<ColorblindMode> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a9227f70cba3e7949a837c0622653f33
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
// 此文件已废弃。DamageInfo / DamageInfoEventChannelSO 已迁移至
// Assets/Scripts/Combat/DamageInfo.cs (namespace BaseGames.Combat)
// 程序集 BaseGames.Combat.asmdef
namespace BaseGames.Core.Events
{
// 保留空命名空间,避免 .meta 文件冲突。
// ReSharper disable once EmptyNamespace
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 94ca97e41a3560141a991928af7c1beb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 难度变更事件频道。Phase 2 难度系统使用。
/// 发布DifficultyScalerSO / SettingsManager
/// 订阅:所有需要感知当前难度的系统
/// </summary>
[CreateAssetMenu(menuName = "Events/DifficultyChanged")]
public class DifficultyChangedEventChannel : BaseEventChannelSO<DifficultyLevel> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1b3f48b426d66154797d7c9af9c6b02f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,13 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 难度等级枚举。
/// </summary>
public enum DifficultyLevel
{
Easy = 0,
Normal = 1,
Hard = 2,
SteelSoul = 3 // 一命模式
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: aa2ae8b438a843b458548868d0cfef3a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,39 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 运行时事件总线监控(仅 Editor 下记录调用信息)。
/// </summary>
public static class EventBusMonitor
{
#if UNITY_EDITOR
public struct EventRecord
{
public string ChannelName;
public string Payload;
public int ListenerCount;
public System.DateTime Timestamp;
}
private static readonly System.Collections.Generic.Queue<EventRecord> _records
= new System.Collections.Generic.Queue<EventRecord>(256);
public static System.Collections.Generic.IEnumerable<EventRecord> Records => _records;
public static void Record(string channelName, string payload, int listenerCount)
{
if (_records.Count >= 256) _records.Dequeue();
_records.Enqueue(new EventRecord
{
ChannelName = channelName,
Payload = payload,
ListenerCount = listenerCount,
Timestamp = System.DateTime.Now
});
}
public static void Clear() => _records.Clear();
#else
public static void Record(string channelName, string payload, int listenerCount) { }
#endif
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d580e5431c172b34d8fc0252ff72774a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,54 @@
using System.Collections.Generic;
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 运行时事件频道注册表。
/// 在 Persistent 场景 Awake 时由 EventChannelRegistrar 注册所有频道 SO
/// 供不能持有 [SerializeField] 的动态对象CharmEffect SO 等)按类型名查找频道。
/// </summary>
public class EventChannelRegistry : MonoBehaviour, IEventChannelRegistry
{
public static EventChannelRegistry Instance { get; private set; }
private readonly Dictionary<string, ScriptableObject> _channels = new();
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
}
/// <summary>由 EventChannelRegistrar 在场景初始化时批量注册频道 SO。</summary>
public void Register(string key, ScriptableObject channel)
=> _channels[key] = channel;
/// <summary>
/// 按 key 查找频道。key = SO 资产文件名(不含扩展名),如 "EVT_HitConfirmed"。
/// </summary>
public T Get<T>(string key) where T : ScriptableObject
{
if (_channels.TryGetValue(key, out var ch) && ch is T typed) return typed;
Debug.LogError($"[EventChannelRegistry] Key '{key}' not found or wrong type ({typeof(T).Name}).");
return null;
}
/// <summary>尝试获取频道,不报错。</summary>
public bool TryGet<T>(string key, out T channel) where T : ScriptableObject
{
if (_channels.TryGetValue(key, out var ch) && ch is T typed)
{
channel = typed;
return true;
}
channel = null;
return false;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 661043851605d4849bef40ea15c556b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 单条订阅的 Disposable 句柄。Dispose() 自动取消注册。
/// </summary>
public readonly struct EventSubscription : IDisposable
{
private readonly Action _unsubscribe;
public EventSubscription(Action unsubscribe)
=> _unsubscribe = unsubscribe;
public void Dispose() => _unsubscribe?.Invoke();
}
/// <summary>
/// 批量管理多条订阅,统一在 Dispose / Clear 时取消所有注册。
/// 用法OnEnable 调用 SubscribeOnDisable 调用 Clear。
/// </summary>
public sealed class CompositeDisposable : IDisposable
{
private readonly List<IDisposable> _items = new();
public void Add(IDisposable item) => _items.Add(item);
public void Clear()
{
foreach (var item in _items) item.Dispose();
_items.Clear();
}
public void Dispose() => Clear();
}
/// <summary>
/// <see cref="EventSubscription"/> 扩展方法(架构 02 §8
/// </summary>
public static class EventSubscriptionExtensions
{
/// <summary>
/// 将订阅句柄添加到集合中,统一生命周期管理。
/// 用法channel.Subscribe(Handler).AddTo(_subscriptions);
/// </summary>
public static EventSubscription AddTo(this EventSubscription subscription,
ICollection<IDisposable> collection)
{
collection.Add(subscription);
return subscription;
}
/// <summary>
/// 将订阅句柄添加到 <see cref="CompositeDisposable"/> 中。
/// </summary>
public static EventSubscription AddTo(this EventSubscription subscription,
CompositeDisposable compositeDisposable)
{
compositeDisposable.Add(subscription);
return subscription;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 15f50c6ab5d503b47bbcc8f73b32d3e1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Float")]
public class FloatEventChannelSO : BaseEventChannelSO<float> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 62f2d5b0575789048b6badd7d1608db3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/GameState")]
public class GameStateEventChannelSO : BaseEventChannelSO<GameStateId> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c060c20fe37837c408cc5a628f6d8863
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,21 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 游戏状态 ID值类型替代旧版 GameState 枚举)。
/// 具体实例由 GameStates 静态工厂创建。
/// </summary>
public readonly struct GameStateId : System.IEquatable<GameStateId>
{
public readonly string Id;
public GameStateId(string id) => Id = id;
public bool Equals(GameStateId other) => Id == other.Id;
public override bool Equals(object obj) => obj is GameStateId g && Equals(g);
public override int GetHashCode() => Id?.GetHashCode() ?? 0;
public override string ToString() => Id ?? "<null>";
public static bool operator ==(GameStateId a, GameStateId b) => a.Equals(b);
public static bool operator !=(GameStateId a, GameStateId b) => !a.Equals(b);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: af0ccb15630f6ff419a4c526e96459f7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
// 此文件已废弃。HitInfo / HitConfirmedEventChannelSO 已迁移至
// Assets/Scripts/Combat/HitInfo.cs (namespace BaseGames.Combat)
// 程序集 BaseGames.Combat.asmdef
namespace BaseGames.Core.Events
{
// 保留空命名空间,避免 .meta 文件冲突。
// ReSharper disable once EmptyNamespace
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4a04b32343a49fe4c9a273b4d0d51b60
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,19 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// SO 事件频道注册表接口。
/// 允许 Core 层通过接口访问动态频道查找,而无需直接依赖 EventChannelRegistry 实现。
/// </summary>
public interface IEventChannelRegistry
{
/// <summary>注册一个事件频道 SO。key 通常为 SO 资产名(如 "EVT_HitConfirmed")。</summary>
void Register(string key, ScriptableObject channel);
/// <summary>
/// 按 key 查找事件频道。未找到或类型不匹配时返回 null 并输出错误日志。
/// </summary>
T Get<T>(string key) where T : ScriptableObject;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a7c6211f04a78764c978bbdb3c5fc708
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Int")]
public class IntEventChannelSO : BaseEventChannelSO<int> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ce6e33f4353535944a0d2573df0a08d4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 液体区域事件负载。用于玩家进入/离开液体区域时传递区域信息。
/// </summary>
public readonly struct LiquidEvent
{
/// <summary>液体区域标识符(对应 LiquidZone SO 的 zoneId。</summary>
public readonly string ZoneId;
/// <summary>液体类型(如 "Water" / "Acid" / "Lava")。</summary>
public readonly string LiquidType;
public LiquidEvent(string zoneId, string liquidType)
{
ZoneId = zoneId;
LiquidType = liquidType;
}
public override string ToString() => $"LiquidEvent(Zone={ZoneId}, Type={LiquidType})";
}
/// <summary>
/// 液体进出事件频道EVT_LiquidEntered / EVT_LiquidExited
/// 发布LiquidZoneOnTriggerEnter2D / OnTriggerExit2D
/// 订阅PlayerController切换游泳状态、DrownSystem、AudioManager
/// </summary>
[UnityEngine.CreateAssetMenu(menuName = "Events/LiquidEvent")]
public class LiquidEventChannelSO : BaseEventChannelSO<LiquidEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9cf4419a1f1358d4583f21618396ff9d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Bool")]
public class BoolEventChannelSO : BaseEventChannelSO<bool> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d3e424c1787e5be4fa918201b1830192
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,36 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 任务状态枚举22_QuestChallengeModule §QuestSO
/// </summary>
public enum QuestState
{
Unavailable = 0,
Available = 1,
Active = 2,
Completed = 3,
Failed = 4
}
/// <summary>
/// 任务状态变更事件负载。
/// </summary>
[System.Serializable]
public struct QuestStateChangedEvent
{
public string QuestId;
public QuestState State;
}
/// <summary>
/// 任务目标进度事件负载。
/// </summary>
[System.Serializable]
public struct QuestObjectiveEvent
{
public string QuestId;
public string ObjectiveId;
public int Progress;
public int Required;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a4badb3a03cabf941b030e5c0c45a442
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/QuestObjective")]
public class QuestObjectiveEventChannelSO : BaseEventChannelSO<QuestObjectiveEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4a46bd0c0af9fcd4dae69a00c6565be5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/QuestStateChanged")]
public class QuestStateChangedEventChannel : BaseEventChannelSO<QuestStateChangedEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9eeac19c9884b3144b390577d1c0c99f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,20 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 场景加载请求。
/// </summary>
[System.Serializable]
public struct SceneLoadRequest
{
/// <summary>目标场景名称Addressable Key</summary>
public string SceneName;
/// <summary>进入点 ID供 PlayerController 决定出生位置)</summary>
public string EntryId;
/// <summary>玩家出生点 Transition ID具体过渡门 ID可为 null</summary>
public string EntryTransitionId;
/// <summary>是否显示加载画面</summary>
public bool ShowLoadingScreen;
/// <summary>死亡复活时为 true不执行正常过渡动画</summary>
public bool IsRespawn;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 05c1eca4b1ee3d24e80a4f42e4a19276
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/SceneLoadRequest")]
public class SceneLoadRequestEventChannelSO : BaseEventChannelSO<SceneLoadRequest> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7b5bc8e9a164cd54ea37027bc06c37ff
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,14 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 商店购买事件负载(架构 15_MapShopModule §2.3)。
/// </summary>
[System.Serializable]
public struct ShopPurchaseEvent
{
/// <summary>购买的商品 ID</summary>
public string ItemId;
/// <summary>支付价格Geo</summary>
public int Price;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7fa35acf32b4f9047af74c1514117951
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/ShopPurchase")]
public class ShopPurchaseEventChannelSO : BaseEventChannelSO<ShopPurchaseEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: d3d88263c925f8347bf1e19b7fa71036
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/StatusEffect")]
public class StatusEffectEventChannelSO : BaseEventChannelSO<StatusEffectType> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 933f8f3ce17ee54409502057bd1a8138
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,17 @@
namespace BaseGames.Core.Events
{
/// <summary>
/// 状态效果类型枚举06_CombatModule §11
/// </summary>
public enum StatusEffectType
{
None = 0,
Poison = 1,
Burn = 2,
Freeze = 3,
Stun = 4,
Stagger = 5,
Bleed = 6,
Wet = 7 // 液体相关(用于液体+火=蒸汽等组合效果)
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7c5ad21970f85f04494b553fc483546a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/String")]
public class StringEventChannelSO : BaseEventChannelSO<string> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 23dad55c2f7bcc54a92ed61cc6f27c5b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,18 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 工具使用事件负载(架构 09_ProgressionModule §7.5)。
/// Tool 用地址键字符串标识,避免 Core.Events 依赖高层程序集。
/// </summary>
[System.Serializable]
public struct ToolUsedPayload
{
/// <summary>工具槽索引0 = 主槽1 = 副槽)。</summary>
public int SlotIndex;
/// <summary>工具的 Addressable 地址键(对应 AddressKeys 常量)。</summary>
public string ToolId;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6a5d53ae78d3ec74c9ec1981117953e8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Progression/ToolUsed")]
public class ToolUsedEventChannelSO : BaseEventChannelSO<ToolUsedPayload> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5ab7a70182c725f4fad23afda850433e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Transform")]
public class TransformEventChannelSO : BaseEventChannelSO<Transform> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 19580b3794783e647be1e1c0771814d0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Vector2")]
public class Vector2EventChannelSO : BaseEventChannelSO<Vector2> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1d28df1b130e12348a582259a89fa4e2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
[CreateAssetMenu(menuName = "Events/Void")]
public class VoidEventChannelSO : VoidBaseEventChannelSO { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 07c5881d0d5ca3c42949a79f40939c3e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,31 @@
using UnityEngine;
namespace BaseGames.Core.Events
{
/// <summary>
/// 世界导航标记事件负载。用于激活/失活地图标记点。
/// </summary>
public readonly struct WorldMarkerEvent
{
/// <summary>标记点唯一标识符。</summary>
public readonly string MarkerId;
/// <summary>标记点世界坐标。</summary>
public readonly Vector3 Position;
public WorldMarkerEvent(string markerId, Vector3 position)
{
MarkerId = markerId;
Position = position;
}
public override string ToString() => $"WorldMarkerEvent(Id={MarkerId}, Pos={Position})";
}
/// <summary>
/// 导航标记激活/失活事件频道EVT_WorldMarkerActivated / EVT_WorldMarkerDeactivated
/// 发布WorldMarkerOnTriggerEnter2D、EventChainNode
/// 订阅MapController更新迷雾地图标记
/// </summary>
[CreateAssetMenu(menuName = "Events/WorldMarker")]
public class WorldMarkerEventChannelSO : BaseEventChannelSO<WorldMarkerEvent> { }
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b3359e2b097190e49a4203dd215225f5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: