Unity——外挂编辑器

article/2025/10/5 11:20:52

特殊目录                

        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();}
}


http://chatgpt.dhexx.cn/article/EOb4Sf9c.shtml

相关文章

暗黑如何修改服务器爆率,暗黑破坏神百倍爆率补丁

这是一个《暗黑破坏神》百倍爆率补丁&#xff0c;暗黑破坏神2是一支动作RPG游戏&#xff0c; 但却不同于别类的动作游戏。首先&#xff0c;所有主角的动作操控&#xff0c;以及界面的设定&#xff0c;全部均可由一支鼠标负责&#xff0c;简易的操控是游戏的第一个特色。第二个特…

按键精灵-暗黑破坏神(野蛮人自动)

组合脚本: 鼠标右键一直按下释放技能1,2,3 下面是释放技能1,2,3, 因为我的4技能是救命用的, 就不一直点了 以下是按键精灵录制的内容 Delay 303 KeyDown "1", 1 Delay 78 KeyDown "2", 1 Delay 80 KeyDown "3", 1 Delay 49 KeyUp "1"…

unity3D游戏制作—暗黑战神DarkGod

前言 这段时间&#xff0c;用unity尝试制作了一款3D网游&#xff0c;用这篇博客记录这一阶段的学习成果&#xff0c;做个总结。有不对的地方也欢迎大家指正~~ 一、技术需求 此游戏是在Unity2017.3.1上开发出来的&#xff0c;Unity2017.3.1可以支持2D、3D场景的编辑&#xff…

DB破解(暗黑破坏神辅助)使用方法

下载网址:http://www.mochafuzhu.com/forum.php?mod=forumdisplay&fid=57 开始请先在网站里下载运行环境并安装,然后下载辅助。(Q群:528411948) 1、首先,一定要先 启动游戏,注意!辅助的路径千万不要有中文的目录,否则会造成辅助自动退出的问题。然后解压下载好…

Hacking Diablo II之外挂的工作原理

这一篇介绍外挂的工作原理。如果对外挂是怎么工作的没有一个大概的了解的话&#xff0c;那这一系列文章只能当故事看了。 如下图所示&#xff0c;大方框表示Diablo II.exe的进程空间&#xff0c;框内左侧的虚线表示游戏的主线程循环。游戏主线程循环所做的工作大约有&#xff…

Kratos技术系列|从Kratos设计看Go微服务工程实践

转载地址&#xff1a;https://mp.weixin.qq.com/s/D8py9Ia1KVoPZP-RCfwkgQ 在Kratos中&#xff0c;API定义、gRPC Service、HTTP Service、请求参数校验、错误定义、Swagger API json、应用服务模版等都是基于Protobuf IDL来构建的&#xff1a; 举一个简单的helloworld.proto例…

【kratos入门实战教程】2-实现注册登陆业务

1、系列目录 【kratos入门实战教程】0-商城项目介绍【kratos入门实战教程】1-kratos项目搭建和开发环境配置【kratos入门实战教程】2-实现注册登陆业务 2、概览 通过本篇文章&#xff0c;读者将会掌握kratos的一般开发流程&#xff0c;涵盖了从接口定义、自定义配置&#xff0…

golang 比较完美的通用框架,kratos v2.0 学习,一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。涵盖了互联网开发的常用功能模块的开发库。

目录 前言1&#xff0c;关于kratos v2.02&#xff0c;Principles 原则2&#xff0c;Features 特色3&#xff0c;Architecture 架构4&#xff0c;总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/120464687 未经博主允许不得转载。 博主地址是&…

Kratos战神微服务框架(二)

Kratos战神微服务框架&#xff08;二&#xff09; 目录 Kratos战神微服务框架&#xff08;二&#xff09;项目结构api编写protobuf编写使用makefileservice层接口实现biz层data层configs配置文件 项目结构 api编写 protobuf编写 syntax "proto3"; package realwor…

kratos项目启动笔记

项目启动笔记 1、git clone git地址 2、kratos run&#xff0c;启动成功后如下图 3、假如运行2错误提示如下&#xff1a; 解决方案&#xff1a; 1.在终端中运行go env查看GO111MODULE 的值 如果不为on&#xff0c;则需要开启GO111MODULE 开启命令&#xff1a;go env -w GO1…

新平台架构的解决方案,使用kratos快速搭建系统服务,做好分布式集群,找大一个哥们写的一系列文章,非常不错赶紧学习下。

目录 前言1&#xff0c;关于kratos2&#xff0c;相关文档 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109504012 未经博主允许不得转载。 博主地址是&#xff1a;http://blog.csdn.net/freewebsys 1&#xff0c;关于kratos https://pandayche…

Ory Kratos 用户认证

Ory Kratos 为用户认证与管理系统。本文将动手实现浏览器&#xff08;ReactAntD&#xff09;的完整流程&#xff0c;实际了解下它的 API 。 代码: https://github.com/ikuokuo/start-ory-kratos 了解 Kratos 获取代码 git clone -b v0.7.0-alpha.1 --depth 1 https://githu…

go微服务框架kratos 安装及使用

windows: 代理和mod 设置 set GO111MODULEonset GOPROXYhttps://goproxy.cn/ 安装protobuf库文件 go get -u github.com/golang/protobuf/proto 安装goprotobuf插件 go install github.com/golang/protobuf/protoc-gen-golatest 安装gogoprotobuf插件和依赖 go install gith…

go用户中心kratos

用户中心kratos kratos介绍 ORY Kratos是根据云架构最佳实践构建的API优先身份和用户管理系统。它实现了几乎每个软件应用程序都需要处理的核心用例&#xff1a; 自助登录和注册:允许最终用户使用用户名/电子邮件和密码组合,社交登录(使用Google&#xff0c;GitHub登录),无密码…

Kratos 集成Gin

Kratos 集成 Gin 规范项目分层处理请求处理、响应编写路由routeKratos 集成gin注入 wire set中 源码 Kratos 可以在 .proto文件定义请求类型&#xff0c;URL&#xff0c;响应等等&#xff0c;如官方示例&#xff1a; service BlogService {rpc CreateArticle (CreateArticleRe…

kratos mysql_Kratos--安装及配置

安装GO环境 安装protoc以及相关的包和插件 安装Kratos Go version>1.12 and GO111MODULEon go get -u github.com/bilibili/kratos/tool/kratos 提示&#xff1a;安装过程中可能会出现部分包下载失败&#xff0c;可以手动下载包然后拷贝至相应文件目录。 快速开始 cd $GOPAT…

初识go-kratos

推荐看一下 Kratos 官方文档 更加流畅观看此文章&#xff0c;本机器这里已经安装好了 kratos、proto、wire、make 等所需的命令工具 1.先下载beer-shop模板 git clone https://github.com/go-kratos/beer-shop.git 2.删除api和app下的全部文件 3.修改go.mod文件 把module g…

kratos mysql_kratos微服务框架学习笔记一(kratos-demo)

本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了&#xff0c;没怎么更博和github&#xff0c;现在开发任务也差不多完成…

Kratos日志

一.如何在kratos框架中使用 参考官方文档中描述&#xff0c;为了方便业务自适配不同的 log 接入使用&#xff0c;Logger 只包含了最简单的 Log 接口。当业务需要在 Kratos 框架内部使用自定义的 log的时候&#xff0c;只需要简单实现方法即可。日志库较为公用建议放在kit基础库…

kratos框架学习,在Linux 下面使用kratos 创建demo 项目然后跑起来。使用 kratos new kratos-demo 一键创建项目,脚手架非常方便。但是依赖grpc没有起来

目录 前言1&#xff0c;关于kratos2&#xff0c;使用 kratos new kratos-demo 一键创建项目3&#xff0c;解决gRPC 编译问题4&#xff0c;只创建HTTP服务 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109139648 未经博主允许不得转载。 博主地址…