Як налаштувати автоматично створений сценарій?


11

Коли ви створюєте скрипт через редактор Unity, він генерує сценарій з деяким попередньо відформатованим кодом.

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 () {

    }
}

Коли я створюю сценарій, я, як правило, використовую додатковий код, наприклад, простір імен або спеціальний редактор. Крім того, я майже завжди видаляю вміст із автоматично створеного сценарію. Чи є спосіб змінити автоматичний код, створений Unity?


1
Я ніколи навіть не думав робити це. Спасибі за питання! Тепер поєднайте дві відповіді, щоб мати шаблон, а потім проаналізуйте його, щоб вставити додаткову інформацію, наприклад, простір імен ...
Draco18s більше не довіряє SE

Відповіді:


4

Крім того, ви також можете

  1. Додайте сценарій редактора в папку Активи / Редактор, який підписується на те, OnWillCreateAssetде ви можете проаналізувати вихід і змінити його. Наприклад, скрипт, який автоматично вставляв би простір імен, може виглядати наступним чином:

    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. Вставте власні послідовності управління в шаблони для легкої заміни OnWillCreateAsset, наприклад

    finalCode = finalCode.Replace(@"#date#", DateTime.Now);
  3. Додайте до папки шаблонів більше шаблонів, наприклад, один для шаблону Singleton - Unity не обмежується одним шаблоном сценарію.

  4. Фрагменти коду візуальної студії - це спосіб налаштувати створення нових сценаріїв (... і навіть далі - нових частин сценарію). Наприклад, фрагмент коду для приватних SerializeFieldможе стати в нагоді. Після імпорту 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>
    

    в Інструменти / Менеджер фрагментів коду / Мій фрагмент коду ви можете просто ввести подвійну вкладку "pf" і ввести ім'я поля. Наприклад:

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

    Ще зручнішими були б фрагменти для часто повторюваних довших послідовностей, наприклад, властивість, що читається тільки, підкріплена SerializeFieldполями.

  5. Visual studio також пропонує дуже потужний інструмент генерації коду, текстові шаблони T4 (EF використовує T4), хоча я особисто вважаю, що практичне використання для проектів Unity є сумнівним - вони є надмірними, досить складними, і компіляція проекту, ймовірно, стане залежною від Visual Студія.


Це спрацювало як шарм! Я додав відповідні простори імен для майбутніх користувачів. У мене також була ще одна проблема, хоча я думаю, що це може бути одна унікальна для мене; Я не можу користуватися Path.GetFileWithoutExtension. Це говорить мені, що він намагається отримати доступ до MonoBehaviour, що здається дивним. Я включаю простір імен using Path = System.IO.Path.GetFileWithoutExtensionі втрачаю Pathвсіх разом. Врешті-решт, мені довелося повністю заграти лінію, себе ( .Contains("class " + System.IO.Path.GetFileNameWithoutExtension(assetPath)));).
Gnemlock

Який найпростіший спосіб забезпечити створення файлів за допомогою LF та UTF-8, а не CRLF та UTF-8 за допомогою BOM?
Аарон Франке

@AaronFranke добре ... це досить конкретний запит. Я б спробував запитати на stackoverflow.com, як зробити string/ File.Writeвивести LF-тільки з BOM. Наскільки я знаю, '\ n' має бути лише LF, ви також можете спробувати, Environment.Newlineале це повинен бути CRLF. Можливо, також є можливість використовувати гачки для git, якщо все інше не вдається. BOM має бути легким із цим питанням про stackoverflow .
wondra

15

Ви можете знайти шаблони сценаріїв для автоматичного генерування коду у папці установки Unity. Я знаходжу шаблони в розділі "Unity / Editor / Data / Resources / ScriptTemplates" , а інші джерела знайшли його під "Unity / Editor / Data / Resources" .

Загальні шаблони UnityScript та C # ідентифікуються як файли "82-Javascript-NewBehaviourScript.js.txt" та "81-C # Script-NewBehaviourScript.cs.txt" відповідно. Ви можете безпосередньо редагувати ці файли, щоб змінити спосіб автоматичного створення сценарію Unity.

Ви також можете включити додаткові шаблони, які з’являться, коли ви виберете "Створити" у вікні "Проект" . Здається, що шаблони не потребують унікальної нумерації, і використовуйте початковий рядок для визначення ієрархії меню, де "__" позначає підменю. Наприклад, маючи файл під назвою "81-C # Script__Editor Script-NewBehaviourScript.cs.txt" , ви отримаєте додаткове меню " С # скрипт" з підменю для створення "Редактора скриптів" за допомогою цього шаблону.

Ви НЕ перейменовуйте оригінальні шаблони; вони використовуються безпосередньо, двигуном. Наприклад, перейменування "81-C # Script-NewBehaviourScript.cs.txt" не дозволить вам додавати нові сценарії C # як компоненти безпосередньо через інспектор.


Нижче - власний приклад, хоча він демонструє конкретні практики, які я найбільше звичаю. Наприклад, я вважаю за краще мати свій власний скрипт редактора в тому ж файлі, що і цільовий клас, тому я інкапсулюю його #if UNITY_EDITOR .. #endif, замість того, щоб розміщувати його в загальній папці редактора "не збирати в збірку".

Я не впевнений, чи можливо навіть надати контекст користувацького простору імен; Я просто використовую "NAMESPACE", оскільки це дозволяє мені забезпечити правильний простір імен після створення, використовуючи загальновбудовану функцію "find..replace all".


Шаблон:

/* 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
}

Вихід:

/* 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.