자동 생성 된 스크립트를 어떻게 사용자 정의합니까?


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. Assets / Editor 폴더에 구독하는 편집기 스크립트 추가 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. Visual Studio 코드 스 니펫 은 새로운 스크립트 (및 새로운 스크립트 부분) 작성을 사용자 정의하는 방법입니다. 예를 들어 개인용 코드 스 니펫 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. 이상하게 보입니다. 나는 namespace을 포함하고 모두 함께 using Path = System.IO.Path.GetFileWithoutExtension잃어 버린다 Path. 결국 나는 그 선 자체를 완전히 다짐해야했다 ( .Contains("class " + System.IO.Path.GetFileNameWithoutExtension(assetPath)));).
그놈 록

BOM을 사용하여 CRLF 및 UTF-8 대신 LF 및 UTF-8로 파일을 작성하는 가장 간단한 방법은 무엇입니까?
Aaron Franke

@AaronFranke 음 ... 그건 다소 구체적인 요청입니다. 내가 만드는 방법을 stackoverflow.com에 요청하려고 할 것입니다 string/ File.WriteBOM으로 출력 LF 전용입니다. 내가 아는 한 '\ n' LF Environment.Newline이어야하지만 대신 시도 할 수도 있지만 CRLF이어야합니다. 다른 모든 것이 실패하면 git hooks를 사용하는 옵션도 있습니다. 이 stackoverflow 질문으로 BOM이 쉬워야 합니다.
wondra 2016 년

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" 라는 파일 이 있으면이 템플릿을 사용하여 "편집기 스크립트" 를 만드는 하위 옵션과 함께 추가 " C # 스크립트" 메뉴가 제공됩니다 .

하다 하지 원래 서식 파일의 이름을 변경; 이들은 엔진에 의해보다 직접적으로 사용됩니다. 예를 들어 "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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.