響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來!

響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來!-CSDN博客

響應式編程入門教程第二節:構建 ObservableProperty<T> — 封裝 ReactiveProperty 的高級用法-CSDN博客

今天我們來聊聊 Unity 開發中的一個利器:UniRx。如果你還在為各種數據變化、事件通知、異步操作的混亂代碼而頭疼,那么 UniRx 絕對能為你打開一扇新大門。

在 UniRx 眾多強大而復雜的概念中,我們今天首先要深入了解一個非常核心且實用的成員——ReactiveProperty<T>。掌握了它,你就掌握了 UniRx 在數據綁定和狀態管理方面最常用的能力。

什么是 ReactiveProperty?

簡單來說,ReactiveProperty<T> 是 UniRx 庫提供的一個“可觀察的屬性”。你可以把它想象成一個擁有自帶事件訂閱能力的普通變量:當你修改它的值時,所有關心這個值變化的地方都會立即收到通知。

在傳統的 Unity 開發中,我們經常使用事件(Events)、委托(Delegates)或回調函數來處理數據變化。例如,為了追蹤玩家生命值的變化,你可能會這樣寫:

public class PlayerStats
{private int _health;public event Action<int> OnHealthChanged; // 使用事件來通知變化public int Health{get => _health;set{if (_health != value) // 只有值真的改變了才觸發{_health = value;OnHealthChanged?.Invoke(_health); // 手動觸發事件}}}
}

這段代碼看似沒問題,但當項目中需要追蹤多個屬性、它們之間有依賴關系,或者涉及復雜的異步操作時,代碼就會變得越來越龐大和復雜。你需要手動管理各種事件的訂閱和取消訂閱,稍不注意就可能引入 Bug 或內存泄漏。

而 **ReactiveProperty<T> 的出現,就是為了以一種更優雅、更“響應式”的方式來解決這些問題。**它將數據的變化視為一個可以被觀察的序列,讓你的代碼邏輯更加清晰和模塊化。

ReactiveProperty 的核心特性

ReactiveProperty<T> 能夠實現數據通知,主要得益于它的幾個核心特性:

  • 數據綁定與通知自動化: ReactiveProperty<T> 最強大的地方在于它的值變化時會自動發出通知。這意味著你可以輕松地將 UI 元素、游戲邏輯或其他系統與 ReactiveProperty<T> 綁定起來。當 ReactiveProperty<T> 的值改變時,所有訂閱者都會收到通知并執行相應的邏輯,無需像傳統方式那樣手動去調用事件。

  • 泛型支持: ReactiveProperty<T> 是一個泛型類 (ReactiveProperty<int>ReactiveProperty<string>ReactiveProperty<bool> 甚至是你自定義的類型,比如 ReactiveProperty<PlayerState>)。這種設計讓它可以包裝任何類型的數據,極大地增加了代碼的通用性和復用性。

  • 強大的訂閱機制 (Subscription): 通過 Subscribe() 方法,你可以非常方便地監聽 ReactiveProperty<T> 的值變化。每次 Value 更新時,你訂閱的回調函數就會被執行。

using UniRx; // 別忘了引入 UniRx 命名空間
using UnityEngine;
using System; // 包含 Action 和 IDisposablepublic class ReactivePropertyExample : MonoBehaviour
{// 1. 創建一個初始值為100的 ReactiveProperty<int>private ReactiveProperty<int> playerHealth = new ReactiveProperty<int>(100);void Start(){Debug.Log($"玩家初始生命值:{playerHealth.Value}"); // 輸出:玩家初始生命值:100// 2. 訂閱 playerHealth 的變化// 當 playerHealth.Value 改變時,Lambda 表達式中的代碼會被執行// Subscribe 方法會返回一個 IDisposable 對象IDisposable healthSubscription = playerHealth.Subscribe(newHealth =>{Debug.Log("玩家生命值變化,當前為:" + newHealth);// 在這里可以更新 UI 文本,播放音效,觸發游戲邏輯等});// 3. 改變值,觸發訂閱playerHealth.Value = 90; // 輸出:玩家生命值變化,當前為:90playerHealth.Value = 80; // 輸出:玩家生命值變化,當前為:80// 4. 當不再需要監聽時,記得取消訂閱以防止內存泄漏// healthSubscription.Dispose();// 在 Unity 中,我們通常會使用更方便的方式...}
}

關于 IDisposableDispose() 每一次調用 Subscribe() 都會建立一個訂閱關系。如果不及時取消,即使訂閱者對象(比如 MonoBehaviour)已經被銷毀,訂閱關系依然存在,可能導致內存泄漏,甚至在已銷毀的對象上調用回調函數導致空引用異常IDisposable 接口就是為了提供一種統一的資源釋放機制。調用 Dispose() 就能斷開訂閱。

在 Unity 中,UniRx 提供了一個非常方便的擴展方法 AddTo(),它可以自動管理訂閱的生命周期。你通常會看到這樣的用法:

playerHealth.Subscribe(newHealth => {// ...你的邏輯
}).AddTo(this); // 當當前 MonoBehaviour (this) 被銷毀時,這個訂閱會自動取消

強烈推薦你在 Unity 項目中始終使用 AddTo() 來管理訂閱,它能大大簡化你的代碼并有效防止內存泄漏。

  • 初始值發射: ReactiveProperty<T> 在被訂閱時,會立即發射一次當前的值。這是一個重要的特性,它確保了訂閱者在訂閱后能立刻獲取到當前狀態,例如在 UI 初始化時直接顯示正確的值,而無需額外編寫初始化邏輯。
    ReactiveProperty<int> score = new ReactiveProperty<int>(0);// 假設在游戲開始時訂閱
    score.Subscribe(currentScore => {Debug.Log("當前分數:" + currentScore); // 立即輸出 "當前分數:0"
    }).AddTo(this);score.Value = 100; // 再次輸出 "當前分數:100"

什么時候使用 ReactiveProperty?

ReactiveProperty<T> 在以下場景中會發揮巨大作用:

  • 數據驅動 UI: 將 UI 文本、進度條、圖像等直接綁定到 ReactiveProperty<T>。當數據變化時,UI 會自動更新,無需你在 Update() 或每次數據改變時手動刷新。

  • 游戲狀態管理: 優雅地管理玩家生命值、金幣數量、技能冷卻時間、關卡進度、游戲模式等各種可變狀態。

  • 配置和設置: 實時更新并響應游戲配置或用戶設置的變化。

  • 事件替代: 在某些情況下,它可以作為傳統事件的強大替代品,提供更強大的數據流操作能力,讓邏輯更集中、可讀性更高。

  • 與其他 UniRx 操作符結合: ReactiveProperty<T> 是一個 IObservable<T>,這意味著你可以對它使用 UniRx 提供的各種操作符(如 WhereSelectThrottle 等),進行過濾、轉換、合并等復雜的數據流處理。

ReactiveProperty<T> 是 UniRx 構建響應式系統的重要基石。理解了它,你就邁出了掌握 UniRx 的第一步。在下一篇教程中,我們將基于 ReactiveProperty<T>,展示如何進行二次封裝,構建一個功能更強大的 ObservableProperty<T>,敬請期待!

?響應式編程入門教程第一節:揭秘 UniRx 核心 - ReactiveProperty - 讓你的數據動起來!-CSDN博客

響應式編程入門教程第二節:構建 ObservableProperty<T> — 封裝 ReactiveProperty 的高級用法-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87791.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87791.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87791.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機:STM32F103的開發環境搭建

本文將詳細介紹如何搭建STM32F103的開發環境。STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3內核的32位微控制器&#xff08;MCU&#xff09;&#xff0c;廣泛應用于嵌入式開發。以下是搭建開發環境的詳細步驟&#xff0c;涵蓋硬件準備、軟件安裝、工具鏈配置及簡…

eNSP中實現vlan間路由通信(路由器)

eNSP中實現vlan間路由通信&#xff08;路由器&#xff09; 拓撲圖PC配置 pc1&#xff1a;192.168.10.1255.255.255.0192.168.10.254pc2&#xff1a;192.168.20.1255.255.255.0192.168.20.254pc3&#xff1a; 192.168.10.2255.255.255.0192.168.10.254pc4:192.168.20.2255.255.2…

spring6合集——spring概述以及OCP、DIP、IOC原則

spring6合集——Spring6核心知識點總結啟示錄一、SOLID原則1. 單一職責原則&#xff08;SRP&#xff09;2. 開閉原則&#xff08;OCP&#xff09;3. 里氏替換原則&#xff08;LSP&#xff09;4. 接口隔離原則&#xff08;ISP&#xff09;5. 依賴倒置原則&#xff08;DIP&#x…

Stata如何做機器學習?——SHAP解釋框架下的足球運動員價值驅動因素識別:基于H2O集成學習模型

SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型? 歡迎關注 「阿水實證通」&#xff0c;前沿方法時刻看&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 文章目錄 SHAP解釋框架下的足球運動員價值驅動因素識別——基于H2O集成學習模型?聚焦&…

基于Android的益智游戲學習系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Oracle11G Linux版本(linux_x86_64_oracle11.2.0.4)

Oracle11G Linux版本 linux_x86_64_oracle11.2.0.4 文件分割成 七個 壓縮包&#xff0c;必須集齊 七個 文件后才能一起解壓一起使用&#xff1a; p13390677_112040_Linux-x86-64_7of7.zip下載地址&#xff1a; https://download.csdn.net/download/weixin_43800734/20303421 p1…

C++20中的counting_semaphore的應用

一、std::counting_semaphore 在前面介紹過C20中的同步庫&#xff0c;其中就提到過std::counting_semaphore。但當時的重點是同步庫的整體介紹&#xff0c;本文則會對std::counting_semaphore這個信號量進行一個全面的分析和說明&#xff0c;并有針對性的給出具體的例程。 C20中…

mongo常用命令

1 連接mongo服務器 mongo ip:端口/庫名 -u 用戶名 -p 密碼 2 選擇數據庫 show dbs; 顯示數據庫列表 use 數據庫名稱; 3 集合操作 &#xff08;1&#xff09; 顯示集合列表 show tables; &#xff08;2&#xff09;刪除集合 db.集合名稱.drop(); &#xff08;3&#x…

華為云 銀河麒麟 vscode遠程連接

解決方案 檢查 SSH 服務器配置&#xff1a; 在遠程主機上編輯 /etc/ssh/sshd_config 文件 關鍵配置說明&#xff1a; AllowTcpForwarding yes # 允許TCP端口轉發&#xff08;必須開啟&#xff09; AllowAgentForwarding yes # 允許SSH代理轉發&#xff08;可選&#xf…

有限狀態機(Finite State Machine)

文章目錄有限狀態機&#xff08;Finite State Machine&#xff09;簡介狀態機的組成六要素(1) 狀態集合(2) 初態(3) 終態(4) 輸入符號集(5) 輸出符號集(6) 狀態轉移函數狀態機的工作四要素(1) 現態(2) 輸入(3) 輸出(4) 次態FPGA中的狀態機模型1. Moore型狀態機(1) Moore l型(2)…

前端框架中注釋占位與Fragment內容替換的實現與優化

在現代前端開發中&#xff0c;使用注釋占位符替換Fragment內容是一種常見的需求&#xff0c;尤其在處理動態內容、模板預加載和組件復用場景中。React和Vue作為當前最主流的前端框架&#xff0c;提供了不同的實現方式和優化策略&#xff0c;但核心目標都是減少不必要的DOM操作&…

uniapp中使用web-worker性能優化的分享

為什么要使用 web-workers原因很簡單&#xff0c;將復雜的計算邏輯和耗時邏輯放到線程中運行&#xff0c;避免ui阻塞&#xff0c;防止卡頓問題場景&#xff1a;本次運用于GPS 位置更新接入小程序注意事項&#xff1a;微信小程序中只允許存在一個 worker所以&#xff0c;需要再一…

5118 API智能處理采集數據教程

簡數采集器支持調用5118 API接口處理采集的數據標題和內容、關鍵詞、描述等&#xff0c;還可配合簡數采集的SEO功能優化文章數據&#xff0c;對提高收錄有積極的作用。 簡數采集器支持5118接口&#xff1a;5118智能核心詞提取API 和 5118智能摘要提取API 。 接入使用教程 1. …

【深度學習:進階篇】--4.2.詞嵌入和NLP

在RNN中詞使用one_hot表示的問題 假設有10000個詞 每個詞的向量長度都為10000&#xff0c;整體大小太大 沒能表示出詞與詞之間的關系 例如Apple與Orange會更近一些&#xff0c;Man與Woman會近一些&#xff0c;取任意兩個向量計算內積都為0 目錄 1.詞嵌入 1.1.特點 1.3.wor…

WebRTC 的 ICE candidate 協商

文章目錄 前言WebRTC 的 ICE candidate 協商1. 什么是 ICE candidate&#xff1f;2. ICE 協商的流程3.前端使用 ICE candidate 協商代碼示例1&#xff09;收集 candidate 并發送2&#xff09;WebSocket 接收 candidate 并添加 4. ICE candidate 的類型5. ICE 協商常見問題6. 關…

卡爾曼濾波介紹

卡爾曼濾波介紹&#x1f4d6; **卡爾曼濾波原理簡介**&#x1f511; **核心思想**&#x1f4e6; **卡爾曼濾波的組成**&#x1f50d; **代碼分析&#xff08;kalman_filter.py&#xff09;**&#x1f3d7;? 1. 狀態空間定義&#x1f504; 2. 初始化模型矩陣&#x1f680; 3. 核…

遞歸與循環

文章目錄遞歸TestRecursiveListRemoveNodeTestRecursiveListRemoveNode2循環TestWhileLoopListRemoveNodeTestWhileLoopListRemoveNode2遞歸 關鍵理解這幾點&#xff1a; 1、求解基本問題 2、將原問題拆分為小問題&#xff0c;直至基本問題&#xff08;難點&#xff09; 3、借…

3D魔方游戲

# 3D魔方游戲 這是一個基于Three.js的3D魔方游戲&#xff0c;支持2到6階魔方的模擬操作。 ## 功能特點 - 支持2到6階魔方 - 真實的3D渲染效果 - 鼠標操作控制 - 隨機打亂功能 - 提示功能 - 重置功能 ### 安裝依賴 bash npm install ### 啟動游戲 bash npm start 然…

下載安裝 com0com

下載 在 sourceforge 網站下載安裝器&#xff1a;下載鏈接 安裝完成后可以在設備管理器中看到默認創建的一對虛擬串口 使用串口調試助手收發 使用串口調試助手分別打開。如下圖所示&#xff0c;在端口選擇的下拉列表中可以看到剛才在設備管理器中看到的 COM3 和 COM5 分…

C++ 應用軟件開發從入門到實戰詳解

目錄 1、引言 2、IDE 開發環境介紹 2.1、Visual Studio 2.2、Qt Creator 3、 C語言特性 3.1、熟悉泛型編程 3.2、了解C/C異常處理 3.3、熟練使用STL容器 3.4、熟悉C11新特性 4、Windows 平臺的編程技術與調試技能 4.1、需要掌握的若干編程技術和基礎知識 4.2、需…