最近的游戏又很多关卡需要配置(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的简单应用)的更多相关文章

  1. C#开发Unity游戏教程之Scene视图与脚本的使用

    C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发者开发游戏时,操作最频繁的视图.因为一旦一个游戏对象被添加到游戏的场景中,就需要首先使 ...

  2. 【Unity入门】编辑器常用视图介绍

    版权声明:本文为博主原创文章,转载请注明出处. 打开Unity编辑器的主窗口,在窗口的右上角可以看到有个“Layout”按钮.这是用来对Unity编辑器主窗口上面的各个窗口面板进行布局的.通常情况下我 ...

  3. Unity Scene视图下 输出物体坐标等信息

    using UnityEditor; using UnityEngine; [CustomEditor(typeof(GameObject))] public class MyEditor : Edi ...

  4. unity, scene视图查看场景时应调成正交模式

    scene视图查看场景时应调成正交模式,以避免稍微滑动滚轮就导致视角过远或过近.

  5. (转)Unity笔记之编辑器(UnityEditor)

    在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简 ...

  6. (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译

    Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...

  7. Unity3D研究院之拓展Scene视图

    Scene视图是编辑游戏模型的地方,其实它还可以进行编辑.如下图所示,我给Scene视图做了简单的编辑. Scene视图的拓展是基于对象的,意思就是你必须在Hierarchy视图中选择一个对象才行.H ...

  8. 在Unity中用UGUI制作可输入下拉框

    Unity中UGUI制作可输入下拉框 目录 Unity中UGUI制作可输入下拉框 前言 组件分析 制作流程 总结 前言 在搜索引擎以及一些网页中我们常常可以看见这样一种UI控件,看上去是一个输入框,在 ...

  9. 用HMS Core地图服务自定义地图样式,给你的应用制作专属个性化地图

    不同行业的开发者对地图样式的展示需求差异很大.例如,物流类应用希望地图样式简洁一些,重点突出城市分布和快递路径:AR游戏类应用中的地图色彩需要和游戏UI适配,做的更酷炫一些:景区导览应用中的地图样式要 ...

  10. Tiled Map地图编辑器键盘快捷键

    Tiled是款不错的地图编辑器,不过快捷键真是隐蔽啊,不看github上得wiki根本不知道,用的过程中查英文文档总是觉得慢,所以翻译成了中文. 通用 右键点击图块(tile):复制图块到图章刷(拖动 ...

随机推荐

  1. [OpenCV实战]49 对极几何与立体视觉初探

    本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...

  2. ActiveMQ 常见集群模式

    Master Slave 架构模式 这种模式是基于文件共享锁的高可用集群,个人理解其实是一种 Failover 模式,可以是一主一从,也可以是一主两从. 本文使用 Docker 搭建一个主从模式的 A ...

  3. ES中的内置对象--jquery如何优化代码,少用$进行查找,减少查找次数的方法

  4. 关于integer数据对比的问题

    先看案例 Integer c1 = 127; Integer c2 = 127; c1 == c2; //true Integer d1 = 128; Integer d2 = 128; d1 == ...

  5. 云服务器安装Mysql之后,设置可以进行远程连接,Duplicaticate wntry '%-root' for key 'PRIMARY

    云服务器安装Mysql之后,设置可以进行远程连接 1.首先连接mysql mysql -u root -p 2.MySql5版本 GRANT ALL ON *.* TO root@'%' IDENTI ...

  6. Vue3 企业级优雅实战 - 组件库框架 - 10 实现组件库 cli - 下

    上文创建了一堆 utils.component-info,并实现了新组件模块相关目录和文件的创建.本文继续实现后面的内容. 1 组件样式文件并导入 在 src/service 目录中创建 init-s ...

  7. 力扣---1137. 第 N 个泰波那契数

    泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契 ...

  8. 线程基础知识12-AQS

    转:https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html 1 简介 AQS,全称AbstractQueuedSynchronize ...

  9. VUE10 计算属性

    1 Vue计算属性简介 1)定义:我们需要一个属性,但是这个属性不存在,但是可以通过已有的属性计算得来,那么就可以定义一个计算属性. 2)原理:底层借助了Object.defineproperty方法 ...

  10. 工具-使用org.openjdk.jol查看对象在内存中的布局

    1 添加依赖 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core& ...