Unity Tips

初めに

貯めている覚書の書き写しです。古い物もあります。

Terrainの調査

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;
    }
}

製作中のゲームとは要件が合わないので使うのをやめた。

DIについて

https://zenn.dev/qemel/articles/ad6cf484d8280a

UI Toolkit

#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);
        }
    }
.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に移行

※ 古い記事 https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/InstallURPIntoAProject.html

メモリーリーク

【Unity】Unityでメモリリーク発生?原因と調査方法について https://logicalbeat.jp/blog/15426/

スペキュラーマップ、法線マップ(ノーマルマップ)の自動生成

https://cpetry.github.io/NormalMap-Online/

紹介記事 https://kan-kikuchi.hatenablog.com/entry/NormalMap_Online

→無いよりはあった方が良いが、思ったようにはいかなかった

スペキュラーマップは色が変わるので、とりあえず無しにたい

プロジェクト生成時にMobileは選ばない

入るのは以下

必要なものは 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

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)’

https://issuetracker.unity.com/issues/6324/assert-error-is-thrown-when-the-editor-language-is-set-to-one-of-the-experimental-ones

VContainer

https://vcontainer.hadashikick.jp/ja/

https://zenn.dev/qemel/articles/14d247b9945527

モバイル画面サイズ

日本の場合 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 ()

https://discussions.unity.com/t/built-in-data-does-not-have-any-associated-addressableassetgroupschemas/948476

Addressable が2.0に上がった際に構成が変わった。 関連フォルダを再作成する必要があるとの事

作り直して元ファイルをコピーしても同じエラーが出た。 なので一から再設定

全部やり直しても同じエラー 後はLocalization関連ファイルは引き継いだので、それらも作り直すかどうか

UnsafeAtomicCounter32

https://docs.unity3d.com/Packages/com.unity.collections@1.4/api/Unity.Collections.LowLevel.Unsafe.UnsafeAtomicCounter32.html

単純なカウント処理 書き込みの競合に対応しているので並列ジョブでも使える

ZLinq

https://qiita.com/luckin/items/9d67551f38dbd73411f9

NaughtyAttributes

インスペクタを使いやすくする https://github.com/dbrizov/NaughtyAttributes

Editor表現だけならライセンス表記は不要?MITなのでとりあえず書けばよいとは思うが。

選択マーカー実装のために調べたもの

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

  1. IJobEntity を付けたstructを作る。
  2. IJobEntity.Execute(ref ???? _)を付ける
  3. 1.のジョブを起動すると、???? を持つ全ての対象に一回実行される。

Execute(ref LocalTransform transform) とすると全てのオブジェクトになる。

IJobEntityBatch

NativeReference

https://docs.unity3d.com/Packages/com.unity.collections@1.4/api/Unity.Collections.NativeReference-1.html

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選択

ビルド時エラー5-1 ビルド時エラー5-2

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


top

その他の投稿

20260502-01 ローカルLLMを構築
20260425-01 Unity UI Toolkit カスタムコントロールサンプル
20260103-01 Unity Entities Tips
20251231-01 Unity UI Toolkit カスタムコントロールサンプル
20250913-01 Unity アプリで Android 16KB ページサイズ確認
20250912-01 Unity 6 で Editor がちらつく問題
20250906-01 Win10サポート終了 ChromeOS Flex を入れてみてつまづいた所
20250812-02 Unity UI Toolkit でのタップ操作検出
20250812-01 Unity UI Toolkit でマップ画面 with RenderTexture
20250811-01 Unity UI Toolkit での座標変換