首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >九、编辑器开发之Gizmos

九、编辑器开发之Gizmos

作者头像
CoderZ
发布2022-08-29 15:38:18
发布2022-08-29 15:38:18
73500
代码可运行
举报
运行总次数:0
代码可运行

1.OnDrawGizmos和OnDrawGizmosSelcted方法

Gizmos绘制需要Monobehaviour生命周期中的OnDrawGizmos函数,它在生命周期中的位置:

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnDrawGizmos() { }
}

虽然函数代码块中没有任何实现,但是我们已经可以在Gizmos下拉框中看到Test选项:

下面我们来实现一些绘制:

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        Gizmos.DrawCube(transform.position, Vector3.one);
    }
}

在自身位置绘制了一个大小为1的立方体,如图所示:

我们增加一个新的方法,OnDrawGizmosSelected. 只有在我们选中该物体时,该方法才起作用。

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;

public class Test : MonoBehaviour
{
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        Gizmos.DrawCube(transform.position, Vector3.one);
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(transform.position, Vector3.one);
    }
}

2.DrawGizmo特性

除了在Monobehaviour中实现外,还可以使用DrawGizmot特性:(脚本需要放在Editor文件夹中)

代码语言:javascript
代码运行次数:0
运行
复制
using UnityEngine;
using UnityEditor;

public class TestEditor : Editor
{
    [DrawGizmo(GizmoType.NotInSelectionHierarchy
        | GizmoType.InSelectionHierarchy
        | GizmoType.Selected
        | GizmoType.Active
        | GizmoType.Pickable)]
    private static void TestGizmosDraw(Test test, GizmoType gizmoType)
    {
        Gizmos.color = Color.white;
        Gizmos.DrawCube(test.transform.position, Vector3.one);
    }

    [DrawGizmo(GizmoType.NotInSelectionHierarchy
        | GizmoType.InSelectionHierarchy
        | GizmoType.Selected
        | GizmoType.Active
        | GizmoType.Pickable)]
    private static void TestGizmosDrawSelected(Test test, GizmoType gizmoType)
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(test.transform.position, Vector3.one);
    }
}

NotInSelectionHierarchy:即没有被选中也没有父物体被选中

InSelectHierarchy:被选中或者有子物体被选中

Selected:被选中

Active:物体没有隐藏

Pickable:作者还不知道啥作用

3.Gizmos类

DrawCube:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 大小
    Gizmos.DrawCube(transform.position, Vector3.one);
}

DrawWireCube:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 大小
    Gizmos.DrawWireCube(transform.position, Vector3.one);
}

DrawSphere:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 半径
    Gizmos.DrawSphere(transform.position, 1f);
}

DrawWireSphere:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 半径
    Gizmos.DrawWireSphere(transform.position, 1f);
}

DrawRay:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 起点
    //param2 方向
    Gizmos.DrawRay(transform.position, transform.up);
}

DrawLine:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 起点
    //param2 终点
    Gizmos.DrawLine(transform.position, transform.position + transform.forward);
}

DrawIcon:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 icon路径 需要放置在Asset/Gizmos/路径下
    Gizmos.DrawIcon(transform.position, "icon.png");
}

DrawFrustrum:

代码语言:javascript
代码运行次数:0
运行
复制
private void OnDrawGizmos()
{
    //param1 中心点
    //param2 fov
    //param3 maxRange
    //param4 minRange
    //param5 aspect
    Gizmos.DrawFrustum(transform.position, 60f, 3f, 1f, 1.3f);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 当代野生程序猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档