Unity 编辑器扩展 Chapter2—Gizmos

二. 使用Gizoms绘制网格及矩阵转换使用
1. 创建Leve类,作为场景控制类:
using UnityEngine;
//使用namespace方便脚本管理
namespace RunAndJump {
//使用部分类partial将类依据不同的功能分布到各个文件中,便于功能区分个管理
public partial class Level : MonoBehaviour {
[SerializeField]
public int _totalTime = ;
[SerializeField]
private float _gravity = -;
[SerializeField]
private AudioClip _bgm;
[SerializeField]
private Sprite _background; [SerializeField]
private int _totalColumns = ; [SerializeField]
private int _totalRows = ; public const float GridSize = 1.28f; private readonly Color _normalColor = Color.grey;
private readonly Color _selectedColor = Color.yellow;
public int TotalTime {
get { return _totalTime; }
set { _totalTime = value; }
} public float Gravity {
get { return _gravity; }
set { _gravity = value; }
} public AudioClip Bgm {
get { return _bgm;}
set { _bgm = value; }
} public Sprite Background {
get { return _background; }
set { _background = value; }
} public int TotalColumns
{
get
{
return _totalColumns;
} set
{
_totalColumns = value;
}
} public int TotalRows
{
get
{
return _totalRows;
} set
{
_totalRows = value;
}
} //绘制边界
private void GridFrameGizmo(int cols, int rows)
{
Gizmos.DrawLine(new Vector3(,,),new Vector3(,rows*GridSize,) );
Gizmos.DrawLine(new Vector3(, , ), new Vector3(cols*GridSize,, ));
Gizmos.DrawLine(new Vector3(cols*GridSize, , ), new Vector3(cols*GridSize, rows * GridSize, ));
Gizmos.DrawLine(new Vector3(, rows*GridSize, ), new Vector3(cols*GridSize, rows * GridSize, ));
} //绘制内部线条
private void GridGizmos(int cols, int rows)
{
for (int i = ; i < cols; i++)
{
Gizmos.DrawLine(new Vector3(i*GridSize,,),new Vector3(i*GridSize,rows*GridSize,) );
} for (int j = ; j < rows; j++)
{
Gizmos.DrawLine(new Vector3(,j * GridSize, ), new Vector3(cols * GridSize, j * GridSize, ));
}
} //D使用unity默认的OnDrawGizmos方法来绘制Gzimos
private void OnDrawGizmos()
{
Color oldColor = Gizmos.color;//修改的这些属性都是静态属性,所以要在修改前保存其值,修改后再复原,防止后续使用该静态属性是修改后的
Matrix4x4 oldMatrix = Gizmos.matrix;//修改的这些属性都是静态属性,所以要在修改前保存其值,修改后再复原,防止后续使用该静态属性是修改后的
Gizmos.matrix = transform.localToWorldMatrix;//该语句可以为gizmos提供该transform位移,旋转,缩放等特性 Gizmos.color = _normalColor;
GridGizmos(_totalColumns,_totalRows);
GridFrameGizmo(_totalColumns,_totalRows); Gizmos.color = oldColor;//恢复修改后的静态属性
Gizmos.matrix = oldMatrix;//恢复修改后的静态属性
} private void OnDrawGizmosSelected()
{
Color oldColor = Gizmos.color;
Matrix4x4 oldMatrix = Gizmos.matrix;
Gizmos.matrix = transform.localToWorldMatrix; Gizmos.color = _selectedColor;
GridFrameGizmo(_totalColumns, _totalRows); Gizmos.color = oldColor;
Gizmos.matrix = oldMatrix; } /// <summary>
/// 将世界坐标转换为grid网格中的点坐标
/// </summary>
/// <param name="point">世界坐标</param>
/// <returns></returns>
public Vector3 WordToGridCoordinates(Vector3 point)
{
Vector3 gridPoint=new Vector3((int)((point.x-transform.position.x)/GridSize),(int)((point.y-transform.position.y)/GridSize),0.0f);
return gridPoint;
} /// <summary>
/// Grid网格中的位置转换为世界坐标坐标
/// </summary>
/// <param name="col">行值</param>
/// <param name="row">列值</param>
/// <returns></returns>
public Vector3 GridToWordCoordinates(int col,int row)
{
Vector3 wordPoint=new Vector3(transform.position.x+(col*GridSize/2.0f),transform.position.y+(row*GridSize/2.0f),0.0f);
return wordPoint;
}
/// <summary>
/// 坐标位置是否在网格边界内
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
public bool IsInsideGridBounds(Vector3 point)
{
float minX = transform.position.x;
float maxX = minX + _totalColumns*GridSize;
float minY = transform.position.y;
float maxY = minY + _totalRows*GridSize;
return (point.x >= minX && point.x <= maxX && point.y >= minY && point.y <= maxY);
} /// <summary>
/// 坐标位置是否在网格边界内
/// </summary>
/// <param name="point"></param>
/// <returns></returns> public bool IsInsideGridBounds(int col,int row)
{
return (col>=&&col<_totalColumns&&row>=&&row<=_totalRows);
}
}
}
2. 创建EditorUtil类,作为辅助工具类:
using UnityEngine;
using System.Collections;
using UnityEditor;
using UnityEditor.SceneManagement; namespace RunAndJump.LevelCreator //为防止类名冲突,使用namespace时一个好的解决方案
{
public class EditorUtil
{ //创建新场景
public static void NewScene()
{
//该方法后续过时,被下面方法替代:EditorApplication.SaveCurrentSceneIfUserWantsTo();
EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo();//当前场景有未保存的东西是,弹出对话框提醒是否保存当前场景
//该方法后续过时,被下面方法替代:EditorApplication.NewScene();
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
} //清空场景
public static void CleanScene()
{
GameObject[] allObjects = Object.FindObjectsOfType<GameObject>(); foreach (GameObject go in allObjects)
{
GameObject.DestroyImmediate(go);
}
} //创建新关卡
public static void NewLevel()
{
NewScene();
CleanScene(); //可以在创建新关卡时添加上必要的游戏对象
//add something... GameObject levelGo = new GameObject("Level");
levelGo.transform.position=Vector3.zero;
levelGo.AddComponent<Level>(); }
}
}
3. 创建MenuItems类,作为编辑器菜单工具类:
using UnityEngine;
using System.Collections;
using UnityEditor; namespace RunAndJump.LevelCreator
{ //菜单项管理类,用来控制扩展方法在菜单项中显示
public class MenuItems
{
[MenuItem("Tools/LevelCreator/NewLevelScene %q") ]
private static void NewLevel()
{
EditorUtil.NewLevel();
}
}
}
4. 创建SnapToGridTest类,用来测试Leve类中方法:
using UnityEngine;
using System.Collections;
using RunAndJump; [ExecuteInEditMode]//在editor场景模式下不用运行就调用
public class SnapToGridTest : MonoBehaviour { // Update is called once per frame
void Update ()
{
print(name+" in level");
Vector3 gridCoord = Level.Instance.WordToGridCoordinates(transform.position);
transform.position = Level.Instance.GridToWordCoordinates((int) gridCoord.x, (int) gridCoord.y);
} private void OnDrawGizmos()
{
print("gizoms");
Color oldColor = Gizmos.color;
Gizmos.color = (Level.Instance.IsInsideGridBounds(transform.position)) ? Color.green : Color.red;
Gizmos.DrawCube(transform.position,Vector3.one*Level.GridSize);
Gizmos.color = oldColor;
}
}
效果:
我们通过MenuItems创建的菜单调用EditorUtil中创建场景的方法,场景中在OnDrawGizoms方法中绘制出自己的网格。现在创建一个空物体为其绑上SnapToGridTest脚本用来验证level中用来对齐坐标到网格和验证是否出界的方法。

Unity 编辑器扩展 Chapter2—Gizmos的更多相关文章
- unity 编辑器扩展简单入门
unity 编辑器扩展简单入门 通过使用编辑器扩展,我们可以对一些机械的操作实现自动化,而不用使用额外的环境,将工具与开发环境融为一体:并且,编辑器扩展也提供GUI库,来实现可视化操作:编辑器扩展甚至 ...
- Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据
Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject Unity编辑器扩展 Chapt ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- Unity编辑器扩展Texture显示选择框
学习NGUI插件的时候,突然间有一个问题为什么它这些属性可以通过弹出窗口来选中呢? 而我自己写的组件只能使用手动拖放的方式=.=. Unity开发了组件Inspector视图扩展API,如果我们要写插 ...
- Unity 编辑器扩展
自定义检视面板的使用: 先是定义一个脚本文件,我们来修饰它的检视面板: [HelpURL("http://www.baidu.com")] public class Atr : M ...
- Unity 编辑器扩展 场景视图内控制对象
http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...
- Unity编辑器扩展
在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...
- unity编辑器扩展学习
扩展编辑器实际上就是在unity菜单栏中添加一些按钮,可以一键执行一些重复性的工作. 一.添加按钮 1.简单使用MenuItem特性 using UnityEngine; using UnityEdi ...
- Unity 编辑器扩展自定义窗体
这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using Un ...
随机推荐
- Week7:SVM难点记录
1.函数dataset3Params(),如何计算模型估计偏差的? model=svmTrain(X,y,c_array,@(x1,x2)gaussianKernel(x1,x2,sigma_arra ...
- cocos2d-x开发:服务端基础库封装
元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...
- cocos2d-x3.0 用CCDictionary写文件
bool CDownLoad_LocalData::WriteToConfigFile( DownLoadLocalData* downdata ){ CCDictionary* pDict = CC ...
- 身份认证系统(二)多WEB应用的单点登录
随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...
- [USACO15DEC]最大流Max Flow(树链剖分,线段树)
FJ给他的牛棚的N(2≤N≤50,000)个隔间之间安装了N-1根管道,隔间编号从1到N.所有隔间都被管道连通了. FJ有K(1≤K≤100,000)条运输牛奶的路线,第i条路线从隔间si运输到隔间t ...
- 随机获取指定范围内N个不重复数字
/// <summary> /// 随机获取指定范围内N个不重复数字 /// </summary> /// <param name="min"> ...
- c# Reverse()的两点用法
Rervese的基本用途是:反转数组中元素的顺序,常见的两种用法如下: 1.void Array.Reverse(Array array) static void Main(string[] args ...
- ionic ios 打包 真机测试常见问题
1.ionic 项目在windows下正常打包安卓包时 迁移到mac下打包ios时 不需要复制平台目录platforms即可 不用再mac下去安装各种插件信息 2.ionic 下不能访问api信 ...
- 基于 HTML5 Canvas 的 Web SCADA 组态电机控制面板
前言 HT For Web 提供完整的基于 HTML5 图形界面组件库.您可以轻松构建现代化的,跨桌面和移动终端的企业应用,无需担忧跨平台兼容性,及触屏手势交互等棘手问题.也可用于快速创建和部署,高度 ...
- daterangepicker的个性化使用技巧
由于该模板不自动将时间戳添加到input中去,始终为NaN,所以,自己选取起始时间与截止时间 var startTime =new Date(new Date().toLocaleDateString ...