以下の内容はhttps://www.hanachiru-blog.com/entry/2025/01/20/120000より取得しました。


【Unity】ファイルがReadonlyなPackageに含まれるかどうかをスクリプトから調べる方法

はじめに

Scene(.unity)を開こうとしたら以下のようなエラーが表示されることがあります。

readonlyなpacakgeを開こうとした時に表示されるエラー

Unity Package Manager(UPM)では複数の取得方法がありますが、取得方法によってはReadOnlyなPackageになります。

  • Registory : readonly
  • Build-in : readonly
  • Embedded : editable
  • Local : editable
  • Tarball(local) : readonly
  • Git : readonly

docs.unity3d.com

今回は特定のファイルがReadOnlyなPackageに含まれるファイルかどうかを調べる方法を紹介したいと思います。

docs.unity3d.com

やり方

PackageInfo.FindForAssetPathメソッドを利用することで、アセットを含むパッケージ情報を取得することができます。

public static PackageInfo FindForAssetPath(string assetPath)

Unity - Scripting API: PackageManager.PackageInfo.FindForAssetPath

ちなみにPath以外にもいくつかあるので、気になる方は公式ドキュメントを参照してください。

public static PackageInfo FindForAssembly(Compilation.Assembly assembly);
public static PackageInfo FindForPackageName(string name);
public static PackageInfo[] GetAllRegisteredPackages();

Unity - Scripting API: PackageInfo

PackageInfoを取得することができれば、PackageInfo.sourceを調べることでどの手法で取得したパッケージかを調べることができます。

PackageInfo packageInfo = PackageInfo.FindForAssetPath(path);
        
// PackageSource.Local
Debug.Log(packageInfo.source);
namespace UnityEditor.PackageManager
{
  /// <summary>
  ///   <para>Source of packages.</para>
  /// </summary>
  public enum PackageSource
  {
    /// <summary>
    ///   <para>The package source is unknown.</para>
    /// </summary>
    Unknown,
    /// <summary>
    ///   <para>The package is from a registry.</para>
    /// </summary>
    Registry,
    /// <summary>
    ///   <para>The package is built-in and part of Unity.</para>
    /// </summary>
    BuiltIn,
    /// <summary>
    ///   <para>The package is embedded in the Unity project.</para>
    /// </summary>
    Embedded,
    /// <summary>
    ///   <para>The package is referenced by a local path.</para>
    /// </summary>
    Local,
    /// <summary>
    ///   <para>The package is referenced directly by a Git URL.</para>
    /// </summary>
    Git,
    /// <summary>
    ///   <para>The package is referenced by a local path pointing to a GZip tarball file.</para>
    /// </summary>
    LocalTarball,
  }
}

Unity - Scripting API: PackageSource

コードサンプル

public class Sample
{
    [MenuItem("Sample/Check")]
    public static void Check()
    {
        foreach (var path in AssetDatabase.FindAssets("t:Scene").Select(AssetDatabase.GUIDToAssetPath))
        {
            Debug.Log(IsReadOnlyScene(path) ? $"ReadOnly Scene: {path}" : $"Editable Scene: {path}");
        }
    }
    
    private static bool IsReadOnlyScene(string path)
    {
        var packageInfo = PackageInfo.FindForAssetPath(path);

        // Assets以下はnullが返ってくる
        if (packageInfo == null)
        {
            return false;
        }

        if (packageInfo.source == PackageSource.Local)
        {
            return false;
        }

        if (packageInfo.source == PackageSource.Embedded)
        {
            return false;
        }

        return true;
    }
}



以上の内容はhttps://www.hanachiru-blog.com/entry/2025/01/20/120000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14