おすすめのAIプラグイン

1）おすすめのAIプラグイン
2）VideoPlayerはAndroidでビデオを再生したら黒画面になる
3）Renderer.GetPropertyBlockの問題
4）RectMask2Dの問題

---

## AI

**Q：新しいプロジェクトにはいくつかのAIがあり、それを実装するためにいくつかのプラグインを使用したいと思います。推奨するAIプラグインはありますか？私の知る限り、Behavior Designer、Playmaker、Boltなどがあります。いくつかの機能とパフォーマンスが良いものを推奨してくれませんか？**

>A1：NodeCanvasをお勧めします。
優れた点：
●3つの完全に切り替え可能なグラフィックモジュールから選択できます。
●期待されるすべてのプロフェッショナル機能を備えた、スタイリッシュで直感的なビジュアルノードエディタ。
（すべて元に戻す・やり直し、ズームイン・アウト（拡大・縮小）、ミニマップ、複数選択、コピー、コピー・貼り付け、JSONインポート・エクスポート、グループとコメントなど）
●再利用可能でエージェント中心のパラメトリック動作を作成するためのグラフィックス、GameObject、およびグローバル黒板変数。
●インスタンスまたは静的プロパティとフィールドを持つデータバインド変数。
●UNETのネットワーク同期変数を使用します。
（UNETは現在廃止されているため、新しいネットワーキングソリューションに置き換えられます）
●プレハブでオーバーライドできる変数。
●さまざまな変数データ型の自動変換。
●すぐに使用できるすべての変数タイプをサポートします。
●すべての数のエージェント（Agent）にわたる再利用可能な動作グラフ。
●3つのグラフィックモジュールすべての間のシームレスなサブグラフィックネスト。
（動作サブツリー、サブステートマシン、サブダイアログツリー）
●完全なサブグラフ変数のパラメーター化とスタンプ。
●モジュラーアクションと条件付きタスクの設計。
●条件付き応答動作ツリーの評価。
●条件付きおよびスタックベースのFSM遷移。
●カラフルで有益なランタイムビジュアルデバッグ。
●内蔵ドキュメントを検索、お気に入りに登録、および読み取るためのノード/タスクブラウザ。
●プロジェクトのニーズに応じてタイプ関連のメニューをカスタマイズするための優先タイプコンフィギュレータ。
●グラフィックを楽に閲覧するためのグラフィカルミニマップ。
●グラフィカルコンソール。マウスをクリックすることで、障害のあるノードを自動的に見つけることができます。
●グラフブラウザを使用して、グラフ内のノード、タスク、およびパラメータを検索します。
●欠落しているノード、タスク、およびリフレクション参照をバッチで再構築するためのグラフ再構築機能。
●設計目標をより素早く完了するためのリアルタイムのランタイム編集。
●既存のコードAPIを自動的に統合するために最適化されたリフレクションタスク。
●グラフィックスでデータを通信および転送するための内蔵イベントシステム。
●NodeCanvasフレームワークを拡張し、独自のアクション、条件、ノード、さらにはまったく新しいグラフィックモジュールを作成するための明確で十分に文書化されたAPI。
●あらゆる方法でインスペクターをカスタマイズするためのオブジェクトおよびプロパティペインタ。
●多数のサードパーティアセットと統合します。
●FlowCanvasflowScriptsとのシームレスな統合。
●ユーザーフレンドリーで軽量、設定は不要です。
●安定したパフォーマンス、初期化後のゼロ割り当て、非同期グラフの読み込み。
●すぐに使用できるすべてのプラットフォームをサポートします。
●すべてのC＃ソースコードが含まれています。
詳細なリンクは次のとおりです。
https://assetstore.unity.com/packages/tools/visual-scripting/nodecanvas-14914
Behaviacも優れていますが、残念ながらTXはあまり維持されていません。
https://github.com/Tencent/behaviac/

>A2：Baracudaをお勧めします。
https://github.com/Unity-Technologies/barracuda-release

>A3：ゲームAIフレームワークの選択についての投稿を：《What A.I technique is most suited to my game, FSM, BT, GOAP》
AI関連のブログを添付する：AI共有ステーション
http://www.aisharing.com/sitemap

>A4：Tencentオープンソースプロジェクト：behaviac
https://www.behaviac.com/language/en/%e9%a6%96%e9%a1%b5/
behaviacは、ゲームAIの開発フレームワークコンポーネントであり、ゲームプロトタイプの迅速な設計ツールです。すべてのプラットフォームをサポートし、クライアントとサーバーの両方に適しており、ゲームの迅速な反復型開発を支援します。
エディターはPC上で実行でき、操作は便利で直感的で信頼性が高く、リアルタイムおよびオフラインのデバッグをサポートします。エディターはxml、bson、その他の形式をエクスポートでき、C ++、C＃ソースコードもエクスポートできて効率が向上します。
ランタイムは、C ++とC＃の2つのバージョンを含むすべてのプラットフォームをサポートし、Unityをネイティブにサポートします。

---

## Video
**Q：この問題はプロジェクトAでのみ発生します。同じビデオとコードを新しいプロジェクトにコピーしてから、ビデオファイルをAddressables Groupに入れ、非圧縮に設定します。携帯電話でビルドすると、通常どおり再生できます。ただし、プロジェクトAでは、ビデオをAddressables Groupに入れ、非圧縮に設定しましたが、それでも再生できず、エラーが報告されます。**

AndroidVideoMedia::OpenExtractor could not translate archive:/CAB-abafc77eff58910e7bc5f69ce62a4ed7/CAB-abafc77eff58910e7bc5f69ce62a4ed7.resource to local file. Make sure file exists, is on disk (not in memory) and not compressed.

**皆さんはこのような問題が発生したことがありますか？**

>A：Addressables Groupで非圧縮と設定していますが、携帯電話でビデオを再生することはできません。したがって、どこでBundleを圧縮したのかと考え、やはりbuild.gradleで見つかりました。次のように、gradleのnoCompressに「.bundle」を追加する必要があります。
>```
>aaptOptions {
>noCompress ‘.unity3d’, ‘.ress’, ‘.resource’, ‘.obb’, ‘.meta’, >‘.wem’, ‘.bnk’, ‘.txt’, ‘.xml’,’.bundle’ //ADD_NoCompress_TAG
>}
>```
---

## Rendering
Q：コード印刷ログから、GetPropertyBlockは最初に取得したのは何でしょうか？何の用もないようです：
```
public MeshRenderer mr;
    [Button]
    void DOTest()
    {
        MaterialPropertyBlock block = new MaterialPropertyBlock();
        mr.GetPropertyBlock(block);
        Debug.Log(block.isEmpty);      //trueをプリントする
        Color baseColor = block.GetColor("_Color");
        Debug.Log(baseColor.ToString());      //オリジナルは白で (0,0,0,0)をプリントしたら何も取得されていない

        block.SetColor("_Color", Color.red);    //色を設定する
        mr.SetPropertyBlock(block);

        mr.GetPropertyBlock(block);        //再取得する
        Debug.Log(block.isEmpty);  // falseをプリントする
        baseColor = block.GetColor("_Color");
        Debug.Log(baseColor.ToString());    //(1,0,0,1)をプリントする

    }
```

**もともと、Renderer.GetPropertyBlock（block）を介してRendererのマテリアルプロパティがBlockに格納されたと考え、その後内部の値を変更すると思っていましたが、そうではありません。たとえば、Alphaだけを変更したいと思いますが、元の色を取得できません：**

```
MaterialPropertyBlock block = new MaterialPropertyBlock(); 
meshRenderer.GetPropertyBlock(block); 
Color baseColor = block.GetColor("_Color"); 
block.SetColor("_Color", new Color(baseColor.r, baseColor.g, baseColor.b, alpha)); 
meshRenderer.SetPropertyBlock(block);
```

>A1：まず、Propertyにプロパティを追加しなかったため、Emptyであるはずです。つまり、プロパティシートは空のリストです。次に、Setcolorを使用して、プロパティフィールドをプロパティシートに追加してから、リストは空ではなくなります。プリントされたのは白である理由については、これがデフォルト値だと思います。つまり、存在しないプロパティにアクセスしてnullが返されないようにすると、デフォルト値が与えられます（これは推測です）。
元の色を取得するには、メティリアルから直接取得します。
Var mat = renderer.material; // renderer.sharedMaterial; Color c = mat.GetColor( “_ Color”); Debug.Log(c.ToString());

>A2：Renderer.HasPropertyBlock（）を使用して、RendererがすでにPropertyBlockを持っているかどうかを判断できます。通常、SetPropertyBlockを呼び出す前に、GetPropertyBlockは「null」の結果を取得します。特殊なケースがあります。アニメーションでシェーダーを制御するために使用された後（シェーダーの色を制御するなど）、GetPropertyBlockを使用してMaterialPropertyBlockを取得すると、得られる結果は「空」ではありません。理論的には、アニメーションコントロールシェーダーでは、SetPropertyBlockで色の変更を実現したのです。

---

## UGUI

**Q：RectMask2dを使用してScrollviewノードの下にいくつかのアイコンを動的に作成しましたが、ページを開いたときにアイコンが正常に表示されず、スワイプした後にのみ表示されることがわかりました。アイコンオブジェクトが表示されていないときに作成されていることを確認しました。対応するInspectorウィンドウにはDefault UI Shaderというコンポーネンがなくなります。理由を知っている人はいますか？**

**Debugにより、アイコンオブジェクトをRectMask2dのクリッピングHashsetに通常どおり追加できることがわかりました。Frame Debugでアイコンが表示および表示されない場合、Batchが1つ少なくなります。**

>A：動的作成が完了した後、Canvas.ForceUpdateCanvasesを呼び出すことを試して下さい。このインターフェイスは、すべてのUI要素を時間内に更新するためのものです。
https://docs.unity3d.com/ScriptReference/Canvas.ForceUpdateCanvases.html

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com