国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity 編輯器-創(chuàng)建模板腳本,并自動綁定屬性,添加點(diǎn)擊事件

這篇具有很好參考價值的文章主要介紹了Unity 編輯器-創(chuàng)建模板腳本,并自動綁定屬性,添加點(diǎn)擊事件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

當(dāng)使用框架開發(fā)時,Prefab掛載的很多腳本都有固定的格式。從Unity的基礎(chǔ)模板創(chuàng)建cs文件,再修改到應(yīng)有的模板,會浪費(fèi)一些時間。尤其是有大量的不同界面時,每個都改一遍,浪費(fèi)時間不說,還有可能遺漏或錯改。寫個腳本創(chuàng)建指定的模板代替C#基礎(chǔ)模板。

注:當(dāng)前腳本使用的NGUI,使用UGUI時替換對應(yīng)的Component即可

代碼
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public class MediatorScriptCreator
{
    private const string MenuItemText1 = "Assets/Create/模板腳本/創(chuàng)建Mediator模板腳本";
    private const string MenuItemText3 = "Assets/Create/模板腳本/添加Mediator模板腳本";
    [MenuItem(MenuItemText1, false, 25)]
    public static void CreateScript()
    {
        CreateScript(false);
    }
   
    
    [MenuItem(MenuItemText3, false, 25)]
    public static void AddScript()
    {
        AddComp();
    }
    
    private static List<GameObject> _nodeList;
    private static List<UISprite> _imgList;
    private static List<UIButton> _btnList;
    private static List<UILabel> _labelList;
    private static List<UISlider> _sliderList;

    private static void CreateScript(bool isPartial)
    {

        var assetPath = AssetDatabase.GetAssetPath(Selection.activeObject);
        var directoryPath = System.IO.Path.GetDirectoryName(assetPath);
        var folderName = System.IO.Path.GetFileName(directoryPath);
        var folderPath = $"Assets/Game/GameLogic/{folderName}";
        if (!Directory.Exists(folderPath))
        {
            if (directoryPath != null) Directory.CreateDirectory(folderPath);
        }

        var scriptPath = $"{folderPath}/{Selection.activeObject.name}Mediator.cs";
        if (File.Exists(scriptPath))
        {
            Debug.LogError($"The script \"{scriptPath}\" already exists.");
            return;
        }

        var myPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
        // 獲取 Prefab 的所有子對象
        GetNodeData(myPrefab);

        var txt = $@"using UnityEngine;
namespace PD
{{
    public {(isPartial ? "partial" : "")} class {Selection.activeObject.name}Mediator : NGuiFormMasterLogic
    {{
        public override string FacadeName
        {{
            get {{ return HomeFacade.Name; }}//TODO:修改FacadeName
        }}

        public new const string NAME = {$"\"{Selection.activeObject.name}Mediator\""};

        public override void OnConstruct(object userData)
        {{
            base.OnConstruct(userData);
            MediatorName = NAME;
        }}
";
        var txtEnd = $@"
    }}
}}";
        for (var i = 0; i < _nodeList.Count; i++)
        {
            var name = _nodeList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"
        [SerializeField] private GameObject {name};
";
            txt += str;
        }

        for (var i = 0; i < _imgList.Count; i++)
        {
            var name = _imgList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"
        [SerializeField] private UISprite {name};
";
            txt += str;
        }

        for (var i = 0; i < _labelList.Count; i++)
        {
            var name = _labelList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"
        [SerializeField] private UILabel {name};
";
            txt += str;
        }

        for (var i = 0; i < _btnList.Count; i++)
        {
            var name = _btnList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"
        [SerializeField] private UIButton {name};
";
            txt += str;
        }

        for (var i = 0; i < _sliderList.Count; i++)
        {
            var name = _sliderList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"
        [SerializeField] private UISlider {name};
";
            txt += str;
        }

        for (var i = 0; i < _btnList.Count; i++)
        {
            var name = _btnList[i].name[2..];
            name = name[..1].ToUpper() + name[1..];
            var str = $@"


        public void On{name}Click()
        {{
           
        }}

";
            txt += str;
        }


        txt += txtEnd;
        EditorPrefs.SetString("creatorPath", assetPath);
        EditorPrefs.SetString("creatorName", myPrefab.name);
        EditorPrefs.SetString("creatorScriptPath", scriptPath);
        File.WriteAllText(scriptPath, txt);
        AssetDatabase.Refresh();
    }

    public static void AddComp()
    {
        var scriptName = EditorPrefs.GetString("creatorName");
        string[] guids = AssetDatabase.FindAssets(scriptName);

        if (guids.Length > 0)
        {
            var assetPath = EditorPrefs.GetString("creatorPath");
            string path = AssetDatabase.GUIDToAssetPath(guids[0]);
            MonoScript monoScript = AssetDatabase.LoadAssetAtPath<MonoScript>(path);
            System.Type type = monoScript.GetClass();
            var prefab =
                GameObject.Instantiate(
                    AssetDatabase
                        .LoadMainAssetAtPath(
                            assetPath)) as GameObject; // PrefabUtility.LoadPrefabContents(assetPath);//
            var component = prefab.AddComponent(type);
            // 獲取所有字段
            var fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
            var list = prefab.GetComponentsInChildren<Transform>(true).Where(a => a.name.StartsWith("m_")).ToList();

            foreach (FieldInfo field in fields)
            {
                // 判斷字段是否被序列化
                var attributes = field.GetCustomAttributes(typeof(SerializeField), false);
                if (attributes.Length > 0)
                {
                    var temp = field.Name + "";
                    var name = temp[..1].ToLower() + temp[1..];
                    var go = list.FirstOrDefault(a => a.name == $"m_{name}");
                    if (go != null)
                    {
                        list.Remove(go);
                        var btn = go.GetComponent<UIButton>();
                        var slider = go.GetComponent<UISlider>();
                        var img = go.GetComponent<UISprite>();
                        var txt = go.GetComponent<UILabel>();
                        if (btn != null)
                        {
                            var str = $"On{field.Name}Click";
                            Debug.Log(str);
                            var delegateFunc1 = new EventDelegate(component as MonoBehaviour, str);
                            btn.onClick.Add(delegateFunc1);
                            field.SetValue(component, btn);
                        }
                        else if (slider != null)
                        {
                            field.SetValue(component, slider);
                        }
                        else if (img != null)
                        {
                            field.SetValue(component, img);
                        }
                        else if (txt != null)
                        {
                            field.SetValue(component, txt);
                        }
                        else
                        {
                            field.SetValue(component, go.gameObject);
                        }
                    }
                }
            }

            // GetNodeData(prefab);
            // PrefabUtility.SaveAsPrefabAssetAndConnect(prefab, assetPath);
            PrefabUtility.SaveAsPrefabAssetAndConnect(prefab, assetPath, InteractionMode.AutomatedAction);
            Object.DestroyImmediate(prefab);
            AssetDatabase.Refresh();
        }
        else
        {
            Debug.LogError($"請先生成腳本");
        }
    }
    [MenuItem(MenuItemText1, true)]
    public static bool CreatorNormal()
    {
        if (!Selection.activeObject) return false;
        var prefabAssetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject);
        return prefabAssetType != PrefabAssetType.NotAPrefab;

    }
    
    [MenuItem(MenuItemText3, true)]
    public static bool AddScript1()
    {
        if (!Selection.activeObject) return false;
        var prefabAssetType = PrefabUtility.GetPrefabAssetType(Selection.activeObject);
        return prefabAssetType != PrefabAssetType.NotAPrefab;

    }
    private static void GetNodeData(GameObject prefab)
    {
        Transform[] nodes = prefab.GetComponentsInChildren<Transform>(true);
        _nodeList = new List<GameObject>();
        _imgList = new List<UISprite>();
        _labelList = new List<UILabel>();
        _btnList = new List<UIButton>();
        _sliderList = new List<UISlider>();                                                                                              
        // 遍歷所有子對象
        foreach (var node in nodes)
        {
            if (!node.gameObject.name.StartsWith("m_")) continue;
            var btn = node.GetComponent<UIButton>();
            var img = node.GetComponent<UISprite>();
            var label = node.GetComponent<UILabel>();
            var slider = node.GetComponent<UISlider>();
            if (btn != null)
            {
                _btnList.Add(btn);
            }
            else if (slider != null)
            {
                _sliderList.Add(slider);
            }
            else if (img != null)
            {
                _imgList.Add(img);
            }
            else if (label != null)
            {
                _labelList.Add(label);
            }
            else
            {
                _nodeList.Add(node.gameObject);
            }
        }
    }
}



使用方法
Unity 編輯器-創(chuàng)建模板腳本,并自動綁定屬性,添加點(diǎn)擊事件,unity,編輯器,游戲引擎
知識點(diǎn)

1.字符串使用@前綴,可以不使用\n換行。和$搭配使用時,字符串中如果有 { 需要用 {{ 兩個大括號表示,第一個為轉(zhuǎn)義。 字符串中有 ” 時,需要使用反斜杠 " 轉(zhuǎn)義
2.判斷物體是不是Prefab,PrefabUtility.GetPrefabAssetType(Selection.activeObject) != PrefabAssetType.NotAPrefab;
3.[MenuItem(MenuItemText2, true)] 第二個參數(shù) bool值表示是否顯示本擴(kuò)展方法
4.獲取指定腳本所有的Pulbic[SerializeField]的屬性: type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)文章來源地址http://www.zghlxwxcb.cn/news/detail-545607.html

到了這里,關(guān)于Unity 編輯器-創(chuàng)建模板腳本,并自動綁定屬性,添加點(diǎn)擊事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Unity3D】Unity 腳本 ② ( Visual Studio 2019 中的 Unity 編譯環(huán)境配置 | Unity 編輯器關(guān)聯(lián)外部 C# 腳本編輯器 Visual Studio )

    【Unity3D】Unity 腳本 ② ( Visual Studio 2019 中的 Unity 編譯環(huán)境配置 | Unity 編輯器關(guān)聯(lián)外部 C# 腳本編輯器 Visual Studio )

    在上一篇博客 【Unity3D】Unity 腳本 ① ( 創(chuàng)建 C# 腳本 | Visual Studio 2019 中打開 C# 腳本 | 編譯 C# 腳本 | 掛載 C# 腳本到游戲物體 | 運(yùn)行腳本 ) 中 , 雙擊 Unity 編輯器中的 Project 窗口中的 C# 腳本 , 進(jìn)入到 Visual Studio 中出現(xiàn)下圖樣式 , 這是因?yàn)闆]有配置 Unity 編譯環(huán)境 ; 參考如下兩個博

    2023年04月08日
    瀏覽(101)
  • 編輯器腳本:Unity中如何查找哪些物體上有missing的腳本

    編輯器腳本:Unity中如何查找哪些物體上有missing的腳本

    編輯器中選中物體,判斷這些物體及子物體上是否有丟失的腳本 1、編輯器選中n個物體 2、獲取這n個物體及其它們的子物體,數(shù)據(jù)集記為A 3、A中全部物體判斷他們是否有null的腳本(MonoBehaviour) 4、判斷一個物體(obj)是否有空腳本的關(guān)鍵語句: obj.GetComponentsMonoBehaviour().Any(mon

    2024年02月14日
    瀏覽(25)
  • Unity快手上手【熟悉unity編輯器,C#腳本控制組件一些屬性之類的】

    首先了解unity相關(guān)概述,快速認(rèn)識unity編輯器,然后抓住重點(diǎn)的學(xué):游戲?qū)ο?、組件|C#腳本、預(yù)制體、UI ? 學(xué)習(xí)過程你會發(fā)現(xiàn),其實(shí)Unity中主要是用c#進(jìn)行開發(fā)。 因?yàn)樵谶@個過程中,無非就是,對游戲?qū)ο笸ㄟ^掛載的C#腳本,修改一下組件的一些屬性,控制一下激活之類的操作

    2023年04月13日
    瀏覽(36)
  • 【Unity編輯器】使用AssetDatabase創(chuàng)建、刪、改、加載資源

    AssetDatabase是Unity編輯器環(huán)境下的一種API,主要用于在代碼中對項(xiàng)目中的資源進(jìn)行管理和操作。注意:AssetDatabase的這些方法只能在Unity編輯器環(huán)境下運(yùn)行,不能在構(gòu)建后的游戲中使用。在游戲運(yùn)行時,你需要使用其他資源加載方法,如Resources.Load、AssetBundle加載或者Addressables等。

    2024年01月21日
    瀏覽(34)
  • Unity編輯器擴(kuò)展-第六集-創(chuàng)建窗口/批量填圖

    Unity編輯器擴(kuò)展-第六集-創(chuàng)建窗口/批量填圖

    第五集鏈接:Unity編輯器擴(kuò)展-第五集-撤回操作/禁止操作/加快捷鍵_菌菌巧樂茲的博客-CSDN博客 一、本節(jié)目標(biāo)+效果展示 1.創(chuàng)建窗口 2.圖片批量賦值到物體上 二、創(chuàng)建窗口? 這個功能其實(shí)也很好理解,我們之前學(xué)了點(diǎn)擊選擇,但 我們難免會遇見需要選不同位置,不同種類的很多

    2024年02月10日
    瀏覽(18)
  • 【Unity編輯器擴(kuò)展】語言國際化工具,生成多語言Excel自動翻譯并導(dǎo)出多語言表

    【Unity編輯器擴(kuò)展】語言國際化工具,生成多語言Excel自動翻譯并導(dǎo)出多語言表

    ?多語言是個非常簡單且常用的功能。但是重復(fù)工作量大,程序手動把多語言Key配置到多語言表經(jīng)常會出現(xiàn)錯漏,或者幾經(jīng)改版,有些Key已經(jīng)不用卻沒有剔除,久而久之造成冗余。這中簡單且重復(fù)的工作必須讓工具來完成。 多語言通過Key,Value的形式保存,通過多語言API GF.

    2024年02月11日
    瀏覽(19)
  • Unity 制作旋轉(zhuǎn)門 推拉門 柜門 抽屜 點(diǎn)擊自動開門效果 開關(guān)門自動播放音效 (附帶編輯器擴(kuò)展代碼)

    Unity 制作旋轉(zhuǎn)門 推拉門 柜門 抽屜 點(diǎn)擊自動開門效果 開關(guān)門自動播放音效 (附帶編輯器擴(kuò)展代碼)

    對于一個新手來說,這個工具是最好的選擇 上一篇關(guān)于開關(guān)門的文章相對于復(fù)雜,感興趣的可以查看上篇開關(guān)門制作 優(yōu)點(diǎn) 掛載就能使用 控制面板一看就懂(全是中文) 簡單的調(diào)試就能獲得自己想要的效果 易懂且易修改的代碼 面板 參數(shù) 鎖:勾選后不能對門進(jìn)行操作 聲音:激活時自

    2023年04月24日
    瀏覽(61)
  • cocos creator 如何綁定參數(shù)到編輯器

    cocos creator 如何綁定參數(shù)到編輯器

    很多cocos?creator同學(xué)不知道如何綁定組件屬性到編輯器上,今天我們來教大家如何綁定 1: 基本數(shù)據(jù)屬性綁定到編輯器 ???這個非常簡單,模板是屬性名字:?默認(rèn)的值; Is_debug: false, speed: 100, 2: 系統(tǒng)組件類型與節(jié)點(diǎn)綁定到編輯器 屬性名字:?{ ???type: 組件類型(cc.Sprite, cc.Label,

    2024年01月23日
    瀏覽(24)
  • EMR電子病歷系統(tǒng) SaaS電子病歷編輯器源碼 電子病歷模板編輯器

    EMR電子病歷系統(tǒng) SaaS電子病歷編輯器源碼 電子病歷模板編輯器

    EMR(Electronic Medical Record)指的是電子病歷。它是一種基于電子文檔的個人醫(yī)療記錄,可以包括病人的病史、診斷、治療方案、藥物處方、檢查報告和護(hù)理計劃等信息。EMR采用計算機(jī)化的方式來存儲、管理和共享這些信息,以便醫(yī)生和醫(yī)療團(tuán)隊(duì)更快速、準(zhǔn)確地了解病人的病情,

    2024年02月11日
    瀏覽(26)
  • Vue + 富文本編輯器:打印模板設(shè)計

    Vue + 富文本編輯器:打印模板設(shè)計

    前言: 有的項(xiàng)目需要用到打印,如果只有少數(shù)的地方需要用到打印,一般只需要固定模板進(jìn)行打印就行了,但是我們的項(xiàng)目總是與眾不同,明明只要固定模板就可以完成需求的,非要添加一個靈活的打印模板,而且還涉及到拖拉填充文本,真是腦細(xì)胞不知道死掉了多少! ! !

    2024年02月09日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包