目次
概要
- ピュアC#の.NETプロジェクトでModel層を作成する
- R3 を導入してRxをシームレスに利用する
- Unity プロジェクトはすでに存在するものとする
環境
- Unity 2022.3.21f1
- R3 1.1.11
手順
- 新しいクラスライブラリプロジェクトを作成する
- フレームワークは、.NET Standard 2.1 を選択
- NuGet でR3をインストール
- Directory.BUild.props を作成
- Unity側からビルド出力のフォルダが無視されるようにする
<?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="15.0"xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><PropertyGroup><ArtifactsPath>$(MSBuildThisFileDirectory).artifacts</ArtifactsPath></PropertyGroup></Project>
- csproj を開いて編集
- LangVersion : 9.0
- None Remove を追加する
- Unityが生成するUnity向けのファイルを.NETのプロジェクトで無視するようにする
<PropertyGroup><TargetFramework>netstandard2.1</TargetFramework><LangVersion>9.0</LangVersion><Nullable>enable</Nullable></PropertyGroup><ItemGroup><None Remove="**\package.json" /><None Remove="**\*.asmdef" /><None Remove="**\*.meta" /></ItemGroup><ItemGroup><PackageReference Include="R3"Version="1.1.11" /></ItemGroup>
- package.jsonを追加する
{ "name": "xrproject_vnext.models.shared.unity", "displayName": "Models.Shared.Unity", "description": "Models.Shared.Unity", "version": "0.0.1", "unity": "2022.3", "author": "yotiky", "dependencies": { "org.nuget.r3": "1.1.11", "org.nuget.microsoft.net.stringtools": "1.0.0" } }
- asmdefを追加する
{ "name": "Models.Shared.Unity", "references": [], "optionalUnityReferences": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, "overrideReferences": false, "precompiledReferences": [], "autoReferenced": true, "defineConstraints": [] }
- 以降Unityプロジェクトで
- Add package from disk... で上記package.jsonを追加する
- Unityプロジェクト側のasmdefに上記asmdefの参照を追加する
- Packages\manifest.jsonの絶対パスを相対パスに修正する
"xrproject_vnext.models.shared.unity": "file:../../Models/ClassLibrary1",
サンプル実装
.NET プロジェクト
publicclassSampleClass { privatereadonly ReactiveProperty<int> _number =new(0); public ReadOnlyReactiveProperty<int> Number => _number; private Subject<Unit> _onCalled =new Subject<Unit>(); public Observable<Unit> OnCalled => _onCalled; publicvoid Increment() { _number.Value++; } publicvoid CallOnNext() { _onCalled.OnNext(Unit.Default); } }
Unity プロジェクト - サンプルコードを実装して空のGameObjectに追加する
void Start() { var model =new SampleClass(); model.OnCalled .Subscribe(_ => Debug.Log("OnCalled")) .RegisterTo(destroyCancellationToken); model.Number .Subscribe(x => Debug.Log($"Number changed : {x}")) .RegisterTo(destroyCancellationToken); model.CallOnNext(); model.Increment(); model.CallOnNext(); model.Increment(); }
実行結果