[Unity]自定义地图编辑器(Scene视图下,EditorWindow的简单应用)

最近的游戏又很多关卡需要配置(XML保存),给策划写了个非常简单的编辑器,记录下+废话下
1:Editor下打开新窗口需要继承EditorWindow,然后使用获取窗口即可,注意放在Editor文件夹下
1 public class DrawGameLevel : EditorWindow
2 {
3 [MenuItem("Maps/Creater %M")]//后面快捷键
4 public static void OpenMapCreate()
5 {
6 DrawGameLevel window = EditorWindow.GetWindow<DrawGameLevel>("地图编辑器");
7 window.Show();
8 window.minSize = new Vector2(400, 800);//设置最大和最小
9 window.maxSize = new Vector2(400, 1200);
10 }
11 }
2:因为是在Scene视图下进行操作,所以注册SceneView.duringSceneGui事件,在OnEnable中
1 void OnEnable()
2 {
3 SceneView.duringSceneGui += OnSceneGUI;
4 //初始化一些东西
5 }
6
7 void OnDestroy()
8 {
9 SceneView.duringSceneGui -= OnSceneGUI;
10 }
3:接着编写OnSceneGUI,这里首先会替换掉Scene视图以前的响应事件(就是说在Scene中点击预制体不再会选择它了),然后发射射线检测要绘制的地图,射线是必须要有碰撞体的,所以在场景中预先准备一个Plane,正对着屏幕,只有射线碰撞到了Plane才会进行绘制
1 private bool _drag = false;
2 void OnSceneGUI(SceneView sceneView)
3 {
4 HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));//为scene响应添加默认事件,用来屏蔽以前的点击选中物体
5 if (Event.current.type == EventType.MouseDown && Event.current.button == 0)//点击
6 {
7 }
8 else if (Event.current.type == EventType.MouseUp && Event.current.button == 0)//抬起
9 {
10 if (!_drag)
11 {
12 OnMouseEvent();
13 }
14
15 _drag = false;
16 }
17 else if (Event.current.type == EventType.MouseDrag && Event.current.button == 0)//拖动
18 {
19 OnMouseEvent();
20 _drag = true;
21 }
22 }
23
24 private void OnMouseEvent()
25 {
26 Vector2 mousePos = Event.current.mousePosition;//获取鼠标坐标
27 mousePos.y = Camera.current.pixelHeight - mousePos.y;//这里的鼠标原点在左上,而屏幕空间原点左下,翻转它
28 //mousePos.y = (float)Screen.height - mousePos.y - 40f;这种写法也成
29 Ray ray = Camera.current.ScreenPointToRay(mousePos);
30 RaycastHit rh;
31 if (Physics.Raycast(ray, out rh, 3000f))
32 {
33 //判断是否射到了plane,是的话进行操作便是
34 }
35 }
4:Scene视图的处理结束,接着继续绘制EditorWindow,在OnGUI中绘制
1 string maxRow = String.Empty;
2 string maxCol = string.Empty;
3 private int _select = 0;
4 private Texture[] _items = new Texture[12];
5 void OnGUI()
6 {
7 maxRow = EditorGUILayout.TextField("Row(最大行数)", maxRow);
8 maxCol = EditorGUILayout.TextField("Col(最大列数)", maxCol);
9 if (GUILayout.Button("开始绘画"))
10 {
11 //按钮操作
12 }
13 if (GUILayout.Button("尝试读取关卡"))
14 {
15 EditorUtility.DisplayDialog("读取失败", "配置文件不存在或者关卡不存在\n读取失败,尝试读取关卡为:" + _levelNum + "\n请检查配置文件", "好的");//这个方法可以弹出确认框,返回bool
16 }
17 EditorGUILayout.BeginHorizontal("box");
18 int sizeY = 100 * Mathf.CeilToInt(_items.Length / 4f);
19 _select = GUI.SelectionGrid(new Rect(new Vector2(0, 155), new Vector2(100 * 4, sizeY)), _select, _items, 4);//可以给出grid选择框,需要传入贴图数组_items
20 }
5:已经结束了,怎么绘制上去的?OnMouseEvent()中发现点击到了,AssetDataBase.Load生成prefab上去就行,而传入Grid中的Texture,可以使用AssetPreview.GetAssetPreview(AssetDatabase.LoadAssetAtPath<Object>("path.png")) as Texture;来获取到预览图
最后保存可以自己写正反解析xml,也可以直接把场景内绘制好的拖成预制体
主要关注的就是 阻止Scene事件,Scene射线,获取预览
以上~废话结束
[Unity]自定义地图编辑器(Scene视图下,EditorWindow的简单应用)的更多相关文章
- C#开发Unity游戏教程之Scene视图与脚本的使用
C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发者开发游戏时,操作最频繁的视图.因为一旦一个游戏对象被添加到游戏的场景中,就需要首先使 ...
- 【Unity入门】编辑器常用视图介绍
版权声明:本文为博主原创文章,转载请注明出处. 打开Unity编辑器的主窗口,在窗口的右上角可以看到有个“Layout”按钮.这是用来对Unity编辑器主窗口上面的各个窗口面板进行布局的.通常情况下我 ...
- Unity Scene视图下 输出物体坐标等信息
using UnityEditor; using UnityEngine; [CustomEditor(typeof(GameObject))] public class MyEditor : Edi ...
- unity, scene视图查看场景时应调成正交模式
scene视图查看场景时应调成正交模式,以避免稍微滑动滚轮就导致视角过远或过近.
- (转)Unity笔记之编辑器(UnityEditor)
在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简 ...
- (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译
Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...
- Unity3D研究院之拓展Scene视图
Scene视图是编辑游戏模型的地方,其实它还可以进行编辑.如下图所示,我给Scene视图做了简单的编辑. Scene视图的拓展是基于对象的,意思就是你必须在Hierarchy视图中选择一个对象才行.H ...
- 在Unity中用UGUI制作可输入下拉框
Unity中UGUI制作可输入下拉框 目录 Unity中UGUI制作可输入下拉框 前言 组件分析 制作流程 总结 前言 在搜索引擎以及一些网页中我们常常可以看见这样一种UI控件,看上去是一个输入框,在 ...
- 用HMS Core地图服务自定义地图样式,给你的应用制作专属个性化地图
不同行业的开发者对地图样式的展示需求差异很大.例如,物流类应用希望地图样式简洁一些,重点突出城市分布和快递路径:AR游戏类应用中的地图色彩需要和游戏UI适配,做的更酷炫一些:景区导览应用中的地图样式要 ...
- Tiled Map地图编辑器键盘快捷键
Tiled是款不错的地图编辑器,不过快捷键真是隐蔽啊,不看github上得wiki根本不知道,用的过程中查英文文档总是觉得慢,所以翻译成了中文. 通用 右键点击图块(tile):复制图块到图章刷(拖动 ...
随机推荐
- 为 ASPNETCORE 7 项目添加 Serilog
本文将介绍如何为 ASP.NET Core 项目添加 Serilog. 添加 Serilog 首先,我们需要在项目中添加 Serilog 的 NuGet 包. dotnet add package S ...
- [编程基础] Python随机数生成模块总结
Python随机数生成模块教程演示如何在Python中生成伪随机数. 1 介绍 1.1 随机数字生成器 随机数生成器(RNG)生成一组在外观上不显示任何可区分模式的值.随机数生成器分为两类:硬件随机数 ...
- [OpenCV实战]3 透明斗篷
目录 1寻找和存储背景帧 2红色区域检测 3提取红色区域 4背景帧红布区域替换当前帧红布区域. 5工程代码 参考 弄出哈利波特电影里一样效果的透明斗篷.也就是一个视频里,将红布弄成透明.类似下面的效果 ...
- B站地区限制破解方法
B站地区限制破解方法 当我们观看bilibili番剧时,经常会看到"仅限港澳台地区"的字样.那么,有没有一种方法,不需要挂梯子,就可以观看这些被限制的番剧呢? 本教程只适用于bil ...
- VMware Workstation Pro 16安装CentOS7超详细图文步骤
安装的需要 VMware官方网站安装VMware Workstation Pro 16: https://download3.vmware.com/software/wkst/file/VMware- ...
- 一站式云原生体验|龙蜥云原生ACNS + Rainbond
关于 ACNS 龙蜥云原生套件 OpenAnolis Cloud Native Suite(ACNS)是由龙蜥社区云原生 SIG 推出的基于 Kubernetes 发行版本为基础而集成的套件能力,可以 ...
- 图文并茂Windows系统使用XAMPP搭建本地mysql数据库导入数据库并使用node.js访问数据库
点击下载XAMPP 点击启动Apache和Mysql 如果出现这种报错,修改配置文件,一般出现这种情况是因为端口占用 再次尝试START, 成功啦~~ 接下来我们准备一份写好的SQL 文件 输入如下命 ...
- Android第五次作业
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- drf-认证、权限、频率、过滤、排序、分页
1.认证组件 1.1 局部认证 1.首先写两个接口,一个查询单个一个查询所有,我们利用视图扩展类和视图子类写在一个视图类上: views.py: from rest_framework.viewset ...
- 华为云发布分布式编译构建系统CodeArts Build
摘要:2月14日,华为云发布分布式编译构建系统CodeArts Build,旨在支撑企业实现高效的软件开发,缩短产品上市周期,帮助企业的软件产品快速形成关键竞争力. 本文分享自华为云社区<唯快不 ...