Page 1 of 2

Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/07 14:24
by YMMY
OS: Windows10 Pro 1903
Unityバージョン: 2019.3.5f1
Arborバージョン: 3.6.10
再現方法: 下記参照
ビルドプラットフォーム: Windows x86_64
動画など: https://www.dropbox.com/s/9ush5029eo3vi ... 3.zip?dl=0

自作のデコレータとビヘイビアを用いて3Dモデルのアニメーション制御を行っていますが、上記ファイルに同梱した動画のように、Arborのエディターウィンドウを開いているかどうかで動作が異なっています。
はじめにウィンドウ非表示だと、画面左下のようにGroundからJetPackへほとんど遷移せず停止しています。
しかし、ウィンドウを表示していると期待通りの動作を(すぐに条件判定してCrossFade)しています。
またウィンドウを非表示にするとはじめと同様になります。

他にも色々なアセットが入ってはいますが、ウィンドウの表示非表示で動作が変わっているのは確かだと思います。
また、これをビルドしたアプリでもウィンドウ非表示時と同じ挙動でした。
Windows10 Proの他PCでもこのプロジェクトをインポートしてみましたが、やはり同様の動作でした。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/08 01:26
by caitsithware
ご報告ありがとうございます。

添付していただいたデータを拝見いたしました。
たしかにArborEditorウィンドウが表示されているかどうかで動作が異なっているようです。

まずは、ArborEditorウィンドウの表示の有無によってFSMやBTのノードが遷移されずに停止してしまっているかについて簡易な再現確認を行ってみましたが、再現できませんでした。

再現確認環境:
  • OS: Windows 10 Pro 1903
  • Unityバージョン: 2019.3.13f1(こちらでは原則としてUnityバージョンのbugfix――13f1の部分については最新版のみ確認を行っています)
  • Arborバージョン: 3.6.10 (Release)
再現確認手順:
  • Unity 2019.3.13f1で新規プロジェクト作成
  • Arbor 3.6.10インポート
  • 添付したArborDebugLog.unitypackageをインポート
    ArborDebugLog.unitypackage
    (5.55 KiB) Downloaded 263 times
  • ArborDebugLog/ArborDebugLogシーンを開く。
  • ArborEditorウィンドウを開かずに実行。
  • Consoleを確認(順当に全てのノードが実行できているのを確認)
また、似た環境のプロジェクト構築には時間がかかってしまいそうです。
もしよろしければ、以下の情報も提供していただけると助かります。
  • どこかのノードで意図せず停止しているか。何が動作していないか
    • animator.CrossFade()の呼び出しまでたどり着いているか
    • Transition呼んでるのに遷移しない
    • OnConditionCheckでtrue返してるのに切り替わらない
    • Arborから呼ばれるはずのメソッドが呼ばれなくなっている
    などなど
  • 可能であれば再現確認可能な最小構成プロジェクト(他アセットなども含まずArbor3.6.10インポートさえすれば再現確認できるもの)
ArborEditorウィンドウを開かずにノードが実行されているかの確認には、添付したArborDebugLogにあるスクリプトで可能です。
またArbor側のコードにデバッグ出力を書くなども含め原因調査協力もしていただけると助かります。

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

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/08 10:03
by caitsithware
追記です。

AnimationCrossFadeを使った場合の似たような環境も作ってみましたが再現できませんでした。

再現確認環境:
  • OS: Windows 10 Pro 1903
  • Unityバージョン: 2019.3.13f1(こちらでは原則としてUnityバージョンのbugfix――13f1の部分については最新版のみ確認を行っています)
  • Arborバージョン: 3.6.10 (Release)
再現確認手順:
  • Unity 2019.3.13f1で新規プロジェクト作成
  • Arbor 3.6.10インポート
  • 添付したArborSupport_AnimationCrossFade.unitypackageをインポート
    ArborSupport_AnimationCrossFade.unitypackage
    (8.35 KiB) Downloaded 270 times
  • Support/AnimationCrossFade/Sceneを開く。
  • ArborEditorウィンドウを開かずに実行。
  • Animatorウィンドウを開き、HierarchyのAnimatorゲームオブジェクトを選択。
  • キーボードの0~5を押して、Animatorのステートが切り替わっているのを確認。
再現確認可能な方法、もしくは原因となりそうな箇所の心当たりなどありましたら教えてください。

お手数おかけして申し訳ありませんが、よろしくお願いいたします。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/08 18:15
by YMMY
お疲れ様です。
迅速なご対応いただきありがとうございます。
ご用意いただいたパッケージや手順を確認しましたが、確かにそちらで作成されたものについては問題なく動いています。
しかし、説明不足でしたが今回の例におけるJetPackは該当キーを押下し続ける時だけそのステートになります。
(キー入力で直接そのアニメーションにCrossFadeするわけではありませんが)

そこで、頂いたパッケージをもとにこちらで想定している挙動に近いものを作成しましたが、やはりエディターウィンドウの表示非表示で挙動が異なるようです。
また、ウィンドウ表示時でも、AnimatorCrossFadeのTransitionDurationの値を大きくすると、ウィンドウ非表示時と同様の挙動になるようです。
(動画: https://www.dropbox.com/s/6f5mxt2jn5fzm ... n.mp4?dl=0)
今回は最小構成で再現できるように準備致しましたので、お手数ですがご確認頂けないでしょうか。

再現結果の動画:https://www.dropbox.com/s/4dr4gqawc6pzd ... C.mp4?dl=0

再現確認環境:
OS: Windows 10 Pro 1903
Unityバージョン: 2019.3.13f1
Arborバージョン: 3.6.10

再現確認手順:
Unity 2019.3.13f1で新規プロジェクト作成
Arbor 3.6.10インポート
ArborSupport_AnimationCrossFade.unitypackageをインポート
適当なHumanoidの3Dモデル及び対応するアニメーションをインポート(今回の例ではStandard AssetsのEthanを使用)
Arbor_TestInput_CrossFade.unitypackage(https://www.dropbox.com/s/xkdjt092rzkpz ... ckage?dl=0)をインポート
TestInputSceneを開く
3Dモデルを適当な位置に配置(Apply Root Mptionは必要であればOff)
3DモデルのAnimatorにTestInputAnimを適用
TestInputAnim内部の各ステートにアニメーションが適用されていない場合は、適当なものをそれぞれ設定する
BTおよびFSMでAnimatorの参照を3Dモデルのものに設定
再生
Arborエディターを開いていると、CキーとXキーを押下し続けている時のみDashやJetPackになる(期待通りの挙動)
各ノードのDebugLogServiceをDisableすると、エディター表示時はほぼ期待通りの動作になるが、エディター非表示時には違った動作になる

ひとまずParameterContainer経由でParameterCheckすれば期待通りの挙動になるようなので、仮に原因不明もしくは完全にこちらの環境依存だったとしても、そのような形式での実装は出来そうだと感じました。

また、余談ですがUnityHub経由でインストールしたUnityのバージョンで、Visual Studioでcsファイルを開くとなぜかArbor名前空間が認識できないようです。
(UnityHubからインストールした3.12f1では認識できず)
今回の検証で使用した3.13f1および3.5f1はダウンロードしたインストーラーからインストール、その後UnityHubに登録したものですが、Visual StudioはArbor名前空間を問題なく認識できたようです。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/08 23:14
by caitsithware
最小構成ありがとうございます。
確認いたします。
YMMY wrote: 2020/05/08 18:15 また、余談ですがUnityHub経由でインストールしたUnityのバージョンで、Visual Studioでcsファイルを開くとなぜかArbor名前空間が認識できないようです。
(UnityHubからインストールした3.12f1では認識できず)
今回の検証で使用した3.13f1および3.5f1はダウンロードしたインストーラーからインストール、その後UnityHubに登録したものですが、Visual StudioはArbor名前空間を問題なく認識できたようです。
UnityHubおよびVisual StudioなどArbor外ツールは原則サポート外となります。
またUnity2019.3.12f1ではVisual Studioが動作しない不具合も上がっており、3.13f1で修正されたようです。
https://forum.unity.com/threads/2019-3- ... em.879724/

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/08 23:21
by caitsithware
YMMY wrote: 2020/05/08 18:15 Arbor_TestInput_CrossFade.unitypackage(https://www.dropbox.com/s/xkdjt092rzkpz ... ckage?dl=0)をインポート
こちらをダウンロードしてみましたが、私が添付したArborSupport_AnimationCrossFade.unitypackageと同一のものになっているようです。
ご確認お願いいたします。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/09 00:08
by caitsithware
ひとまずArbor_TestInput_CrossFade.unitypackageを準備していただくまでの間、怪しい点を書いていってみます。

押し続けている間、繰り返しAnimator.CrossFadeが呼ばれている場合

CrossFadeの仕様上、遷移途中で再度CrossFadeを呼び出したら同じステートを繰り返し実行し直すかもしれないので、正常にアニメーションされないのはある意味想定内の可能性があります。
AnimatorCrossFadeアクションはAnimator.CrossFade呼び出し直後に成功を返すようにしていますので、一旦ルートまで戻って改めて再実行されている点もその懸念の一つです。
そしてArborEditorウィンドウを表示すると、Unityが基本シングルスレッドで動作している関係で処理落ちし、TransitionDurationの時間分が過ぎ完了した扱いになるなどで「ArborEditorウィンドウを表示すると正常動作しているように見える」ということなのではないでしょうか。
TransitionDurationの値を大きくすると、ウィンドウ非表示時と同様の挙動になるようなのはその時間分が過ぎていないから、という想定もできます。
各ノードのDebugLogServiceを逆にDisableにしないとArborEditorウィンドウ非表示中も正常動作しているように見えてしまう、ということであれば、DebugLogによる処理落ちによりTransitionDurationの時間が完了した扱いになるから。と説明も出来そうです。

例えば、BTのAnimatorCrossFadeを行っているアクションの親にSequencerを挟み、子(CrossFadeの弟)にWaitを追加し、CrossFade実行後にTransitionDurationと同時間待つ処理を入れると正常に動作しそうです。

この点いかがでしょうか。
もしこれが正しいようでしたら不具合対応ではなく要望として受け取り、AnimatorCrossFadeでは遷移完了まで待つかどうかのフラグ(あるいは遷移先が同じであればCrossFadeを呼ばないような機能)を追加する感じになるかと思います。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/09 03:09
by YMMY
caitsithware wrote: 2020/05/08 23:21
YMMY wrote: 2020/05/08 18:15 Arbor_TestInput_CrossFade.unitypackage(https://www.dropbox.com/s/xkdjt092rzkpz ... ckage?dl=0)をインポート
こちらをダウンロードしてみましたが、私が添付したArborSupport_AnimationCrossFade.unitypackageと同一のものになっているようです。
ご確認お願いいたします。
ご確認ありがとうございます。
取り急ぎ正しいファイルをお送りします。
https://www.dropbox.com/s/3wu0d6w0ozt2y ... ckage?dl=0
こちらですが、アップするファイルを間違えていたようです。
大変失礼致しました。
他投稿の内容について確認致しますので少々お待ちください。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/09 03:34
by caitsithware
ファイルありがとうございます。

状況によりAnimatorの遷移途中に止まってしまう点、確認できました。
また、ArborSupport_AnimatorCrossFadeの方でもTransitionDurationを増やすことで同様に止まっているのも確認いたしました。

試しにAnimatorCrossFadeのコードを以下のように変更してみたところ、私が見た感じでは正常に動作するようになりましたので、
遷移処理中に再度CrossFadeを呼び出すと止まってしまうUnityの仕様(もしくはUnityの不具合:どうなったらUnity的に正しいかはこちらでは判断つかないため)と見て良さそうです。

Code: Select all

int layerIndex = AnimatorUtility.GetLayerIndex(animator, _LayerName);

bool crossFade = true;

if (_CheckIsInTransition && animator.IsInTransition(layerIndex))
{
	AnimatorStateInfo nextInfo = animator.GetNextAnimatorStateInfo(layerIndex);
	if( nextInfo.IsName(_StateName) )
	{
		crossFade = false;
	}
}

if(crossFade)
{
	animator.CrossFade(_StateName, _TransitionDuration, layerIndex, _NormalizedTime);
}
(_CheckIsInTransitionはフィールドで設定)
ひとまず、このコードについては今後の更新で追加する方向で検討いたします。

引き続き、何か他にも原因となりそうな点などありましたら情報提供していただけると助かります。

Re: Arborのエディターウィンドウの表示非表示で動作が異なる

Posted: 2020/05/09 05:06
by YMMY
お疲れ様です。
名前空間の不具合については存じておらず、またサポート外ということで失礼致しました。

さて、ご提示いただいたコードを適用し、AbortFlagsをEverythingにしたところ、エディターウィンドウ非表示かつDebugサービスOffでも期待通りの挙動になりました。
この状態であればTransitionDurationを大きくしても問題なくCrossFadeしてくれるようです。

BTは先日触り始めたばかりでまだ理解が浅く、想定されていない使用法だったようですね。
今回のケースでも毎フレーム判定と実行されるであろうとは思っていましたが、そのあたりを考慮してうまく動くのかなとなんとなく想像しておりました。
一応ですが、修正コードを適用しなくても各ノード毎にSubStateMachineを用意、そのFSM中でCrossFade及び該当キーでKeyUpTransition、遷移先でEndStateMachine Successさせることで同じような挙動にはなりました。
しかし、作業量を考えると修正後のほうが利便性が高いと感じます。
https://www.dropbox.com/s/soch3uxgl2d0x ... 7.png?dl=0
https://www.dropbox.com/s/ly2ksr1h7g9fx ... 4.png?dl=0

今後の更新での追加を検討して頂けるということで、様々なご対応いただき誠にありがとうございました。
また、それとは別にAnimatorCrossFade関連する要望が出てきましたので、別途投稿したいと思います。