有时候需要在Scene视图中绘制一些辅助线,方便进行一些编辑的工作,可以通过如下类和函数完成:

  绘制辅助线,相关类:

  Gizmos类:用于在Scene视图中绘制调试信息或辅助线,这些辅助线只有在Scene中能看到,Game视图中看不到。

  Handles类:绘制各种东西,可以绘制一些3D gizmo、2D GUI、进行坐标系统转换等。

  相关函数(MonoBehaviour类):

  OnDrawGizmos:每帧调用,所绘gizmos可用于对对应物体拾取选中;

  OnDrawGizmosSelected :在物体被选中时绘制。

  下面的代码用于绘制一个Sphere的辅助线:

using UnityEngine;
using System.Collections; #if UNITY_EDITOR
using UnityEditor;
#endif public class CylinderHelper : MonoBehaviour
{ public void OnDrawGizmos()
{
Gizmos.color = Color.blue;
Gizmos.DrawSphere(transform.position, 0.3f); #if UNITY_EDITOR
Handles.color = Color.blue;
Handles.ArrowCap(, transform.position, transform.rotation, transform.localScale.z);
Handles.Disc(transform.rotation, transform.position, Vector3.up, transform.localScale.z * 0.5f, false, );
#endif } public void OnDrawGizmosSelected()
{
#if UNITY_EDITOR
Handles.color = new Color(1f, 0f, 0f, 0.2f);
Handles.DrawSolidDisc(transform.position, Vector3.up, transform.localScale.z * 0.5f);
#endif
} }

  未选中和选中的效果图分别如下所示:

未选中:       选中:

  这其中有一个问题值得一提的,看绘制立方体的接口:

  public static void DrawCube(Vector3 center, Vector3 size);

  可以看出参数值传入了位置和缩放,没有旋转参数,也就是该函数不支持旋转,咋办呢,不着急,可以通过设置Gizmos.matrix或Handles.matrix来实现:

public class CubeHelper : MonoBehaviour
{
public void OnDrawGizmos()
{
Gizmos.color = Color.blue;
Gizmos.DrawSphere(transform.position, 0.3f); // 设置旋转矩阵
Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, transform.rotation, Vector3.one);
Gizmos.matrix = transform.localToWorldMatrix;
// 在Local坐标原点绘制标准尺寸的对象
Gizmos.color = new Color(1f, 0f, 0f, 0.8f);
Gizmos.DrawCube(Vector3.zero, Vector3.one);
Gizmos.color = Color.black;
Gizmos.DrawWireCube(Vector3.zero, Vector3.one); #if UNITY_EDITOR
Handles.color = Color.blue;
Handles.ArrowCap(, transform.position, transform.rotation, transform.localScale.x);
#endif
} }

  上面的代码支持Gizmos的旋转,原理很简单,不赘述。

  Handles类也支持手动设置变换矩阵,我们再来看一个稍微复杂点的例子。在使用NavMeshObstacle时,因为阻挡区域是一个圆柱体形状(cylinder),在给这个cylinder绘制辅助线时,最合适的是Handles.CylinderCap函数。但该函数默认绘制的圆柱体和碰撞区域是不吻合的,不只是大小、位置,宁方向都不一致,所以这里面要做一些变换,代码如下所示:

using UnityEngine;
using System.Collections; #if UNITY_EDITOR
using UnityEditor;
#endif // NavMesh阻挡物的绘制
[ExecuteInEditMode]
public class ObstacleHelper : MonoBehaviour
{
private NavMeshObstacle obstacle; void Start()
{
obstacle = transform.GetComponent<NavMeshObstacle>();
} public void OnDrawGizmos()
{
#if UNITY_EDITOR Handles.color = new Color(Color.blue.r, Color.blue.g, Color.blue.b, 0.5f); // 圆柱体网上平移height * 0.5
Vector3 vecUpOffset = transform.TransformDirection(transform.up);
vecUpOffset.Normalize();
vecUpOffset *= obstacle.height * 0.5f * transform.lossyScale.y; // 缩放,只能绘制圆形不能绘制椭圆
Vector3 vecScale = Vector3.one;
vecScale.x = Mathf.Max(transform.lossyScale.x, transform.lossyScale.z);
vecScale.y = vecScale.x;
vecScale.z = transform.lossyScale.y * obstacle.height;
// 乘以碰撞半径
vecScale.x *= obstacle.radius * 2f;
vecScale.y *= obstacle.radius * 2f; // 设置变换矩阵
Matrix4x4 cylinderMatrix = Matrix4x4.TRS(transform.position + vecUpOffset, transform.rotation * Quaternion.Euler(90f, 0f, 0f), vecScale);
Handles.matrix = cylinderMatrix;
Handles.CylinderCap(, Vector3.zero, Quaternion.identity, 1f);
Handles.matrix = Matrix4x4.identity; #endif
} }

  效果图如下所示,辅助线可以自由适应gameobject和Obstacle参数的变化:

        

  上面的代码一眼很难看懂,所以可以逐个变换来理解。

Scene视图辅助线绘制的更多相关文章

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

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

  2. [ios学习笔记之视图、绘制和手势识别]

    一 视图 二 绘制 三 手势 00:31 UIGestureRecognizer 抽象类 两步 1添加识别器(控制器或者视图来完成) 2手势识别后要做的事情 UIPanGestureRecognize ...

  3. iOS10 UI教程视图的绘制与视图控制器和视图

    iOS10 UI教程视图的绘制与视图控制器和视图 iOS10 UI视图的绘制 iOS10 UI教程视图的绘制与视图控制器和视图,在iOS中,有很多的绘图应用.这些应用大多是在UIView上进行绘制的. ...

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

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

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

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

  6. Tips7:Unity中 Scene视图 和 Game视图 中 视角(Camera)的控制

    选中你要改变的相机,然后点击GameObject-->Align With View 选项(快捷键Ctrl+Shift+F)使相机视角和当前Sence视图中一样 通过这样可以控制在Game视图( ...

  7. (7/18)重学Standford_iOS7开发_视图、绘制、手势识别_课程笔记

    第七课: 1.View 一般来说,视图是一个构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,并在其中绘制及添加触控事件等. ①视图的层级关系 一个视图只能有一个父视图,可以有多个子视图 - ( - ...

  8. iOS Programming - Views(视图 - 基本绘制,变换,平移,旋转,反转,倾斜)

    1. Views A view (an object whose class is UIView or a subclass of UIView) knows how to draw itself i ...

  9. 拓展Scene视图——场景编辑Vector2/3

    Test.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...

随机推荐

  1. iOS开发-状态模式

    状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...

  2. javascript坐标:event.x、event.clientX、event.offsetX、event.screenX 用法

    clientX 设置或获取鼠标指针位置相对于窗口客户区域的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于窗口客户区域的 y 坐标,其中客户区域不包 ...

  3. 《Xenogears》(异度装甲)隐含的原型与密码

    <Xenogears>(异度装甲)隐含的原型与密码 X 彩虹按:一种高次元的“生命体”,因“事故”被抓来当成“超能源”,其实那不只是“无限的能源”而已,“它”是有意志的!在我们眼里看来,这 ...

  4. informix 查看 当前锁表

    select username,sid,waiter,dbsname,tabname,rowidlk,keynum,type from sysmaster:syslocks l, sysmaster: ...

  5. Python:IOError: image file is truncated 的解决办法

    代码如下: #coding:utf-8 from PIL import Image import pytesseract def test(): im = Image.open(r"pic. ...

  6. spring 4.2.0后jdbcTemplate中不用queryForLong了(之系统升级发现)

    在spring 3.2.2之后,jdbcTemplate.queryForInt已经被取消了! 原来是这样写的: String sql = "SELECT count(*) FROM USE ...

  7. object-c学习1

    因为公司需要,开始看object-c,虽然还没ios系统,但现学下语法. 第一个例子不应该是helloWorld吗?但<Learn Objective-C on the Mac>书上不是. ...

  8. string的+操作与StringBuilder对象

    习惯在C#代码中写str+="xxx";这样代码的请注意啦,如果这种操作是针对单个变量作很多次叠加操作的,很有可能导致性能降低. 大家都知道string与StringBuilder ...

  9. 如何制作CSR文件?

    如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...

  10. Oracle Essbase入门系列(二)

    本篇开始会一个三口之家的家庭财务数据库为例,讲述Essbase的功能和开发.为了说明EPM应用程序的管理和开发过程,会绕一些弯路,不使用EAS,而尽量用EPMA. 创建应用程序 首先登陆到Worksp ...