खोज…


वाक्य - विन्यास

  • AssetPostprocessor.OnPreprocessTexture ()

टिप्पणियों

String.Contains() केवल उन संपत्तियों को संसाधित करने के लिए उपयोग करें String.Contains() पास उनके परिसंपत्ति पथों में एक स्ट्रिंग है।

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

बनावट पोस्टप्रोसेसर

संपत्ति फ़ोल्डर में कहीं भी 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 के डीएरिएलाइज़ करना आसान बनाता है। आपको एक कस्टम वर्ग का उपयोग करने की आवश्यकता नहीं है लेकिन यह इस उदाहरण को छोटा बनाता है। हम इसे 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();
}

यदि आप मैन्युअल रूप से उस स्क्रिप्ट को गेमऑबजेक्ट में जोड़ते हैं, तो आप कुछ ऐसा देखेंगे

टेस्ट डेटा इंस्पेक्टर

इसके बाद Assets तहत कहीं एक 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 फ़ाइल को खींच कर छोड़ सकते हैं। यदि आप Example.test संपादित करते हैं, तो आप देखेंगे कि Example.test में डेटा तुरंत अपडेट हो गया है। यदि आप प्रीफ़ैब को दृश्य पदानुक्रम में खींचते हैं, तो आप इसे अपडेट के साथ-साथ Example.test परिवर्तन देखेंगे। यदि आप किसी अन्य फ़ोल्डर में Example.test को स्थानांतरित करते हैं, तो संबंधित प्रीफैब इसके साथ आगे बढ़ेगा। यदि आप किसी फ़ील्ड को किसी उदाहरण पर बदलते हैं, तो Example.test फ़ाइल को बदल दें, आपको केवल वही फ़ील्ड दिखाई देंगी, जिन्हें आपने संशोधित नहीं किया था जो अपडेट हो गए हैं।

सुधार: उपरोक्त उदाहरण में, आप को खींच के बाद Example.test अपने में Assets फ़ोल्डर आप वहाँ दोनों एक देखेंगे Example.test और एक Example.test.prefab । यह जानने के लिए बहुत अच्छा होगा कि इसे मॉडल आयातकों की तरह अधिक काम करने के लिए हम काम करते हैं आप जादुई रूप से केवल Example.test देखेंगे और यह एक AssetBundle या कुछ ऐसी चीज है। यदि आप जानते हैं कि कृपया उस उदाहरण को कैसे प्रदान करें



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow