热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity——外挂编辑器

特殊目录Plugins:需要跨语言调用的代码逻辑代码储存目录,手机SDK接入Resource:储存跟随游戏包的资源目录Streaming

特殊目录                

        Plugins:需要跨语言调用的代码逻辑代码储存目录,手机SDK接入

        Resource:储存跟随游戏包的资源目录

StreamingAssets:只读,存储跟游戏包的资源目录

编辑目录:Editor

制作多目录合并

项目中建立的Editor目录,编辑器相关的逻辑和资源会放在其内部,相关内容,

在打包生成时,不会一起生成到项目中,玩家也不会使用到编辑器相关的内容。


//隐藏公共成员变量,同时保证脚本中变量的可访问度

[HideInInspector]

//私有变量,检视面板可见

[SerializeField]

//对象如果不标记为可序列化,则Unity在存储的时候,会认为他不可被序列化,那么也就无法被显示

[Serializable]

//给数值设定范围

[Range(int,int)]

//添加变量悬浮提示文字

[Tooltip(string)]

//当前成员变量上方加入一个标题文字

[Header(string)]

//指定输入框,拥有int行数据

[Multiline(int)]

//默认显示min行,最多显示max行内容,再多用滚动条控制显示区域

[TextArea(min,max)]

//小齿轮增加一个回调函数

[ContextMenu(string)] 

//第一个参数是菜单名称,第二个参数是右键点击的回调函数

[ContextMenuItem(name,funntion)]

//当前组件依赖于盒子碰撞器,当前组件挂载再对象上时,盒子碰撞体会一起被添加上,当该脚本没有被移除时,盒子碰撞体不能被移除

[RequireComponent(typeof(BoxCollider))]

//使生命周期函数,在编辑状态下可以运行,游戏中也可以正常使用

[ExecuteInEditMode]

//将Player组件添加到AddComponent上,第一个参数:分组名/组件名,第二个参数:列表中显示的顺序

[AddComponentMenu("自定义文件夹/自定义脚本",1)]


检视器高级修改(外挂式编程)

        项目中建立Editor目录

        

         Editor目录下建立外挂式开发脚本

         

        将编辑器脚本,与原始脚本进行关联

外挂脚本的方法

        1.引入编辑器的命名空间,检视器属于编辑器开发范畴

        

         2.继承Editor类,使用编辑器相关的成员变量和生命周期函数

        

         3.将编辑器开发脚本与需要编辑的组件脚本建立外挂关联关系

        

         4.需要在当前的外挂脚本中,获得需要被扩展的Player组件对象

        

         5.获取Player组件对象

        

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;[CustomEditor(typeof(Player))]
//外挂的脚本因为存储在Editor目录下,所以不会被打入最终的游戏包
//不继承自Mono,而是继承自Editor
public class PlayerEditor : Editor
{//获得到需要编辑显示的组件private Player _Component;//当关联组件所在对象被添加或选中时调用private void OnEnable(){_CompOnent= target as Player;}//当关联组件所在对象被删除或取消时调用private void OnDisable(){_CompOnent= null;}
}

private void OnEnable()

当关联组件所在对象被选中或组件被添加时,调用

    当关联组件所在对象被取消或组件被移除时,调用
    private void OnDisable()

    

    //用于绘制检视面板的生命周期函数
    public override void OnInspectorGUI()

    

         //标题显示
        EditorGUILayout.LabelField("人物相关属性");

                

            

             将玩家的ID展示出来

         _Component.ID = EditorGUILayout.IntField("玩家ID", _Component.ID);

        

 对象数据类型绘制
       参数1:标题
       参数2:原始组件的值
       参数3:成员变量的类型
       参数4:是否可以将场景中的对象拖给这个成员变量
        _Component.Weapon = EditorGUILayout.ObjectField("持有武器", _Component.Weapon, typeof(GameObject), true) as GameObject;

        

   单选枚举(标题, 组件上的原始值)
        _Component.Pro = (PlayerProfression)EditorGUILayout.EnumPopup("玩家职业", _Component.Pro);

        

   多选枚举(标题, 组件上的原始值)
        _Component.LoveColor = (PlayerLoveColor)EditorGUILayout.EnumFlagsField("玩家喜欢的颜色", _Component.LoveColor);

        

 终极数据类型绘制
         更新可序列化数据
        serializedObject.Update();
         通过成员变量名找到组件上的成员变量
        SerializedProperty sp = serializedObject.FindProperty("Items");
         可序列化数据绘制(取到的数据,标题,是否将所有获得的序列化数据显示出来)
        EditorGUILayout.PropertyField(sp, new GUIContent("道具信息"), true);
         将修改的数据,写入到可序列化的原始数据中
        serializedObject.ApplyModifiedProperties();

        

   滑动条绘制
         滑动条显示(1.标题,2.原始变量,最小值,最大值)
        _Component.Atk = EditorGUILayout.Slider(new GUIContent("玩家攻击力"), _Component.Atk, 0, 100);

        if (_Component.Atk > 80)
        {
             显示消息框(红色)
            EditorGUILayout.HelpBox("攻击力太高了", MessageType.Error);
        }

        if (_Component.Atk <20)
        {
             显示消息框(黄色)
            EditorGUILayout.HelpBox("攻击力太低了", MessageType.Warning);
        }

        

        

按钮显示和元素排列
      (按钮是否被按下)显示按钮(按钮名称)
        GUILayout.Button("来个按钮");
        GUILayout.Button("来个按钮");

        if (GUILayout.Button("测试点击"))
        {
            Debug.Log("测试点击");
        }

        开始横向排列绘制
        EditorGUILayout.BeginHorizontal();

        GUILayout.Button("再来个按钮");
        GUILayout.Button("再来个按钮");

        结束横向排列绘制
        EditorGUILayout.EndHorizontal();

        

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;[CustomEditor(typeof(Player))]
//外挂的脚本因为存储在Editor目录下,所以不会被打入最终的游戏包
//不继承自Mono,而是继承自Editor
public class PlayerEditor : Editor
{//获得到需要编辑显示的组件private Player _Component;//当关联组件所在对象被添加或选中时调用private void OnEnable(){_CompOnent= target as Player;}//当关联组件所在对象被删除或取消时调用private void OnDisable(){_CompOnent= null;}//用于绘制检视面板的生命周期函数public override void OnInspectorGUI(){//标题显示EditorGUILayout.LabelField("人物相关属性");_Component.ID = EditorGUILayout.IntField("玩家ID", _Component.ID);//参数4:是否可以将场景中的对象拖给这个成员变量_Component.Weapon = EditorGUILayout.ObjectField("持有武器", _Component.Weapon, typeof(GameObject), true) as GameObject;//纹理_Component.Cloth = EditorGUILayout.ObjectField("衣服材质贴图", _Component.Cloth, typeof(Texture), false) as Texture;//单选枚举(标题, 组件上的原始值)_Component.Pro = (PlayerProfression)EditorGUILayout.EnumPopup("玩家职业", _Component.Pro);//多选枚举(标题, 组件上的原始值)_Component.LoveColor = (PlayerLoveColor)EditorGUILayout.EnumFlagsField("玩家喜欢的颜色", _Component.LoveColor);终极数据类型绘制//更新可序列化数据serializedObject.Update();//通过成员变量名找到组件上的成员变量SerializedProperty sp = serializedObject.FindProperty("Items");//可序列化数据绘制(取到的数据,标题,是否将所有获得的序列化数据显示出来)EditorGUILayout.PropertyField(sp, new GUIContent("道具信息"), true);//将修改的数据,写入到可序列化的原始数据中serializedObject.ApplyModifiedProperties();滑动条绘制//滑动条显示(1.标题,2.原始变量,最小值,最大值)_Component.Atk = EditorGUILayout.Slider(new GUIContent("玩家攻击力"), _Component.Atk, 0, 100);if (_Component.Atk > 80){//显示消息框(红色)EditorGUILayout.HelpBox("攻击力太高了", MessageType.Error);}if (_Component.Atk <20){//显示消息框(黄色)EditorGUILayout.HelpBox("攻击力太低了", MessageType.Warning);}//按钮显示和元素排列//(按钮是否被按下)显示按钮(按钮名称)GUILayout.Button("来个按钮");GUILayout.Button("来个按钮");if (GUILayout.Button("测试点击")){Debug.Log("测试点击");}//开始横向排列绘制EditorGUILayout.BeginHorizontal();GUILayout.Button("再来个按钮");GUILayout.Button("再来个按钮");//结束横向排列绘制EditorGUILayout.EndHorizontal();}
}


推荐阅读
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
author-avatar
uai_128366833952
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有