質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1078閲覧

Mac版UnityでMessagePipe&VContainerのコードでエラー発生

hamalt

総合スコア23

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/06/05 14:20

Windowsで開発していたUnityプロジェクトをMacで開くとエラーが発生しました。
MessagePipe&VContainerによるイベント処理部分でした。

詳細は以下になります。
どなたかご教授いただけますと幸いです。

エラー内容

NullReferenceException: Object reference not set to an instance of an object MessagePipe.SubscriberExtensions.Subscribe[TMessage] (MessagePipe.ISubscriber`1[TMessage] subscriber, System.Action`1[T] handler, MessagePipe.MessageHandlerFilter`1[TMessage][] filters) (at Assets/Plugins/MessagePipe/Runtime/SubscriberExtensions.cs:14)

バージョン情報

Unity:2021.3.3f1(Windowsも同じ)
MacOS Monterey 12.3.1
VContainer 1.11.0
MessagePipe 1.7.3
MessagePipe.VContainer 1.7.3

※Windows11環境では正常に動作。

やってみて駄目だったこと

PackageManagerでインストールするのをやめ、GitHubからUnityPackageをダウンロードしてインポート。
(MessagePipe、MessagePipe.VContainer、VContainerの3つをUnityPackageで)

参考記事:
VContainer を IL2CPP ビルドでも動かす

UnityPackageのダウンロードURL:
https://github.com/hadashiA/VContainer/releases
https://github.com/Cysharp/MessagePipe/releases/

エラー該当のコード

私が作成したコード部分

Subscribe部分です:

EventController.cs

1using UnityEngine; 2using System; 3using VContainer; 4using MessagePipe; 5 6public class EventController : MonoBehaviour 7{ 8 [Inject] private ISubscriber<PausableData> PausableData { get; set; } 9 private IDisposable disposable; 10 void Start() 11 { 12 var d = DisposableBag.CreateBuilder(); 13 // このSubscribeがNull参照エラー? 14 PausableData.Subscribe(e => 15 { 16 // ポーズイベント時の処理 17 }).AddTo(d); 18 pausableDisposable = d.Build(); 19 } 20 21 void OnDestroy() 22 { 23 disposable?.Dispose(); 24 } 25}

発行データ用クラスの定義です:

PauseManager.cs

1using UnityEngine; 2using System; 3using VContainer; 4using MessagePipe; 5 6// 発行データの定義 7public class PausableData 8{ 9 public bool Pausing { get; set; } 10} 11 12public class PauseManager : MonoBehaviour 13{ 14 // 公開用イベント 15 [Inject] private IPublisher<PausableData> PausableData { get; set; } 16 17 void Start() 18 { 19 PublishData(true); 20 } 21 22 // イベントの公開 23 private void PublishData(bool pausing) 24 { 25 PausableData.Publish(new PausableData() { Pausing = pausing }); 26 } 27}

DI部分です:
GameObjectにアタッチし、以下の設定にしています。
ManagersにEventController.csPauseManager.csをアタッチしています。
イメージ説明

GameLifetimeScope.cs

1using MessagePipe; 2using VContainer; 3using VContainer.Unity; 4using UnityEngine; 5 6public class GameLifetimeScope : LifetimeScope 7{ 8 protected override void Configure(IContainerBuilder builder) 9 { 10 var options = builder.RegisterMessagePipe(); 11 builder.RegisterMessageBroker<PausableData>(options); 12 } 13}

MessagePipeコアのエラー部分

using MessagePipe.Internal; using System; using System.Threading; using Cysharp.Threading.Tasks; namespace MessagePipe { public static partial class SubscriberExtensions { // pubsub-keyless-sync public static IDisposable Subscribe<TMessage>(this ISubscriber<TMessage> subscriber, Action<TMessage> handler, params MessageHandlerFilter<TMessage>[] filters) { // ここでエラー return subscriber.Subscribe(new AnonymousMessageHandler<TMessage>(handler), filters); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

GameLifeTimeScopeを再アタッチ&再設定することで解決しました。

GameLifeTimeScope.csをコンポーネントから削除し、再アタッチしようとするとコンパイルエラーが発生したため、ファイル名を同様のGameLifeTimeScopeに再設定してから再アタッチ、Auto Inject Game Objectsに該当オブジェクトを設定しました。

投稿2022/06/07 00:57

hamalt

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問