Page 1 of 1

DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/05/25 01:59
by tsumegaeru
OS: Windows10
Unity: 2019.2.10f1
Arbor: 3.6.8
再現方法: 不明
ビルドプラットフォーム:Windows Player

おそらくこちらの投稿と同じケースだと思うのですが
viewtopic.php?f=6&t=2652

DataBranch.cs の FindOutputSlot()で
nodeBehaviour.GetDataSlotField(slotIndex) が 稀に null を返し
NullReferenceException が発生する事がありました。直後に

Code: Select all

if (slotInfo == null) { continue; } 
を挿入することでほとんどの場合では例外の発生を防げているのですが
本来アクセスすべきスロットが null を返してしまう場合があるようで、
こうなると当然nodeGraphも正しく動作しません。

なにか解決策はありますでしょうか。
よろしくお願い致します。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/05/25 02:48
by caitsithware
ご報告ありがとうございます。

nodeBehaviour.GetDataSlotField(slotIndex)が稀にnullを返す、ということですね。
再現方法不明ということなので、ひとまずソースコードの確認からいたしました。

Arbor内部で意図的にnullを入れている箇所は見つからなかったため、Unityによる生成処理などにより勝手に変更されてしまうのかもしれません。

暫定対処

暫定対処ですが、問題となるDataSlotField自体はシーンに保存されない内部的なデータとなるため、シーンを開き直すなどで例外そのものは発生しなくなるかと思います。
ただし、保存していないシーンだった場合、例外が発生している状態でシーンを保存してしまうと他に何かしら問題が発生する可能性もあるため、ご注意ください。

コード上での暫定対処としましては、ご提示していただいたように、

Code: Select all

if (slotInfo == null) { continue; } 
と追加することで、結果的にDataSlotFieldが見つからなければDataSlotFieldの再構築が行われるようになっております。
これで再構築を行ってもなお「本来アクセスすべきスロットがnullを返してしまう」ということなので、他にも不具合があるなど根本的な原因は別にあるのかもしれません。



引き続き調査してまいります。
もし再現方法や、再現プロジェクト(Arborや他アセットなどを含まない最小構成)がありましたら追記していただけると助かります。

以上です。
ご不便おかけして申し訳ございませんがよろしくお願いいたします。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/05/25 04:04
by caitsithware
追記です。

いくつかご確認したい点がございます。
  1. 発生するのを確認した直前に行っていたこと
    Arborのグラフを組んでいる時でしたら、何を直前に行っていたか、だいたい覚えている範囲で良いので教えてくださると助かります。
  2. Arborの更新などを最近行ったか
    もし更新の際に上書きインポートのみ行った場合、古いクラスにより不具合が発生する可能性が高いです。
    アップデートガイドを参考に、インポートし直してみてください。
    また、Unityの不具合なのか稀にスクリプトファイルを更新してもコンパイルが行われず処理がおかしくなるケースもあるようなので、Reimport Allなどを行って様子を見るのも良いかもしれません。
  3. 例外が発生した時のスタックトレース
    どのタイミングでこの例外が発生するか知りたいので、例外が発生した際のログでスタックトレース(Consoleの詳細で見れるどのメソッドが呼ばれたかの情報)をそのまま張っていただけると助かります。
  4. 該当スロットを持っているNodeBehaviourの型は何か
    slotInfoのnull判定を以下のように書き換えて、NodeBehaviourの型が何かを教えていただきたいです。

    Code: Select all

    if( slotInfo == null )
    {
    	Debug.LogError("slotInfo == null : " + nodeBehaviour.GetType());
    	continue;
    }
    
    また自作したスクリプトであれば、どのような形でスロットを持っているか等も教えていただけると助かります。
再現できた時の情報提供につきましては、再現手順不明とのことなのでもし再び発生するようなことがあればその時に張っていただければ大丈夫です。

以上です。
お手数おかけして申し訳ございませんが、上記の点ご確認よろしくお願いいたします。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/05/26 08:59
by tsumegaeru
早速のご返答ありがとうございます。

1.に関して
 →ゲームのプレイ中に発生しました
2.に関して
 →バージョンの変更は行っていません(最初から3.6.8)

3、4については確認でき次第ご報告させていただきます。
引き続きよろしくお願い致します。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/05/26 09:42
by caitsithware
情報提供ありがとうございます。
tsumegaeru wrote: 2020/05/26 08:59 1.に関して
 →ゲームのプレイ中に発生しました
こちらについて、もう少し詳細にお聞きしたい点がございます。
  • UnityEditor上でプレイしての動作確認中でしょうか。
    あるいはWindows用ビルドを行って実行形式のみでのプレイ中ということでしょうか。
  • UnityEditor上でのプレイ中ということでしたら、プレイ中に何かしら編集は行いましたか?
    例:「データスロットを接続した」「スクリプトを書き替えてコンパイルが走りホットリロードが入った」「編集中にアンドゥリドゥを何回かした」など。
  • 例外が発生する以前に問題なく動作していた時から例外が発生するようになるまでの間に行った変更点など。
    覚えている限りで構いませんので、この時までは大丈夫だったけどこういうことしたら発生するようになったといった心当たりなどありましたら教えてください。
  • 編集などしていなかったとしても、どういったタイミングで発生しましたか?
    例:「再生ボタン押した瞬間から発生していた」「敵が新たに湧いたときに発生した」「動作確認のためにArborEditorを開いたら発生した」など。
覚えている限りで些細なことでも構いませんので、再現に繋がりそうな情報がありましたら教えてくださると助かります。
tsumegaeru wrote: 2020/05/26 08:59 2.に関して
 →バージョンの変更は行っていません(最初から3.6.8)
バージョンについては把握いたしました。
なお現在最新版は3.6.11でいくつか不具合修正も行っているため、折を見てよろしければ更新もしてみてくださいね。

3、4についても確認でき次第ご報告いただけるということで助かります。
再現が取れないことには、ご提示いただいたようなnullチェック入れ込むだけの暫定対処になってしまいますので、原因特定へ協力していただけるのは本当に助かります。
ご不便おかけして申し訳ございませんがよろしくお願いいたします。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/06/03 01:59
by tsumegaeru
ご返答が遅くなって申し訳ありません。
あるいはWindows用ビルドを行って実行形式のみでのプレイ中ということでしょうか。
Editor上でも実行形式でも発生していました。
この時までは大丈夫だったけどこういうことしたら発生するようになったといった心当たりなどありましたら教えてください。
まとまった量の実装を行った後で発生に気づいたので、申し訳ないのですがこれといった心当たりはありません。
再現が取れないことには、ご提示いただいたようなnullチェック入れ込むだけの暫定対処になってしまいますので、原因特定へ協力していただけるのは本当に助かります。
はい、こちらもそのつもりでおります。
作業の状況が変わってしまってすぐには調べられないのですが、
もう少し詳しいことが分かり次第、また書き込みをさせて頂きます。

引き続きよろしくお願い致します。

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2020/06/03 02:31
by caitsithware
ご返答ありがとうございます。
こちらも引き続き調査してまいります。

また最新バージョンの3.6.12では、暫定対処としてnullだった場合にエラーログを出力するという形に変更いたしました。
例外が発生して処理が止まるよりかは多少マシかと思いますので、もしよろしければ更新してみてください。
3.6.12リリースノート

Re: DataBranch.cs の FindOutputSlot()で NullReferenceException が発生

Posted: 2021/07/28 12:19
by caitsithware
こちら、長らく再発していない模様&最新版では該当箇所の処理が変更されているため一旦このトピックはクローズといたします。
似たような不具合が発生した場合でも別途トピックを立ててご報告いただけると助かります。