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.cs
とPauseManager.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); } } }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。