サーチ…


構文

  • AssetPostprocessor.OnPreprocessTexture()

備考

String.Contains()を使用して、指定された文字列をアセット・パスに持つアセットのみを処理します。

if (assetPath.Contains("ProcessThisFolder"))
{
    // Process asset
}

テクスチャポストプロセッサ

Assetsフォルダの任意の場所にTexturePostProcessor.csファイルを作成します。

using UnityEngine;
using UnityEditor;

public class TexturePostProcessor : AssetPostprocessor
{
    void OnPostprocessTexture(Texture2D texture)
    {
        TextureImporter importer = assetImporter as TextureImporter;
        importer.anisoLevel = 1;
        importer.filterMode = FilterMode.Bilinear;
        importer.mipmapEnabled = true;
        importer.npotScale = TextureImporterNPOTScale.ToLarger;
        importer.textureType = TextureImporterType.Advanced;
    }
}

今、Unityがテクスチャをインポートするたびに、以下のパラメータがあります: ここに画像の説明を入力

ポストプロセッサーを使用する場合、エディターでのインポート設定を操作してテクスチャーパラメーターを変更することはできません。
[ 適用 ]ボタンを押すとテクスチャが再インポートされ、ポストプロセッサコードが再び実行されます。

基本的な輸入業者

インポータを作成するカスタムファイルがあるとします。それは.xlsファイルなんでもかまいません。この場合はJSONファイルを使用しますが、これは簡単ですが、カスタム拡張を選択して、どのファイルが私たちのものであるかを簡単に判別できるようにします。

JSONファイルの形式が

{
  "someValue": 123,
  "someOtherValue": 456.297,
  "someBoolValue": true,
  "someStringValue": "this is a string",
}

Example.testとして資産ののどこかに保存しましょう。

次に、データ用のカスタムクラスを持つMonoBehaviourを作成します。カスタムクラスは、JSONの逆シリアル化を容易にするためのものです。カスタムクラスを使用する必要はありませんが、この例は短くなります。これをTestData.cs保存しTestData.cs

using UnityEngine;
using System.Collections;

public class TestData : MonoBehaviour {

    [System.Serializable]
    public class Data {
        public int someValue = 0;
        public float someOtherValue = 0.0f;
        public bool someBoolValue = false;
        public string someStringValue = "";
    }

    public Data data = new Data();
}

そのスクリプトをGameObjectに手動で追加する場合は、

テストデータインスペクタ

次に、 Assets下にEditorフォルダを作成します。私はどんなレベルでもよい。エディターフォルダー内にTestDataAssetPostprocessor.csファイルを作成し、これを配置します。

using UnityEditor;
using UnityEngine;
using System.Collections;

public class TestDataAssetPostprocessor : AssetPostprocessor
{
    const string s_extension = ".test";

    // NOTE: Paths start with "Assets/"
    static bool IsFileWeCareAbout(string path)
    {
        return System.IO.Path.GetExtension(path).Equals(
           s_extension, 
           System.StringComparison.Ordinal);
    }

    static void HandleAddedOrChangedFile(string path)
    {
        string text = System.IO.File.ReadAllText(path);
        // should we check for error if the file can't be parsed?
        TestData.Data newData = JsonUtility.FromJson<TestData.Data>(text);

        string prefabPath = path + ".prefab";
        // Get the existing prefab 
        GameObject existingPrefab = 
            AssetDatabase.LoadAssetAtPath(prefabPath, typeof(Object)) as GameObject;
        if (!existingPrefab)
        {
            // If no prefab exists make one
            GameObject newGameObject = new GameObject();
            newGameObject.AddComponent<TestData>();
            PrefabUtility.CreatePrefab(prefabPath, 
                                       newGameObject,
                                       ReplacePrefabOptions.Default);
            GameObject.DestroyImmediate(newGameObject);
            existingPrefab = 
                AssetDatabase.LoadAssetAtPath(prefabPath, typeof(Object)) as GameObject;
        }

        TestData testData = existingPrefab.GetComponent<TestData>();
        if (testData != null)
        {
            testData.data = newData;
            EditorUtility.SetDirty(existingPrefab);
        }
    }

    static void HandleRemovedFile(string path)
    {
        // Decide what you want to do here. If the source file is removed
        // do you want to delete the prefab? Maybe ask if you'd like to
        // remove the prefab?
        // NOTE: Because you might get many calls (like you deleted a
        // subfolder full of .test files you might want to get all the
        // filenames and ask all at once ("delete all these prefabs?").
    }

    static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        foreach (var path in importedAssets)
        {
            if (IsFileWeCareAbout(path))
            {
                HandleAddedOrChangedFile(path);
            }
        }

        foreach (var path in deletedAssets)
        {
            if (IsFileWeCareAbout(path))
            {
                HandleRemovedFile(path);
            }
        }

        for (var ii = 0; ii < movedAssets.Length; ++ii)
        {
            string srcStr = movedFromAssetPaths[ii];
            string dstStr = movedAssets[ii];

            // the source was moved, let's move the corresponding prefab
            // NOTE: We don't handle the case if there already being
            // a prefab of the same name at the destination
            string srcPrefabPath = srcStr + ".prefab";
            string dstPrefabPath = dstStr + ".prefab";

            AssetDatabase.MoveAsset(srcPrefabPath, dstPrefabPath);
        }
    }
}

これを保存すると、上記で作成したExample.testファイルをUnity Assetsフォルダにドラッグアンドドロップでき、対応するプレハブが作成されているはずです。 Example.testを編集すると、プレハブのデータがすぐに更新されることがわかります。プレハブをシーン階層にドラッグすると、それが更新され、 Example.test変更が表示されます。 Example.testを別のフォルダに移動すると、対応するプレハブも一緒に移動します。インスタンスのフィールドを変更した場合、 Example.testファイルを変更すると、インスタンス上で変更しなかったフィールドのみが更新されます。

改良点:上記の例では、 Example.testAssetsフォルダにドラッグすると、 Example.test.prefabExample.testの両方が表示されます。モデルのインポーターがうまく動作するように知っておくといいでしょう。魔法のようにExample.testしか表示されず、 AssetBundleやそのようなものです。あなたがその例をどのように提供しているか分かっているなら



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow