আমি কীভাবে স্বয়ংক্রিয়ভাবে উত্পন্ন স্ক্রিপ্টটি কাস্টমাইজ করব?


11

আপনি যখন ইউনিটি সম্পাদকের মাধ্যমে কোনও স্ক্রিপ্ট তৈরি করেন, এটি কিছু প্রাক-ফর্ম্যাট কোড সহ একটি স্ক্রিপ্ট তৈরি করে।

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

    }
}

যখন আমি কোনও স্ক্রিপ্ট তৈরি করি, তখন সাধারণত অতিরিক্ত কোড যেমন নেমস্পেস বা কাস্টম সম্পাদক ব্যবহার করার জন্য আমার নিশ্চয়তা থাকে। তদতিরিক্ত, আমি প্রায় সবসময় স্বয়ংক্রিয়ভাবে উত্পন্ন স্ক্রিপ্ট থেকে সামগ্রী মুছতে পারি । ইউনিটির দ্বারা উত্পন্ন স্বয়ংক্রিয় কোডটি পরিবর্তন করার কোনও উপায় আছে কি?


1
এমনকি আমি এটি করার কথা ভাবিও নি। জিজ্ঞাসা করার জন্য ধন্যবাদ! এখন দুটি উত্তর একত্রিত করতে একটি টেমপ্লেট রয়েছে এবং তারপরে এটি অতিরিক্ত স্থান যেমন নেমস্পেসের মতো তথ্য সন্নিবেশ করার জন্য পার্স করা হচ্ছে ...
ড্রাকো

উত্তর:


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. সহজে প্রতিস্থাপনের জন্য টেমপ্লেটগুলিতে নিজস্ব নিয়ন্ত্রণ ক্রম সন্নিবেশ করান OnWillCreateAsseteg

    finalCode = finalCode.Replace(@"#date#", DateTime.Now);
  3. টেম্পলেট ফোল্ডারে আরও টেম্পলেট যুক্ত করুন, উদাহরণস্বরূপ একক প্যাটার্নের জন্য একটি - ইউনিটি একক স্ক্রিপ্ট টেম্পলেটটিতে সীমাবদ্ধ নয়।

  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. ভিজ্যুয়াল স্টুডিওতে খুব শক্তিশালী কোড জেনারেশন সরঞ্জাম সরবরাহ করা হয়, টি 4 টেক্সট টেম্পলেট (ইএফ টি 4 ব্যবহার করছে) যদিও আমি ব্যক্তিগতভাবে ইউনিটি প্রকল্পগুলির ব্যবহারিক ব্যবহার সন্দেহজনকভাবে পাই - সেগুলি ওভারকিল, বেশ জটিল এবং প্রকল্পের সংকলন সম্ভবত ভিজ্যুয়ালের উপর নির্ভরশীল হয়ে উঠবে স্টুডিও।


এটি একটি মোহন মত কাজ করেছে! আমি ভবিষ্যতের ব্যবহারকারীদের জন্য প্রাসঙ্গিক নেমস্পেস যুক্ত করেছি। আমার আরও একটি সমস্যা ছিল, যদিও আমি মনে করি এটি আমার পক্ষে এক অনন্য হতে পারে; আমি ব্যবহার করতে পারি না Path.GetFileWithoutExtension। এটি আমাকে বলে যে এটি কোনওটিতে অ্যাক্সেস করার চেষ্টা করছেMonoBehaviour , যা অদ্ভুত বলে মনে হচ্ছে। আমি নেমস্পেসটি অন্তর্ভুক্ত করেছি using Path = System.IO.Path.GetFileWithoutExtensionএবং আমি Pathএকসাথে সব হারিয়েছি । শেষ অবধি, আমাকে লাইনটি পুরোপুরি বন্ধ করতে হবে, নিজেই ( .Contains("class " + System.IO.Path.GetFileNameWithoutExtension(assetPath)));)।
জেনমলক

বিএম-এর সাথে সিআরএলএফ এবং ইউটিএফ -8 এর চেয়ে এলএফ এবং ইউটিএফ -8 দিয়ে ফাইলগুলি তৈরি করা হয়েছে তা নিশ্চিত করার সহজতম উপায়টি কী?
অ্যারন ফ্রাঙ্ক

অ্যারনফ্রেঙ্ককে ভালভাবেই চলুন ... বরং নির্দিষ্ট অনুরোধ জানাতে পারেন। আমি স্ট্যাকওভারফ্লো ডটকমের সাথে জিজ্ঞাসা করার চেষ্টা করব কীভাবে বিএম এর সাথে এলএফ-আউটপুট তৈরি string/ File.Writeআউটপুট করা যায়। আমি যতদূর জানি '\ n' কেবল এলএফ হওয়া উচিত , আপনি তার Environment.Newlineপরিবর্তে চেষ্টাও করতে পারেন তবে এটি সিআরএলএফ হওয়া উচিত। আরও কিছু ব্যর্থ হলে গিট হুক ব্যবহারের বিকল্পও থাকতে পারে। এই স্ট্যাকওভারফ্লো প্রশ্নটি দিয়ে বিওএম সহজ হওয়া উচিত ।
ওয়েজরা

15

আপনি আপনার ইউনিটি ইনস্টলেশন ফোল্ডারে স্বয়ংক্রিয়ভাবে কোড উত্পন্ন করার জন্য স্ক্রিপ্ট টেম্পলেটগুলি সন্ধান করতে পারেন। আমি "ইউনিটি / সম্পাদক / ডেটা / রিসোর্স / স্ক্রিপ্টটেম্প্লেটস" এর অধীন টেম্পলেটগুলি পাই , অন্য সংস্থাগুলি এটি "ইউনিটি / সম্পাদক / ডেটা / সংস্থানসমূহ" এর অধীনে খুঁজে পেয়েছে ।

জেনেরিক ইউনিটিস্ক্রিপ্ট এবং সি # টেমপ্লেটগুলি যথাক্রমে "82-Javascript-NewBehaviourScript.js.txt" এবং "81-C # স্ক্রিপ্ট-NewBehaviourScript.cs.txt" ফাইল হিসাবে চিহ্নিত করা হয়। Ityক্য অটো স্ক্রিপ্ট উত্পন্ন করার উপায়টি পরিবর্তন করতে আপনি সরাসরি এই ফাইলগুলি সম্পাদনা করতে পারেন।

আপনি অতিরিক্ত টেম্পলেটগুলিও অন্তর্ভুক্ত করতে পারেন, যা আপনি যখন "প্রকল্প" উইন্ডো থেকে "তৈরি" নির্বাচন করবেন তখন উপস্থিত হবে । টেমপ্লেট না প্রদর্শিত অনন্য সংখ্যায়ন প্রয়োজন, এবং মেনু অনুক্রমের, যেখানে "__" একটি সাবমেনু উল্লেখ করে তা নির্ধারণ করতে প্রাথমিক স্ট্রিং ব্যবহার করুন। উদাহরণস্বরূপ, "৮১-সি # স্ক্রিপ্ট__এডিটর স্ক্রিপ্ট-নিউবিহাইওরস্ক্রিপ্ট.সিএসটিএক্স" নামে একটি ফাইল থাকা আপনাকে এই টেমপ্লেটটি ব্যবহার করে "সম্পাদক স্ক্রিপ্ট" তৈরির উপ বিকল্প সহ একটি অতিরিক্ত " সি # স্ক্রিপ্ট" মেনু দেবে ।

মূল টেম্পলেটগুলির নাম পরিবর্তন করবেন না ; এগুলি ইঞ্জিন দ্বারা আরও সরাসরি ব্যবহৃত হয়। উদাহরণস্বরূপ, "81-C # স্ক্রিপ্ট-নিউবিহাইওরস্ক্রিপ্ট। সিএসটিএক্সটি" এর নতুন নামকরণ আপনাকে সরাসরি পরিদর্শকের মাধ্যমে নতুন সি # স্ক্রিপ্টগুলি উপাদান হিসাবে যুক্ত করা থেকে বিরত করবে।


নীচে আমার নিজস্ব উদাহরণ রয়েছে, যদিও এটি এমন নির্দিষ্ট অনুশীলনগুলি প্রদর্শন করে যা আমি সবচেয়ে বেশি পছন্দ করি। উদাহরণস্বরূপ, আমি লক্ষ্য বর্গ হিসাবে একই ফাইলটিতে আমার কাস্টম সম্পাদক স্ক্রিপ্ট পছন্দ করতে পছন্দ করি, তাই আমি #if UNITY_EDITOR .. #endifএডিটরটি ফোল্ডারে জেনেরিক "বিল্ড ইন কমপাইল" এডিটর ফোল্ডারে রাখার পরিবর্তে এটিকে আবদ্ধ করি ।

কাস্টম নেমস্পেসের প্রসঙ্গ সরবরাহ করা এমনকি সম্ভব কিনা তা আমি নিশ্চিত নই; আমি কেবল "NAMESPACE" ব্যবহার করি, কারণ এটি সাধারণভাবে অন্তর্নির্মিত "সন্ধান করুন .. সমস্ত স্থান রাখুন" ফাংশনটি ব্যবহার করে আমাকে সঠিক নামস্থান পোস্ট-ক্রিয়েশন সরবরাহ করতে দেয়।


টেমপ্লেট:

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