Otomatik olarak oluşturulan komut dosyasını nasıl özelleştiririm?


11

Unity düzenleyicisi ile bir komut dosyası oluşturduğunuzda, önceden biçimlendirilmiş bazı kodlara sahip bir komut dosyası oluşturur.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenericClass : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

Bir komut dosyası oluşturduğumda genellikle ad alanı veya özel düzenleyici gibi ek kod kullanmam garanti edilir. Ayrıca, neredeyse her zaman otomatik olarak oluşturulan komut dosyasından içeriği silerim. Unity tarafından üretilen otomatik kodu değiştirmenin bir yolu var mı?


1
Bunu yapmayı hiç düşünmemiştim bile. Sorduğunuz için teşekkürler! Şimdi bir şablon için iki cevap birleştirmek ve daha sonra ad alanı gibi ekstra bilgi eklemek için ayrıştırmak için ...
Draco18s artık SE

Yanıtlar:


4

Ayrıca şunları da yapabilirsiniz:

  1. Varlıkları / Editör klasörüne OnWillCreateAsset, çıktıyı ayrıştırabileceğiniz ve değiştirebileceğiniz bir abone komut dosyası ekleyin . Örneğin, otomatik olarak ad alanı ekleyen komut dosyası aşağıdaki gibi görünebilir:

    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Text.RegularExpressions;
    
    using UnityEditor;
    
    public class InsertNS : UnityEditor.AssetModificationProcessor
    {
        public static void OnWillCreateAsset(string path)
        {
            string assetPath = Regex.Replace(path, @".meta$", string.Empty);
            if (!assetPath.EndsWith(".cs")) return;
    
            var code = File.ReadAllLines(assetPath).ToList();
            if (code.Any(line => line.Contains("namespace"))) return;//already added by IDE
    
            //insert namespace
            int idx = code.FindIndex(line => line
                .Contains("class " + Path.GetFileNameWithoutExtension(assetPath)));
            code.Insert(idx, Regex.Replace(
            assetPath.Replace('/','.'), @"^([\w+.]+)\.\w+\.cs$", "namespace $1 {\n"));
            code.Add("}");
    
            //correct indentation
            for (int i = idx + 1; i < code.Count - 1; i++) code[i] = '\t' + code[i];
    
            var finalCode = string.Join("\n", code.ToArray());
            File.WriteAllText(assetPath, finalCode);
            AssetDatabase.Refresh();
        }
    }
  2. Kolayca değiştirmek için şablonlara kendi kontrol dizilerini ekleyin OnWillCreateAsset, ör.

    finalCode = finalCode.Replace(@"#date#", DateTime.Now);
  3. Şablon klasörüne daha fazla şablon ekleyin, örneğin Singleton kalıbı için bir tane - Unity tek komut dosyası şablonuyla sınırlı değildir.

  4. Visual studio kod parçacıkları , yeni komut dosyaları (... ve hatta yeni komut dosyası parçaları) oluşturmayı özelleştirmenin yoludur. Örneğin, özel için bir kod snippet'i SerializeFieldkullanışlı olabilir. İçe aktardıktan sonra privateField.snippet:

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
      <CodeSnippet Format="1.0.0">
        <Header>
          <Title>
            Serialized private field
          </Title>
          <Author>Myself</Author>
          <Description>Adds private serializable field visible to Unity editor</Description>
          <Shortcut>pf</Shortcut>
        </Header>
        <Snippet>
          <Imports>
            <Import>
              <Namespace>UnityEngine</Namespace>
            </Import>
          </Imports>
          <Declarations>
            <Literal>
              <ID>FieldName</ID>
              <ToolTip>Replace with field name.</ToolTip>
              <Default>myField</Default>
            </Literal>
          </Declarations>
          <Code Language="CSharp">
            <![CDATA[[SerializeField] float _$FieldName$;]]>
          </Code>
        </Snippet>
      </CodeSnippet>
    </CodeSnippets>

    için Araçlar / Kod Parçacığı Müdürü / My Kod Parçacıkları sadece çift sekme "pf" yazıp alanın adını yazabilirsiniz. Örneğin:

    //"pf" tab tab "speed" produces
    [SerializeField] float _speed;

    Daha da uygun olan, genellikle tekrarlanan daha uzun diziler için parçacıklar olabilir, örneğin SerializeFieldalan tarafından desteklenen salt okunur özellik .

  5. Visual studio ayrıca çok güçlü bir kod oluşturma aracı, T4 Metin Şablonları (EF T4 kullanıyor), ancak Unity projeleri için pratik kullanımı şüpheli buluyorum - bunlar aşırı derecede, oldukça karmaşık ve projenin derlemesi muhtemelen Visual'a bağlı olacak Stüdyo.


Bu bir cazibe gibi çalıştı! Gelecekteki kullanıcılar için alakalı ad alanları ekledim. Bir tane daha sorunum daha vardı, ancak bunun benim için benzersiz bir sorun olabileceğini düşünüyorum; Kullanamıyorum Path.GetFileWithoutExtension. Bana garip görünen bir a'ya erişmeye çalıştığını söylüyor MonoBehaviour. İsim alanını ekliyorum using Path = System.IO.Path.GetFileWithoutExtensionve Pathhepsini birlikte kaybediyorum . Sonunda, çizgiyi tamamen savuşturmak zorunda kaldım, kendisi ( .Contains("class " + System.IO.Path.GetFileNameWithoutExtension(assetPath)));).
Gnemlock

Dosyaların BRL yerine CRLF ve UTF-8 yerine LF ve UTF-8 ile oluşturulmasını sağlamanın en basit yolu nedir?
Aaron Franke

@AaronFranke iyi ... oldukça özel bir istek. Ben nasıl stackoverflow.com üzerinde soran çalışacaktı string/ File.WriteBOM ile çıkış LF okunur. Bildiğim kadarıyla '\ n' sadece LF olmalı , Environment.Newlinebunun yerine deneyebilirsiniz ama CRLF olmalı. Diğer her şey başarısız olursa git kancalarını kullanma seçeneği de olabilir. BOM, bu yığın akışı sorusu ile kolay olmalıdır .
wondra

15

Otomatik olarak kod oluşturmak için komut dosyası şablonlarını Unity kurulum klasörünüzde bulabilirsiniz. Şablonları "Unity / Editor / Data / Resources / ScriptTemplates" altında bulurken, diğer kaynaklar "Unity / Editor / Data / Resources" altında bulmuşlardır .

Genel UnityScript ve C # şablonları, sırasıyla "82-Javascript-NewBehaviourScript.js.txt" ve "81-C # Script-NewBehaviourScript.cs.txt" dosyaları olarak tanımlanır . Unity'nin otomatik olarak komut dosyası oluşturma şeklini değiştirmek için bu dosyaları doğrudan düzenleyebilirsiniz.

Ayrıca seçtiğiniz zaman görünecek ek şablonlar içerebilir "Oluştur" dan "Proje" penceresinde. Şablonlar yok görünen eşsiz numaralandırma gerektirecek ve "__" bir alt menü gösterir menü hiyerarşisi, belirlemek için ilk dizeyi kullanın. Örneğin, "81-C # Script__Editor Komut Dosyası-NewBehaviourScript.cs.txt" adlı bir dosyaya sahip olmak , bu şablonu kullanarak bir "Editör Komut Dosyası" oluşturma alt seçeneğiyle birlikte ek bir " C # Komut Dosyası" menüsü verecektir .

Do not orijinal şablonlar adlandırmak; bunlar motor tarafından daha doğrudan kullanılır. Örneğin, "81-C # Script-NewBehaviourScript.cs.txt" olarak yeniden adlandırmak , doğrudan denetçi aracılığıyla bileşen olarak yeni C # komut dosyaları eklemenizi engeller.


Aşağıda kendi örneğim var, ancak en özel olduğum uygulamaları gösteriyor. Örneğin, özel düzenleyici komut dosyamın hedef sınıfla aynı dosyada olmasını tercih ediyorum, bu yüzden #if UNITY_EDITOR .. #endifonu genel bir "derlemede derleme" düzenleyici klasörüne yerleştirmek yerine içine yerleştiriyorum.

Özel bir ad alanının bağlamını sağlamak mümkün olup olmadığından emin değilim; Ben sadece "NAMESPACE" kullanın, çünkü bu yaygın dahili "find..replace" işlevini kullanarak, oluşturma sonrası doğru ad alanı sağlamak sağlar.


Şablon:

/* Created by Gnemlock */

using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace NAMESPACE
{
    public class #SCRIPTNAME# : MonoBehaviour 
    {
        /// <summary>This method will be called at the start of each frame where this 
        /// instance of <see cref="NAMESPACE.#SCRIPTNAME#"/> is enabled.</summary>
        void Update ()
        {
            #NOTRIM#
        }
    }
}

namespace NAMESPACE.UTILITY
{
    #if UNITY_EDITOR
    [CustomEditor(typeof(#SCRIPTNAME#))] public class #SCRIPTNAME#Editor : Editor
    {
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();

            #SCRIPTNAME# s#SCRIPTNAME# = target as #SCRIPTNAME#;
        }
    }
    #endif
}

Çıktı:

/* Created by Gnemlock */

using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace MyNamespace
{

    public class UpdatedClass : MonoBehaviour 
    {
        /// <summary>This method will be called at the start of each frame where this 
        /// instance of <see cref="MyNamespace.UpdatedClass"/> is enabled.</summary>
        void Update ()
        {

        }
    }
}

namespace MyNamespace.UTILITY
{
    #if UNITY_EDITOR
    [CustomEditor(typeof(UpdatedClass))] public class UpdatedClassEditor : Editor
    {
        public override void OnInspectorGUI()
        {
            DrawDefaultInspector();

            UpdatedClass sUpdatedClass = target as UpdatedClass;
        }
    }
    #endif
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.