R3 という Reactive Extensions(Rx) のモダンな実装が登場しました。Unity 向けの専用機能としてではなく、通常の .NET 開発環境でも利用可能のため、R3 を使った Observable なメッセージングの仕組みを環境を選ぶことなく利用できるようになりました。
利用機会が増えたので VisualStudio から以前記事を書いた UniRx のスニペットの記事 を置き換える形で R3 対応のスニペットを紹介したいと思います(R3 は外部ライブラリなので NuGet から追加で導入が別途必要です)
基本的に外部には Observable のみを公開して、内部は Subject が利用できる形に隠ぺいする形です。
// (1) 非公開:中身で使用するR3のプロパティ readonly R3.ReactiveProperty<int> _sample = new(); // (2) 値の変更はプロパティ経由で行う = ReactiveProperty を直接後悔しない public int Sample { get => _sample.Value; set => _sample.Value = value; } // (3) 外部にはObservableのみを公開し、Subscribeのみ許可する public R3.Observable<int> SampleChanged => _sample.AsObservable();
このように毎回実装するのは少々面倒なので VisualStudio 向けにスニペットを作成しました。
ReactivePropertyのスニペット
プロパティの変更通知を受け取るためのスニペットです。
「rxp」と3文字入力すると以下の通りひな形が作成されます。
入力可能な「型」と「プロパティ名」、「フィールド名」が変更できるので任意の入力を行います。
// スニペットの初期状態 public int Sample { get => _sample.Value; set => _sample.Value = value; } public R3.Observable<int> SampleChanged => _sample.AsObservable(); readonly R3.ReactiveProperty<int> _sample = new();
スニペットの中身はは以下の通りです。
<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>ReactiveProperty R3</Title> <Shortcut>rxp</Shortcut> <Description>ReactiveProp</Description> <Author></Author> </Header> <Snippet> <Declarations> <Literal> <ID>valueType</ID> <Default>int</Default> <ToolTip>公開する変数の型で置き換えます。</ToolTip> </Literal> <Literal> <ID>propName</ID> <Default>Sample</Default> <ToolTip>公開するプロパティの名前で置き換えます。</ToolTip> </Literal> <Literal> <ID>fieldName</ID> <Default>sample</Default> <ToolTip>内部で使用する変数の名前で置き換えます。</ToolTip> </Literal> </Declarations> <Code Language="csharp"><![CDATA[public $valueType$ $propName$ { get => _$fieldName$.Value; set => _$fieldName$.Value = value; } public R3.Observable<$valueType$> $propName$Changed => _$fieldName$.AsObservable(); readonly R3.ReactiveProperty<$valueType$> _$fieldName$ = new();$end$]]></Code> </Snippet> </CodeSnippet> </CodeSnippets>
Observableのスニペット
こちらは何らかのイベント通知を受け取るためのスニペットです。
「rxev」と4文字入力すると以下の通りひな形が作成されます。
public R3.Observable<int> Sample => _sample.AsObservable(); readonly R3.Subject<int> _sample = new();
スニペットの中身はは以下の通りです。
<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>ReactiveEvent R3</Title> <Shortcut>rxev</Shortcut> <Description>ReactiveEvent</Description> <Author></Author> </Header> <Snippet> <Declarations> <Literal> <ID>valueType</ID> <Default>int</Default> <ToolTip>公開する変数の型で置き換えます。</ToolTip> </Literal> <Literal> <ID>propName</ID> <Default>Sample</Default> <ToolTip>公開するプロパティの名前で置き換えます。</ToolTip> </Literal> <Literal> <ID>fieldName</ID> <Default>sample</Default> <ToolTip>内部で使用する変数の名前で置き換えます。</ToolTip> </Literal> </Declarations> <Code Language="csharp"><![CDATA[public R3.Observable<$valueType$> $propName$ => _$fieldName$.AsObservable(); readonly R3.Subject<$valueType$> _$fieldName$ = new();$end$]]></Code> </Snippet> </CodeSnippet> </CodeSnippets>
上記をコピペ → snippet ファイルとして保存する or gist から取得して VisualStudio の ツール > コード スニペット マネージャー からインポートすると使えるようになります。