수색…


통사론

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

이제 유니티가 텍스처를 임포트 할 때마다 다음과 같은 매개 변수가 생깁니다 : 여기에 이미지 설명을 입력하십시오.

포스트 프로세서를 사용하는 경우 편집기에서 가져 오기 설정 을 조작하여 텍스처 매개 변수를 변경할 수 없습니다.
적용 버튼을 누르면 텍스처가 다시 ​​가져오고 포스트 프로세서 코드가 다시 실행됩니다.

기본 수입업자

가져 오기 도구를 만들려는 사용자 지정 파일이 있다고 가정합니다. 그것은 .xls 파일이나 뭐든지 될 수 있습니다. 이 경우 쉽기 때문에 JSON 파일을 사용할 것이지만 사용자 정의 확장을 선택하여 어떤 파일이 우리의 파일인지 쉽게 알 수 있습니다.

JSON 파일의 형식이

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

Example.test 를 현재 자산 외부 의 어딘가에 저장해 봅시다.

다음으로 데이터 용 사용자 정의 클래스로 MonoBehaviour 를 만듭니다. 커스텀 클래스는 JSON을 deserialize하기 쉽도록하기위한 클래스입니다. 사용자 정의 클래스를 사용할 필요는 없지만이 예제를 더 짧게 만듭니다. 우리는 이것을 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에 수동으로 추가한다면,

테스트 데이터 Inspecotor

다음으로 Assets 아래에 Editor 폴더를 만듭니다. 나는 어느 수준이든 될 수있다. Editor 폴더에서 TestDataAssetPostprocessor.cs 파일을 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.test 당신에 Assets 당신이 모두 거기에 볼 수 폴더 Example.testExample.test.prefab . 모델 수입업자처럼 작동하도록하는 것이 좋을 것입니다. 마술처럼 Example.test AssetBundle 이나 그런 것들이 있습니다. 이 예제를 어떻게 제공했는지 알고 있다면



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow