Unity Tips
- Unity Tips
- 初めに
- Terrainの調査
- NavMeshの調査
- DIについて
- UI Toolkit
- URP
- メモリーリーク
- スペキュラーマップ、法線マップ(ノーマルマップ)の自動生成
- プロジェクト生成時にMobileは選ばない
- MonoBehaviour.InvokeRepeating
- 波などの表現。モバイル対応
- ビルド時エラー1
- Open UPM
- ビルド時エラー2
- VContainer
- モバイル画面サイズ
- ビルド時エラー3
- ビルド時エラー4
- UnsafeAtomicCounter32
- ZLinq
- NaughtyAttributes
- 選択マーカー実装のために調べたもの
- Low-level 2D Physics
- ECS
- モバイル向けパフォーマンス最適化
- RBF補間
- shader サンプルコード集
- ビルド時エラー5
- AddressableAssets.AssetReferenceT
- MacなしでUnityのiOSアプリをリリースするまで
- Google Play Games Plugin for Unity
初めに
貯めている覚書の書き写しです。古い物もあります。
Terrainの調査
- 作った地形に NavMesh は問題なさそう
- 木を動的に削除できるかどうか
- https://ameblo.jp/hisu58/entry-12236823576.html
- 削除できそう
- https://docs.unity3d.com/ScriptReference/TerrainData-treeInstances.html
- SetTreeInstances を使うべきらしい
- https://qiita.com/iroha71/items/9607f939eba759f569f7
- 入れ替える場合。切り株を残すとかならこっちかも
- https://ameblo.jp/hisu58/entry-12236823576.html
- Terrain 関連のWind Zone とは、風でなびく表現で使うそうな
- 自作ツリー
NavMeshの調査
- ナビゲーションシステム
- https://docs.unity3d.com/Packages/com.unity.ai.navigation@1.1/manual/index.html
- https://docs.unity3d.com/ScriptReference/AI.NavMesh.html
- Unity.AI.Navigation.NavMeshSurface と Unity.AI.NavMeshAgent が名前空間が異なり、ドキュメントも分かれている事に注意する。
- 動的に変化する障害物
- https://docs.unity3d.com/Packages/com.unity.ai.navigation@1.1/manual/AboutObstacles.html
- 動くものと静止するもののそれぞれを設定で調整できる
- 動いたり静止したりする場合も、静止してから何秒でNavMeshに穴をあける、という事が出来るそうだ
- OffMeshLink
- 細い川をジャンプで飛び越えるなど
- エリアタイプ
- 飛行のみ可能とするとか
- OffMeshLinkの機能もエリアタイプ設定が出来る
- 動的なエリアタイプ変更
- https://discussions.unity.com/t/area-mask-nav-mesh-agent-changing-by-code/783157
- これはエージェント側の動的変更の話
- https://docs.unity3d.com/Packages/com.unity.ai.navigation@1.1/manual/NavMeshModifier.html
- 子オブジェクトを細かく分割して、それぞれにNavMeshModifierを付ける。後はOverrideAreaにチェックを入れてエリアタイプを変える。
- Mode にある remove object を使うと、そのエリアを移動範囲外に出来る。NavMeshObstacleによる除外と使い分ける。
- NavMeshObstacleは移動を想定したものがよさそう。
- NavMeshModifier はオブジェクトに対となる。対象オブジェクトは表示状態にする必要があるようだ。範囲だけ拡張も出来なかった
- Mode にある remove object を使うと、そのエリアを移動範囲外に出来る。NavMeshObstacleによる除外と使い分ける。
- 子オブジェクトを細かく分割して、それぞれにNavMeshModifierを付ける。後はOverrideAreaにチェックを入れてエリアタイプを変える。
- https://docs.unity3d.com/Packages/com.unity.ai.navigation@1.1/manual/NavMeshModifierVolume.html
- 指定した範囲のエリアタイプを変えるのにNavMeshModifierVolumeを使う。
- 対象サーフェイスの子にする必要があった
- サーフェイスのCollect Obfects を子にしているからと思われる。
- オブジェクトの周囲に設定する場合も使えそう
- 矩形以外できないので、円形にしたい場合はModifierの方か
- シリンダーを平たくしたが、そこまで丸くない
- 見た目は円でも範囲は矩形にする
- 対象サーフェイスの子にする必要があった
- 指定した範囲のエリアタイプを変えるのにNavMeshModifierVolumeを使う。
- https://discussions.unity.com/t/area-mask-nav-mesh-agent-changing-by-code/783157
- 移動可能な場所を実行毎に生成する方法
- 全面を移動可能にしておいて、障害物を置く
- 含まれるオブジェクトに対して倍率で移動不可範囲が決まるが、オブジェクトを含まない場合は1x1x1のBoxがあるような状態になる。これを伸ばせば見た目なしの移動不可が作れる
- 動的生成について確認できた
- プレファブはNavMeshObstacleのみ持つ
- それをランダムに配置しただけで
- 動的な段差と階層
- 重なりがある状態でベイクすると、下の部分は無くなった。階層は別サーフェイスにしてOffMeshLinkでつなぐことになる
- 高さを近づけると、サーフェイス自体が結合された
- 直線だと加速する場合を考慮できるかどうか
- NavAgentに加速度の設定がある。これを動的に変える。
- NavMesh
- 移動不可地点による移動可能範囲の除外幅の調整。現状1mはマップタイルと同じなので通れない位置が出てきている
- NavMeshSurfaceやObstructの設定ではなく、エージェントの半径で決まるようだ。とりあえず指定可能な最低値の0.05にすれば期待通りになったが、しっくりこない
- 地形は同じだが大型キャラだと通れない、などの表現をするためとみられる
- 障害物側を小さくする必要が出てくる
- 残骸なら残骸を撤去する事で通れる。問題は海や川で一マスの道が通れなくなる点
- →0.4に設定する事にした。
- ECSとの互換性
- 2026/08/11 現在で、互換性は無い。正式対応するまではmanagedで処理
- https://tsubakit1.hateblo.jp/entry/2019/11/16/115053
- 移動範囲制限について
- https://tsubakit1.hateblo.jp/entry/2019/02/03/031646
- 実験的実装
- ルート検索
- JobSystemを使うコードもあるが、別スレッドにしている事とフレームごとに分割処理する以上の意味が無さそう
- 従来のNaviMeshとNaviMeshAgentをそのまま使い、位置と方向を同期するだけにする。
- 移動速度はNaviMeshAgentに設定。高い位置への移動なども同じ
- https://docs.unity3d.com/6000.0/Documentation/ScriptReference/AI.NavMesh.CalculatePath.html
- パスを計算して返す。
- 到達しない場合も検出できる。
- エージェントは作らずに、これだけを使うのもいいかもしれない。
- 任意地点付近の歩ける地点
- NavMesh.CalculatePath
- 計算にNavMeshAgent は不要
- 非同期での取得は出来ない
- NavMeshAgent
- コード上でパスを利用する場合、現在位置は transform.position ではなく、NavMeshAgent.Warp で設定する。
public bool StartFindPath(Vector3 from, Vector3 to)
{
navMeshAgent.ResetPath();
navMeshAgent.Warp(from);
return navMeshAgent.SetDestination(to);
}
その後 NavMeshAgent.pathPending がfalseになれば計算終了
結果は NavMeshAgent.path.corners
public bool TryGetFindedPath(out Vector3[] path)
{
if (navMeshAgent.pathPending)
{
path = null;
return false;
}
path = navMeshAgent.path.corners;
return true;
}
コード全体
public class PathFinderAgent : MonoBehaviour
{
public int ID;
NavMeshAgent navMeshAgent;
public void Setup()
{
navMeshAgent = GetComponent<NavMeshAgent>();
navMeshAgent.updatePosition = false;
navMeshAgent.updateRotation = false;
}
public bool StartFindPath(Vector3 from, Vector3 to)
{
navMeshAgent.ResetPath();
navMeshAgent.Warp(from);
return navMeshAgent.SetDestination(to);
}
public void Stop()
{
navMeshAgent.ResetPath();
navMeshAgent.isStopped = true;
}
public bool TryGetFindedPath(out Vector3[] path)
{
if (navMeshAgent.pathPending)
{
path = null;
return false;
}
path = navMeshAgent.path.corners;
return true;
}
}
NavMeshの不具合?
製作中のゲームとは要件が合わないので使うのをやめた。
- 保存からの復帰時に運搬ロボットが動かなくなる
- 改めて再開すると、アイテムをつかんで移動開始まではしたが、倉庫とは関係ない位置で停止した
- エディタをよく見ると、NavMeshがおかしく見える
- 静的にチェックを入れたが改善せず
- カプセルからボックスにしたが変わらず

- くりぬくをOFFにすると、正しくパスを求めた
- ちゃんと海は避けている。違いは何なのか

- 同じくOFFで正常という話があった。
- Copilotによると、立ち止まったらパスの再計算をしたら、とのこと
- やって見た所、ちょっとずつ回転をした後に停止
- 障害物に近くなくても止まる場合もあった

- マッププレートを動的ではなく初めから置いてBakeした場合
- 変わらず。サーフェイスの作られ方も同じように見える。なぜかObstacleが表示される違いがある

DIについて
https://zenn.dev/qemel/articles/ad6cf484d8280a
- Unityでのインスペクタで設定するのもDI
- インスペクタで設定しない場合はFindXXで検索して参照
- つまりインスペクタでの設定とFindを使っているところがDIに置き換えられる可能性
- 手動でのDIは初期化順を気にする場合がある
- KoKoCoinでもドキュメントインスタンスの初期化タイミングの問題があった
- https://github.com/gustavopsantos/Reflex
- UniTask連携は無いだろうから見送り
- その他候補
UI Toolkit
- カスタムコントロール
- カスタムコントロールの開放処理
- https://discussions.unity.com/t/event-call-when-a-visualelement-is-removed/748534/7
RegisterCallback<AttachToPanelEvent>(OnAttachToPanel);RegisterCallback<DetachFromPanelEvent>(OnDetachFromPanel);- スタイルについてはUIビルダーで表示されなくなるので開放しない
- https://discussions.unity.com/t/event-call-when-a-visualelement-is-removed/748534/7
- 文字の自動サイズ調整が無い
- データバインディング時のコンバート
#if UNITY_EDITOR
[UnityEditor.InitializeOnLoadMethod]
#else
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
#endif
public static void RegisterConverters()
{
var group = new ConverterGroup("bool To DisplayStyle");
group.AddConverter((ref bool v) =>
new StyleEnum<DisplayStyle>(v ? DisplayStyle.Flex : DisplayStyle.None));
ConverterGroups.RegisterConverterGroup(group);
var group2 = new ConverterGroup("bool To Visibility");
group2.AddConverter((ref bool v) =>
new StyleEnum<Visibility>(v ? Visibility.Visible : Visibility.Hidden ));
ConverterGroups.RegisterConverterGroup(group2);
}
}
- スタイル
- .unity-text-element や .unity-button は消せない
- 相殺する設定をつける
- 複数のクラスを付けた場合の適用順
- 要素では順番を変更できない。
- クラスが定義されているUSSファイルが同じなら、その順番
- 複数のUSSファイルがある場合は、USSファイルの順番
- デフォルトのスタイルは優先度が最低
- .unity-text-element や .unity-button は消せない
- マテリアル Universal Render Pipeline/2D/Sprite-Unlit-Default
- Lit は現実にあるもの。光源の影響を受ける。現実に近い見た目
- Unlit は現実に無い物。光源の影響を受けない。UIなどに使う
- https://www.zoboui.com/
- UI Toolkit スタイル
- bootstrap みたいなもの?であり、適用するだけでいい感じに変わるとかはない
- とりあえず色指定していた個所は全部置き換えたい所
- メジャーバージョンに達しておらず、かつ二年更新が無い
- 幅高さの決定が内側優先である為、例えば二分割になって欲しいのに内容によって変わってしまう。次のussを作っておいて、必要なところにクラスをセットする。
.force-split {
flex-grow: 1;
flex-basis: 0;
min-width: 0;
}
<ui:VisualElement name="body">
<ui:VisualElement name="body-left" class="force-split">
</ui:VisualElement>
<ui:VisualElement name="body-right" class="force-split">
</ui:VisualElement>
</ui:VisualElement>
URP
セットアップ https://note.com/info_/n/n735ee184816d
- URPの基本の設定があるので、URPありテンプレートでプロジェクト作成をした場合も確認
- ポストエフェクトの設定も説明されている。
既存のプロジェクトをURPに移行
- やってみたが新規で作り直した方が良い
- タップ時に出していたエフェクトが出なくなるなど、影響もある
メモリーリーク
【Unity】Unityでメモリリーク発生?原因と調査方法について https://logicalbeat.jp/blog/15426/
スペキュラーマップ、法線マップ(ノーマルマップ)の自動生成
https://cpetry.github.io/NormalMap-Online/
紹介記事 https://kan-kikuchi.hatenablog.com/entry/NormalMap_Online
→無いよりはあった方が良いが、思ったようにはいかなかった
スペキュラーマップは色が変わるので、とりあえず無しにたい
プロジェクト生成時にMobileは選ばない
入るのは以下
- Android Logcat
- Mobile Notify
- Adaptive Performance
必要なものは Android Logcat だけで、あと二つは不要 さらに Adaptive Performance はビルド後に警告がでてかつ解消できない。
結果的に通常のプロジェクトにして Android Logcat を入れれば同じ
ただしプロジェクト設定などが最適化されている可能性はある
MonoBehaviour.InvokeRepeating
指定したタイミングで関数が呼び出される。
タイマーやUniRxなどでも出来るが、標準機能であることもメリット
Invoke もあるそうで、一回だけの実行
CancelInvokeで取り消し。全消しは引数無し
波などの表現。モバイル対応
https://github.com/MirzaBeig/Wave-Simulator
ビルド時エラー1
Cannot read BuildLayout header, BuildLayout has not open for a file
https://marumaro7.hatenablog.com/entry/CannotreadBuildLayoutheader
- Addressable Build Report パネルを閉じる
- Unity を閉じる
- 以下を削除
- \projectroot\Library\AddressablesConfig.dat
- \projectroot\Library\com.unity.addressables フォルダ
- クリーンビルド
Open UPM
Google Mobile Ads for Unity がOpenUPM経由でインストールできるようになっていた。
しかしエラーが出る https://github.com/googleads/googleads-mobile-unity/issues/3350
- 閉鎖になっているが未解決
nuget for unity もOpenUPMで入れられる
ビルド時エラー2
Assertion failed on expression: ‘!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) == 0)’
VContainer
https://vcontainer.hadashikick.jp/ja/
https://zenn.dev/qemel/articles/14d247b9945527
- DIは順番が自動的に処理される。
- 任意の関数にInjectを付ける。公式には Construct という名前にするが、Initialize とか Inject でもよさそう
- EntryPoint は実質GameManager。これまで無駄にMonoBehaviour派生していたので若干軽量
- これとは別にLifetimeScopeを作る。
- GameObject も LifetimeScope でRegisterComponetする必要があるが、インスペクタのAutoInjectGameObjectsに入れるだけでいい
- ただし他を参照のみする場合だけ。他から参照されるなら登録
- インスペクタで設定した場合に、どこと接続したか探しづらいという問題があった。この点はDIならコード内検索が出来るようになり、ある程度軽減
- ECS対応
- https://vcontainer.hadashikick.jp/integrations/ecs
- 初めて見た時から大分経つが正式版にならない。
- https://vcontainer.hadashikick.jp/integrations/ecs
- https://vcontainer.hadashikick.jp/ja/optimization/source-generator
- MonoBehaviour へのフィールドでのInjectで警告
- public にする
- [Serializable]を付ける
- Dictionary がそもそもダメ
- MonoBehaviour へのフィールドでのInjectで警告
- 実行時にクラスが見つからないエラー
- インスペクタで設定する Auto Inject Game Objects を見直す
- ここで設定可能なものは他クラスのインジェクトで指定されていない物
- 良く分からなかったら、使わないようにして全部 LifetimeScope で RegisterComponent で設定
- EntryPoint をインジェクションする場合、インターフェイスを挟む
- インスペクタで設定する Auto Inject Game Objects を見直す
- LifetimeScope.Configure にasyncを付けて、内部で非同期読み込みをするとうまくいかなかった
- Awake は async を付けられたので、必要な処理を Awake で行って、Configure は async 無しにする
- DI する場合、他からInjectされないとインスタンス化されない
- つまりイベントのコンバートだけをするようなクラスはインスタンス化されないので、結果コンバートも実行されない。
- https://discussions.unity.com/t/vcontainer-does-not-create-an-instance-of-my-service/940846/10
- IInitializable を持っているなら
.As<IInitializable>()を付ける。 - 独自のインターフェイスを作って、自分でResolveをする事で強制でインスタンス化
- IInitializable を持っているなら
モバイル画面サイズ
日本の場合 https://gs.statcounter.com/screen-resolution-stats/mobile/japan
ビルド時エラー3
Library\Bee\artifacts\Android\Manifest\IntermediateLauncherManifestDiag.txt: Unity is trying to add element uses-permission#android.permission.CAMERA but it is already declared by the user in Assets/Plugins/Android\AndroidManifest.xml.
UnityEditor.EditorApplication:Internal_CallDelayFunctions ()
QRコード関連で WebCamTexture を使ったが、Unityが自動的にCAMERA権限を与えるのと、AndroidManifest.xmlの指定が競合
AndroidManifest.xml から削除するのが本来だがほっとく
ビルド時エラー4
ProfileValueReference: GetValue called with empty id.
UnityEditor.AddressableAssets.GUI.AddressableAssetsSettingsGroupEditor:BuildAddressablesWithResult (UnityEditor.AddressableAssets.GUI.AddressableAssetsSettingsGroupEditor/BuildMenuContext)
AddressablesPlayerBuildProcessor:DefaultBuild (UnityEditor.AddressableAssets.Settings.AddressableAssetSettings) (at ./Library/PackageCache/com.unity.addressables@0960051b8c8a/Editor/Build/AddressablesPlayerBuildProcessor.cs:143)
AddressablesPlayerBuildProcessor:PrepareForPlayerbuild (UnityEditor.AddressableAssets.Settings.AddressableAssetSettings,UnityEditor.Build.BuildPlayerContext,bool) (at ./Library/PackageCache/com.unity.addressables@0960051b8c8a/Editor/Build/AddressablesPlayerBuildProcessor.cs:100)
AddressablesPlayerBuildProcessor:PrepareForBuild (UnityEditor.Build.BuildPlayerContext) (at ./Library/PackageCache/com.unity.addressables@0960051b8c8a/Editor/Build/AddressablesPlayerBuildProcessor.cs:79)
UnityEditor.EditorApplication:Internal_CallDelayFunctions ()
Addressable が2.0に上がった際に構成が変わった。 関連フォルダを再作成する必要があるとの事
作り直して元ファイルをコピーしても同じエラーが出た。 なので一から再設定
全部やり直しても同じエラー 後はLocalization関連ファイルは引き継いだので、それらも作り直すかどうか
UnsafeAtomicCounter32
単純なカウント処理 書き込みの競合に対応しているので並列ジョブでも使える
ZLinq
https://qiita.com/luckin/items/9d67551f38dbd73411f9
- 最大のパフォーマンスを出すなら色々設定が必要らしい
- ちゃんとAsValueEnumerableを使うなども必要
- コアが.NETに置き換わってからとかが良いかも
NaughtyAttributes
インスペクタを使いやすくする https://github.com/dbrizov/NaughtyAttributes
Editor表現だけならライセンス表記は不要?MITなのでとりあえず書けばよいとは思うが。
選択マーカー実装のために調べたもの
- UI Toolkitとしての実装
- 直接配置
- UIよりは背面に来て欲しい
- パーティクルによる実装
- 自力実装
- https://nn-hokuson.hatenablog.com/entry/2017/03/24/211211
- カメラの方向を常に見るようにして、平面にアイコンを書く
- 負荷はどうなるのか
- Entityでも出来るかどうか
- オブジェクトの上に円錐のオブジェクトを出す
- 子にすれば移動処理を書かなくてよくなる
- Entity側で処理が終わる
- 鳥瞰視点だと分かりづらい可能性
- 多数の描画になる。プールライブラリの確認
- UnityEngine.Pool.ObjectPool
- 個別の無効化がしづらい?
- https://github.com/AnnulusGames/uPools/blob/main/README_JA.md
- UnityEngine.Pool.ObjectPool
- https://nn-hokuson.hatenablog.com/entry/2017/03/24/211211
- ビルボードによる実装
- https://docs.unity3d.com/ja/2023.2/Manual/class-BillboardRenderer.html
- レンダラーによる実装だが、これは遠方オブジェクトの負荷軽減が目的
- レンダーグラフを使った方法を採用
- https://docs.unity3d.com/ja/2023.2/Manual/class-BillboardRenderer.html
Low-level 2D Physics
https://qiita.com/tamutamuta/items/c860fe735f6b2bdddbbb
合致するゲームのアイデアがあれば使いたい
ECS
JobSystem IJobEntity
https://docs.unity3d.com/Packages/com.unity.entities@1.2/manual/iterating-data-ijobentity.html
- IJobEntity を付けたstructを作る。
- IJobEntity.Execute(ref ???? _)を付ける
- 1.のジョブを起動すると、???? を持つ全ての対象に一回実行される。
Execute(ref LocalTransform transform) とすると全てのオブジェクトになる。
- IJobEntity への属性 WithAll などで対象を絞り込める。
- ジョブ起動時にパラメータで絞り込む条件を与える。
IJobEntityBatch
- 実行すると予約されて、OnUpdateなどのタイミングで一回だけ行う。
- つまり実行回数に応じて結果が増えない場合がある。
- 関連として IJobEntityBatchWithIndex があり、対象の順番を使いたい場合の実装で効率が上がる。
NativeReference
- スレッドセーフ
- 配列ではない
- NativeArray と同様にDisposeが必要
- Systemで続く処理が必要になってくる。
- 処理競合は起きる
Entity不具合?
プレファブなどの親子関係を持つEntityからInstantiateで作り、それらをParentを追加して親子関係にした場合、位置が追随しなかったりSetEnabledが反映されない場合がある。 次のようにしてLinkedEntityGroupをコピーすることで反映されるようになった。
var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
if (entityManager.HasBuffer<LinkedEntityGroup>(entity))
{
var parentLegs = entityManager.GetBuffer<LinkedEntityGroup>(parentEntity);
using var legs = entityManager.GetBuffer<LinkedEntityGroup>(entity).ToNativeArray(Allocator.Temp);
foreach (var leg in legs)
{
parentLegs.Add(leg);
}
}
プレファブの子をFBX一つのみにした場合は問題なさそう。
シーンの切り替え
Entity を使っている場合でシーンを切り替えをするとサブシーンが残る。
これは Unity.Entities.World.DisposeAllWorlds(); を呼ぶ事で破棄できる。
VContainer を使っている場合は、DI したオブジェクトの破棄後に行うために、LifetimeScope の OnDestroy で行う
public class Land1LifetimeScope : LifetimeScope
{
protected override void OnDestroy()
{
base.OnDestroy();
// サブシーンの破棄
// DIしたコンポーネントが終了してから実行するにはここしかなかった
Unity.Entities.World.DisposeAllWorlds();
}
}
モバイル向けパフォーマンス最適化
https://zenn.dev/kti/articles/d3cd903b1a3766
RBF補間
移動パス取得関連
https://zenn.dev/dsgarage/articles/529a2685eab09d
shader サンプルコード集
https://zenn.dev/quickbrush/articles/6bb02d6c25e6d9
ビルド時エラー5
Assembly 'Assets/Packages/CsvCSharp.1.0.3/analyzers/dotnet/cs/Csv.SourceGenerator.dll' will not be loaded due to errors:
Unable to resolve reference 'Microsoft.CodeAnalysis'. Is the assembly missing or incompatible with the current platform?
Reference validation can be disabled in the Plugin Inspector.
エラーダブルクリックで対象DLL選択

Validate Refereces をOFF
任意のプラットフォームをOFF。個別のプラットフォームがすべてONになるので全てOFF
適用するボタン
AddressableAssets.AssetReferenceT
UnityEngine.AddressableAssets.AssetReferenceT に与えられるのは、Unity既定の型のみ ビルドは通るが、インスペクタの割り当てで以下のエラーになる
Invalid asset for AssetReference path
AssetReference NullReferenceException
この場合は AssetReferenceT を使わずに普通に型のみで設定
MacなしでUnityのiOSアプリをリリースするまで
https://zenn.dev/dragonikko/articles/387c32f9c686cb
Google Play Games Plugin for Unity
https://github.com/playgameservices/play-games-plugin-for-unity
ダウンロードは以下
https://github.com/playgameservices/play-games-plugin-for-unity/tree/master/current-build
パッケージに前のバージョンが含まれる問題があるので、取り込み時に外すようにする
https://github.com/playgameservices/play-games-plugin-for-unity/issues/3367
