デジタルツインの開発に応用できるUnityとredisの組み合わせ

UnityとRedisを組み合わせて使用することで、リアルタイムの多数データの同時通信を実現する開発が可能になります。
デジタルツインの開発において、実際に手掛けた案件を基に、何らかのシステム開発に携わられている方への情報共有として、記事を立ち上げてみました。需要がどのくらいあるか分からないですが、記載可能な範囲で概要レベルの簡略化した内容をこちらに掲載します。
デジタルツイン以外にも利用用途はあるかと思いますので、ご興味ある方はご一読いただければと思います。
*実際に携わった案件では各ソースコードの他、一部、数学を使用してます。また、Unity、Redisの他、pythonやdocker環境なども利用してます。ただこちらの記事ではコードや数式の類は一切省いて、簡略化して記載してます。

Unityは主にゲーム開発やインタラクティブコンテンツの制作に使用されますが、利点としてマルチプラットフォーム対応のため、同一の開発を複数環境に向けてビルドすることが可能です。一方、Redisは高速なキー値ストアであり、データの読み書きが非常に速いため、リアルタイム通信に適しています。

これらの技術を応用することにより、Unityと例えばIoTデバイスなどを組み合わせることで、デジタルツインを対象としたシステム開発をサポートすることが出来るようになります。
デジタルツインとは

以下に、UnityとRedisを組み合わせた開発方法をステップごとに説明します。個々の詳細設定まで記述すると、記事量が膨大になってしまうため、ここでの記載は概要レベルに留めますがご容赦ください。各々の詳細設定は、別途web検索などしていただければと思います。

ステップ1: 環境設定

  • Unityの準備: Unityをインストールし、新しいプロジェクトを作成します。繰り返しになりますが、Unityはマルチプラットフォームに対応してますのでフロントエンドやスマホ向け、その他XR向けに開発することも可能です。一例として、webGL形式でビルドすればhtmlファイルが出力されます。このhtmlをクラウド環境に取り入れば、容易にwebアプリを構築可能です。AWSを使用するのであれば、AWSで任意OSのEC2を起動し、apacheやnginxなどの環境を取り入れ、Unityで生成したhtmlファイルを指定位置に配置すれば、webアプリになりますし、Android向けやiOS向けにビルドすれば、スマホ向けnativeアプリとしての開発も進められます。また、少しpluginの組み込みなどが必要になりますが、OculusなどのVRやhololenseのようなMR向けにビルドすることも可能です。

  • Redisのインストール: Redisをクラウド環境のAWSやAzure、GCP環境に構築します。AWSならAmazon ElastiCacheを使用するか、あるいはEC2を立ててredisサーバーを構築しても構いません。また、redisは本来高速通信のため、dbを使用したデータ保存は利用しないことが多いですが、一部のデータのみをログ対象としてRDS環境などに保存させても構いません。但し、転送データが多くなると処理遅延に繋がるため、パフォーマンスチューニングの他、そもそもRDS環境に送るデータは必要最小限にするなどの工夫も望まれます。

  • Redisクライアントの導入: UnityプロジェクトでRedisと通信するためのクライアントライブラリ(StackExchange.Redisなど)を導入します。

ステップ2: Redisとの接続

  • 接続設定の作成: Redisサーバーのアドレスとポート番号を使用して接続設定を作成します。安全な通信を確保するために、必要に応じてパスワード保護やSSL設定を行います。

  • 接続の確立: 設定を用いてRedisサーバーへの接続を確立します。この接続は、データの読み書きを行うために使用されます。

ステップ3: データの読み書き

  • データの書き込み: UnityからRedisにデータを書き込むには、適切なキーと値を指定してSETコマンドを使用します。大量のデータや複雑なデータ構造を扱う場合は、ハッシュやリストなどのデータ型を活用します。

  • データの読み取り: Redisからデータを読み取るには、GETコマンドや、データ型に応じたコマンド(HGETALLやLRANGEなど)を使用します。これにより、リアルタイムでのデータ取得が可能になります。

ステップ4: リアルタイム通信の実装

  • Pub/Subモデルの活用: RedisのPub/Sub機能を利用して、リアルタイムでのメッセージの配信と受信を行います。これにより、サーバーとクライアント間での即時性の高い通信が可能になります。

  • データの同期: Unityクライアント間でデータを同期するために、Redisの通知機能やトランザクションを使用して、データの整合性を保ちながら高速な通信を実現します。

ステップ5: テストと最適化

  • ロードテスト: 大量のデータや多数の同時接続を模擬して、システムの耐久性とパフォーマンスをテストします。

  • 最適化: パフォーマンスのボトルネックを特定し、データの格納方法や通信の方式を最適化します。Redisの設定(例えば、メモリ管理やデータの有効期限設定)を調整することも重要です。

注意点

  • セキュリティ: セキュリティの観点からデータの暗号化やアクセス制御を適切に設定するように求められるケースもありますが、これも個々のデータを都度都度で逐一暗号化すると、それだけで負荷要因となり、結果としてredisの長所である高速大量データ通信のメリットを阻害する原因となりかねません。このため、暗号化対象とするデータをtempデータとして、例えばEC2内の任意場所などに一時保存または退避させておき、夜間にバッチ処理で一気に暗号化させて、指定の保存先に送信するなどの工夫が望まれます。

  • IoTデバイスとの組み合わせ: ここまでの記載内容はUnityとredisの組み合わせに絞ってますが、デジタルツインとして開発する場合、何らかのデータ受信デバイス(例えば物品や人物の位置座標など受信処理を担えるもの)が必要となります。IoTデバイスからredisサーバーへ、redisサーバーからUnityアプリ側へとデータの連携を行うことにより、初めて取得対象とするデータを人の目で視認できるシステムとなります。IoTデバイスのようなハード側との組み合わせを必要とするITシステムでは、障害時の原因切り分けがより一層難しくなる傾向があります。特に短時間での大量データ通信を行う場合、遅延が発生したとして、原因解析はCPU使用率などのパフォーマンスモニタや、単純に時刻を組み込んだログ取得だけでは対応できないこともあります。このため、検証用のミニマム環境を用意したり、不具合の生じた時刻、件数、不具合発生内容、検出対象項目、使用端末、使用クラウド環境などを総合的に洗い出したり、統計分析するといったサポートが必要となることもあります。

もし需要があるようでしたら、より詳細な内容や、または他のXR関連、AI関連の開発に関わる内容を記載可能な範囲で掲載しようかと思います。

この記事が気に入ったらサポートをしてみませんか?