首页 > 其他分享 >编辑器扩展 - Scene视图

编辑器扩展 - Scene视图

时间:2023-10-19 23:25:46浏览次数:40  
标签:10 arcStartDir Vector3 Handles 视图 Scene 编辑器 pos new

扩展Scene视图的几种方式

1) 注册SceneView.duringSceneGui委托(Unity2018及之前版本是SceneView.onSceneGUIDelegate)

#if UNITY_EDITOR

using UnityEditor;

public class TestSceneGUIWindow : EditorWindow
{
    [MenuItem("MyTools/TestSceneGUIWindow")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow<TestSceneGUIWindow>(false, "TestSceneGUIWindow", true).Show();
    }

    private void OnEnable()
    {
        SceneView.onSceneGUIDelegate -= OnMySceneGUI;
        SceneView.onSceneGUIDelegate += OnMySceneGUI;
    }

    private void OnDisable()
    {
        SceneView.onSceneGUIDelegate -= OnMySceneGUI;
    }

    private void OnMySceneGUI(SceneView sceneView)
    {
        //在这边扩展Scene视图
    }

}

#endif

 

2) 自定义Editor,然后实现事件函数OnSceneGUI

#if UNITY_EDITOR

using UnityEditor;

[CustomEditor(typeof(Xxx))]
public class TestSceneGUIEditor : Editor
{

    private void OnSceneGUI()
    {
        //在这边扩展Scene视图
    }

}

#endif

 

显示gui控件

GUILayout.BeginArea(new Rect(40, 20, 200, 200), "test");
if (GUILayout.Button("Button"))
{
    Debug.Log($"Button Click");
}
EditorGUILayout.Space();
GUILayout.BeginHorizontal();
{
    EditorGUILayout.SelectableLabel("Num:", GUILayout.Width(35));
    EditorGUILayout.IntField(0);
}
GUILayout.EndHorizontal();
EditorGUILayout.HelpBox("一些提示信息", MessageType.Warning);
EditorGUILayout.IntSlider(0, 0, 10);

GUILayout.EndArea();

 

显示几何形状

弧形

var arcRadius = 5;
var arcAngle = 270;

Handles.color = Color.red;
var pos = new Vector3(3, 0, 0);
var arcStartDir = new Vector3(0, 0, 1);
Handles.DrawSolidArc(pos, Vector3.up, arcStartDir, arcAngle, arcRadius); //x-z平面绘制2d弧形, 90度开始, 顺时针绘制270度

Handles.color = Color.green;
pos.y += 5;
arcStartDir = new Vector3(1, 0, 0);
Handles.DrawSolidArc(pos, Vector3.up, arcStartDir, arcAngle, arcRadius); //x-z平面绘制2d弧形, 0度开始, 顺时针绘制270度

Handles.color = Color.blue;
pos.y += 5;
arcStartDir = new Vector3(1, 0, 1);
Handles.DrawSolidArc(pos, Vector3.up, arcStartDir, arcAngle, arcRadius); //x-z平面绘制2d弧形, 45度开始, 顺时针绘制270度

Handles.color = Color.cyan;
pos.y += 5;
arcStartDir = new Vector3(1, 1, 0);
Handles.DrawSolidArc(pos, Vector3.up, arcStartDir, arcAngle, arcRadius); //3d弧形, 相当于绿色的那个弧形向上拉起一点(从顶往下看, 和它是重叠的)

直线,折线

Handles.color = Color.red;
var pos = new Vector3(0, 0, 0);
Handles.DrawLine(pos, new Vector3(10, 10, 10)); //绘制直线(红色)

Handles.color = Color.blue;
var points = new Vector3[] { Vector3.zero, new Vector3(10, 10, -10), new Vector3(10, -10, -10) };
Handles.DrawPolyLine(points); //绘制折线(蓝色)

Handles.color = Color.green;
points = new Vector3[] { Vector3.zero, new Vector3(10, -10, 10), new Vector3(-10, -10, 10) };
Handles.DrawAAPolyLine(5, points); //宽度为5的折线(绿色, 抗锯齿)

 

显示操控控件

m_Position = Handles.PositionHandle(m_Position, Quaternion.identity);

var pos = new Vector3(6, 0, 0);

Handles.color = Color.red;
Handles.Label(pos, $"文本");

float handleSize = HandleUtility.GetHandleSize(pos);
EditorGUI.BeginChangeCheck();
pos.x += 3;
m_Scale = Handles.ScaleHandle(m_Scale, pos, Quaternion.identity, handleSize);

pos.x += 10;
m_Rot = Handles.RotationHandle(m_Rot, pos); //Handles.DoRotationHandle(m_Rot, pos);

pos.x += 10;
m_Rot = Handles.FreeRotateHandle(m_Rot, pos, handleSize);

pos.x += 8;
m_Radius = Handles.RadiusHandle(Quaternion.identity, pos, m_Radius);

if (EditorGUI.EndChangeCheck())
{
    Debug.Log($"{m_Scale}, {m_Position}, {m_Rot}, {m_Radius}");
}

 

参考 

UnityEditor学习笔记二 - Wunsam_Chan - 博客园 (cnblogs.com)

Unity3d Editor 编辑器扩展功能详解(5)Handles - 知乎 (zhihu.com)

 

标签:10,arcStartDir,Vector3,Handles,视图,Scene,编辑器,pos,new
From: https://www.cnblogs.com/sailJs/p/17770207.html

相关文章

  • 论文阅读:A_Multi-Granularity_Scene_Segmentation_Network_for_Human-Robot_Collabora
    A_Multi-Granularity_Scene_Segmentation_Network_for_Human-Robot_Collaboration_Environment_Perception用于人与机器人协作环境感知的多颗粒度场景分割网络摘要人机协作(Human-robotcollaboration,HRC)被认为是未来以人为中心的智能制造的一种有前途的范式,以满足蓬勃发展的大......
  • 论文阅读:Nerflets: Local Radiance Fields for Efficient Structure-Aware 3D Scene R
    Nerflets:LocalRadianceFieldsforEfficientStructure-Aware 3DSceneRepresentationfrom2DSupervisionNerflets:用于高效结构感知的三维场景的二维监督的局部辐射场图1。我们提出用一组局部神经辐射场来表示场景,称为nerflets,仅在2D监督下进行训练。我们的表示法不仅适......
  • huawei交换机基本配置,入门视图详解
    一、交换机基本配置1、交换机连接方式本地:计算机COM口/USB口-->Console线-->交换机Console口远程:Putty、SecureCRT、Xshell远程管理工具2、网络操作系统1)有四种视图模式<*> //用户视图:查看运行状态或其他参数[*] //系统视图:配置设备的系统参数[*-GigabitEthernet0/0......
  • python 处理异步物化视图同时执行导致内存溢出问题
    python处理异步物化视图同时执行导致内存溢出问题一、前提:因为物化视图过多,同时物化视图到时间同时爆发,导致CPU爆满,所以采用datax自带的调度服务来执行python命令二、直接看代码:importpymysqlimportpymssqlimportdatetimeimporttimeclassMaterialized_plan:d......
  • vue2使用 tinymce富文本编辑器-图片上传、粘贴图片上传致服务器
    1.安装tinymce富文本编辑器插件npmitinymcenpmi@tinymce/tinymce-vue2.创建Editor.js文件封装组件以便使用<template><divclass="tinymce-editor"><editorv-model="myValue":init="init":disabled="disabled&qu......
  • Linux 本地部署私有Stackedit Markdown编辑器远程访问
    StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7kStar!,它支持将Markdown笔记保存到多个仓库,包括Gitee、GitHub和Gitea。此在线笔记工具还提供了一些便捷功能,如拖拽或粘贴上传图片、文件搜索功能,以及可切换为炫酷的暗黑主题,这些功能特别适合那些喜欢使用Markdown来记录......
  • sortable 拖拽后数据变更但视图不变
    问题表格中某两行拖拽换序,使用sortable.js在拖拽结束后调用换序接口,再更新数据列表。问题是数据变了,但视图不变。如下图所示:分析vue无法检测数组中顺序的变化。即使采用$set,$forceUpdate(),给组件添加key属性,仍然无法解决该问题。解决办法请求数据列表前,先重置列表。......
  • Solidworks 零件重命名后,工程图视图丢失怎么办?
    SolidWorks修改零件名称后,打开工程图,发现原先标注好的图纸视图不见了,如下图所示,这是因为工程图链接的模型零件丢失,本文给大家分享解决此问题方法。解决方法:先不要直接双击打开工程图,按下面步骤操作:先打开SolidWorks,然后点击打开,选择工程图,先不要直接点下面的打开,而是先选择参......
  • 【CSS3】CSS3 3D 转换 ③ ( 3D 透视视图 | translateZ 转换分析 | 网页调试工具调试 t
    文章目录一、translateZ转换分析1、translateZ转换对应的空间分析2、网页调试工具调试translateZ属性值二、代码示例-translateZ转换分析1、代码示例-translateZ为0的参照示例2、代码示例-translateZ为200示例一、translateZ转换分析1、translateZ转换对应的......
  • UML五大视图
    树形图总结分开介绍1、用例视图--用例视图强调从系统的外部参与者(主要是用户)的角度看到的或需要的系统功能2、逻辑视图--逻辑视图从系统的静态结构和动态行为角度显示如何实现系统的功能3、进程视图--侧重于系统的运行4、开发视图(实现视图)--侧重于软件模块的组织和管理......