最近的游戏又很多关卡需要配置(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. Hadoop详解(03)-Hadoop编译源码-了解

    Hadoop详解(03)-Hadoop编译源码-了解 准备工作 CentOS联网 配置CentOS能连接外网.Linux虚拟机ping www.baidu.com 是畅通的 jar包准备(hadoop ...

  2. ios网络协议从http变成https

    最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...

  3. SwiftUI(一)

    macOS 11.4 Xcode 12.5.1 1.新建工程,创建一个swiftui文件   2.创建后有些画布是在下面显示的     3.先来看下效果图   4. CardImageView.swi ...

  4. 打包iOS App并上架到TestFlight测试

    开发者账号 首先需要注册一个开发者账号,不然什么都免谈.在手机Apple Developer上注册给钱就行了,个人开发者一年688元. 打包App App开发好后,就可以通过XCode打包.打包前选好 ...

  5. 反射_Class对象功能概述-反射_Class对象功能_获取Field

    反射_Class对象功能概述 * Class对象功能: * 获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getF ...

  6. 如何通过Java代码向Word文档添加文档属性

    Word文档属性包括常规.摘要.统计.内容.自定义.其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目.属性相当于文档的名片,可以添加你想要的注释.说明等.还可以标注版权. 今天就为大 ...

  7. postgresql添加mysql_fdw测试过程

    请先确认已经安装好mysql_fdw,如果没有配置好点这:https://www.cnblogs.com/ohsolong/p/13041989.html 1.切换至postgres用户,输入密码登录 ...

  8. springboot跨域解决

    package com.xf.config; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...

  9. Vue02 Node下载安装

    转 https://blog.csdn.net/A_awen/article/details/121952701 1 下载 https://nodejs.org/en/download/ 2 安装 全 ...

  10. session实现servlet数据共享

    为了满足老师考试要求,要实现数据共享,要实现顾客登录的功能,登录后进行增删改查要对该顾客进行操作,所以需要将该顾客的一些信息共享给其他操作,找了一些资料,来通过session实现: 首先,设置: Ht ...