[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):复制图块到图章刷(拖动 ...
随机推荐
- Hadoop详解(03)-Hadoop编译源码-了解
Hadoop详解(03)-Hadoop编译源码-了解 准备工作 CentOS联网 配置CentOS能连接外网.Linux虚拟机ping www.baidu.com 是畅通的 jar包准备(hadoop ...
- ios网络协议从http变成https
最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...
- SwiftUI(一)
macOS 11.4 Xcode 12.5.1 1.新建工程,创建一个swiftui文件 2.创建后有些画布是在下面显示的 3.先来看下效果图 4. CardImageView.swi ...
- 打包iOS App并上架到TestFlight测试
开发者账号 首先需要注册一个开发者账号,不然什么都免谈.在手机Apple Developer上注册给钱就行了,个人开发者一年688元. 打包App App开发好后,就可以通过XCode打包.打包前选好 ...
- 反射_Class对象功能概述-反射_Class对象功能_获取Field
反射_Class对象功能概述 * Class对象功能: * 获取功能: 1. 获取成员变量们 * Field[] getFields() :获取所有public修饰的成员变量 * Field getF ...
- 如何通过Java代码向Word文档添加文档属性
Word文档属性包括常规.摘要.统计.内容.自定义.其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目.属性相当于文档的名片,可以添加你想要的注释.说明等.还可以标注版权. 今天就为大 ...
- postgresql添加mysql_fdw测试过程
请先确认已经安装好mysql_fdw,如果没有配置好点这:https://www.cnblogs.com/ohsolong/p/13041989.html 1.切换至postgres用户,输入密码登录 ...
- springboot跨域解决
package com.xf.config; import java.io.IOException; import javax.servlet.Filter; import javax.servlet ...
- Vue02 Node下载安装
转 https://blog.csdn.net/A_awen/article/details/121952701 1 下载 https://nodejs.org/en/download/ 2 安装 全 ...
- session实现servlet数据共享
为了满足老师考试要求,要实现数据共享,要实现顾客登录的功能,登录后进行增删改查要对该顾客进行操作,所以需要将该顾客的一些信息共享给其他操作,找了一些资料,来通过session实现: 首先,设置: Ht ...