# Value-Observer
**Repository Path**: River314588804/value-observer
## Basic Information
- **Project Name**: Value-Observer
- **Description**: 针对 CSharp 开发中需要单独建立 "值" 观察者的应用背景。可用于 Unity 平台。
- **Primary Language**: Unknown
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-01-12
- **Last Updated**: 2026-01-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Unity, Tracker
## README
# Value-Observer | 值观察者
___

[]()
[]()
#### 说明|仓库起源
___
**简述** :针对数量庞大,且业务更新条件组合繁多,关系复杂的应用背景。
**详述** :在需要将多个变量(值)的变化传递给表现层(如 UI\模型-动作 等)或进行层级式消息分发的场景中,为了提升开发效率和代码的可维护性,需要一种机制来解决以下核心问题:
▣ **可处理** "单值" 变化。
▣ **可通知** 关注此 "单值" 的全订阅者。确保传达过程中准确、可靠。
#### 近期更新日志
___
1. 整合 [Unit DL Framework](https://gitee.com/River314588804/unity-uni-dl) 至此仓库。源仓库已关闭。
2. 添加 一个示例案例用于备忘与引导使用。
#### 说明|快速部署
___
- 移动 `RStudio/` 下目录至解决方案/个人项目 即可。(示例代码见 `AppEntry.cs`)
#### 说明|部分文件与代码
___
- Module Tracker:封装追踪值更新动作,定义与决策值更新规则与通知。
- Module Player(暂定):全局访问封装器
##### 建立数据源与 Tracker 更新机制
```csharp
# 创建监听者
public readonly Tracker inputX = new("X轴输入");
public readonly Tracker inputY = new("Y轴输入");
# 接入数据源(示例为 Unity 新输入系统)
input.actions.FindActionMap("Human").FindAction("Move").performed += value => this.inputX.Value = value.ReadValue().x;
input.actions.FindActionMap("Human").FindAction("Move").started += value => this.inputX.Value = value.ReadValue().x;
input.actions.FindActionMap("Human").FindAction("Move").canceled += value => this.inputX.Value = value.ReadValue().x;
# 添加判断规则
# HandlerRuleFloatEqualConst 继承 IHandlerRule 接口,可扩写自定义规则。
# 此处用于验证 inputX 轴值是否匹配 0f
this.inputX.AddRule(new HandlerRuleFloatEqualConst("0f", 0f));
this.inputX.AddRule(new HandlerRuleFloatEqualConst("0.5f", 0.5f));
this.inputX.AddRule(new HandlerRuleFloatEqualConst("1f", 1f));
# 绑定头启动规则(责任链机制)
this.inputX.HandlerHead = IHandlerRuleUtil.Bind(this.inputX.RuleDic.ToArray());
```
##### 注册数据层供全局访问
```csharp
# 若未实例化对象,则执行此方法即可自实例并注册
ModuleCenter.Instance.AddModule();
# 若已实例,则执行此方法注册
ModuleInputKeyboard module = new();
ModuleCenter.Instance.AddModule(module);
```
##### 订阅数据源
```
var module = ModuleCenter.Instance.GetModule()
# 获取 InputX 中关于 "值=0" 的规则下事件通知
module.inputX.GetEvent("0f").OnValueUpdated += () => Debug.Log("Done");
# 若需要获取值信息
module.inputX.GetEvent("0f").OnValueUpdated += () => Debug.Log(module.inputX.Value);
# 若希望委托传值,可添加 Action 等作为首选
```