Unity(Ver4.5)で使用するdllファイル(C#)を、Visual Studio Express 2013でクラスライブラリとして作成する方法を、「Unityで使用するC#からdllファイルの作成」で説明しました。今回は、Unity(Editor Ver:2022.3.11f1)で使用するdllファイル(C#)を、Visual Studio 2022でクラスライブラリとして作成する方法を説明します。
今回作成するアプリは、Unityを使ってBluetoothLEデバイスからのアドバタイズパケットを受信して接続します。
Unityでの「Windows.Foundation.UniversalApiContract」の参照不可のエラーが発生して、コンパイルができませんでした。原因は不明。
Visual Studio 2022によるプロジェクトの作成
Visual Studio 2022を起動し、「新しいプロジェクトの作成」をクリックし、次のようにC#クラスライブラリを選択します。
表示された「新しいプロジェクトを作成します」ダイアログでプロジェクト名を「TestScan」とし、次の「追加情報」ダイアログでフレームワーク「.NET Standard2.1」を選択し、新規プロジェクトを作成します。
UWP用APIが使えるアドオン「Microsoft.Windows.SDK.Contracts」」のインストール
ツールメニューから「NuGetパッケージマネージャ」→「ソリューションのNuGetパッケージの管理」を選択して、NuGetパッケージの管理画面を表示します。
NuGetパッケージの管理画面から、「Microsoft.Windows.SDK.Contracts」を検索してインストールします。インストールが完了すると、ソリューションエクスプローラの依存関係に「Microsoft.Windows.SDK.Contracts」が表示されます。
Windows10のBLE周りのAPIはUWPアプリ専用のため、.NET Frameworkからは、WinRTのAPI「Microsoft.Windows.SDK.Contracts」を経由してアクセスする必要があります。
UnityEngine.DLLの参照設定
Unity(Editor Ver:2022.3.11f1)のUnityEngine.DLLは、「c:\Program Files\2022.3.11f1\Editor\Data\Managed」に置かれています。これを新規に作成したプロジェクト内「 ・・Project\TestScan\TestScan」に置いて、Visual Studio 2022から参照します。
参照するためには、Visual Studio 2022のソリューションエクスプローラーの依存関係を右クリックし、参照の対かを選択して、先ほどディスクトップに置いたUnityEngine.DLLを選択します。
正常に参照できると、次のように参照設定の表示に、「UnityEngine」が追加されます。
アドバタイズメントスキャンアプリの作成
C# .NET Frameworkのコンソールアプリで作成したアドバタイズメントスキャンプログラムは、BluetoothLEデバイスからのアドバタイズパケットを受信して接続します。アドバタイズメントスキャンプログラムを次に示します。
using System; using System.Threading; using Windows.Devices.Bluetooth.Advertisement; using UnityEngine; public class TestScan : MonoBehaviour { BluetoothLEAdvertisementWatcher? watcher; public void Start() { UnityEngine.Debug.LogWarning("Start"); watcher = new BluetoothLEAdvertisementWatcher(); watcher.Received += Watcher_Received; watcher.ScanningMode = BluetoothLEScanningMode.Passive; watcher.Start(); Thread.Sleep(60000); watcher.Stop(); UnityEngine.Debug.LogWarning("Stop"); } public void Watcher_Received(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs args) { UnityEngine.Debug.LogWarning("---Received---"); var bleServiceUUIDs = args.Advertisement.ServiceUuids; UnityEngine.Debug.LogWarning("Found"); UnityEngine.Debug.LogWarning("MAC:" + args.BluetoothAddress.ToString()); UnityEngine.Debug.LogWarning("NAME:" + args.Advertisement.LocalName.ToString()); UnityEngine.Debug.LogWarning("ServiceUuid"); foreach (var uuidone in bleServiceUUIDs) { UnityEngine.Debug.LogWarning(uuidone.ToString()); } UnityEngine.Debug.LogWarning("---END---"); UnityEngine.Debug.LogWarning(""); } }
コンパイルすると「Unity Projects\SerialHandler\SerialHandler\bin\Debug」に「SerialHandler.dll」が作成されます。
namespaceは外します。namespaceを付与したときはUnityで次のエラーが表示されます。
dllファイルをUnityへ登録
作成された「SerialHandler.dll」を、次のようにunityのProjectのAssetsにトラッグします。
Unity で.NET Standard2.1 を使用する
「Edit」→「Project Setting」を選択します。
表示されたダイアログで、「Player」→「Configuration」→「Api Compatibility Le..」を選択して、「.NET Standard2.1 」を選択します。
Unityのサンプルコードの作成
作成したUnityのサンプルコードを次に示します。
using UnityEngine; public class TestScanSampleCode : MonoBehaviour { private TestScan m_TestScan; void Start() { UnityEngine.Debug.LogWarning("start"); m_TestScan = gameObject.AddComponent<TestScan>(); m_TestScan.Start(); } }
Unityのサンプルコードのコンパイル
Unityで作成したサンプルコードをコンパイルすると、次のエラーが発生します。
- Assembly ‘Library/ScriptAssemblies/Assembly-CSharp.dll’ will not be loaded due to errors:
Reference has errors ‘TestScan’. - Assembly ‘Assets/TestScan.dll’ will not be loaded due to errors:
Unable to resolve reference ‘Windows.Foundation.UniversalApiContract’. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.