Unity2017,想在编辑器自己实现一个类似TreeView的东西

public void OnGUI(Rect rect)
{
// ...
for (int i = 0; i < 100; i++)
{
int row = Mathf.FloorToInt(i / visibleColumns);
int column = i % m_VisibleColumns; float x = rect.x + padding.left + column * (cellSize.x + spacing.x);
float y = rect.y + padding.top + row * (cellSize.y + spacing.y);
Rect cellRect = new Rect(x, y - scrollPos, cellSize.x, cellSize.y);
GUI.Box(cellRect, i.ToString());
}
}

然后发现一个问题:在y < rect.y时,超出了预想的区域,却画了出来,在网上没有搜到,记录一下

查阅对应源码,通过反射调用GUIClip.Push(),GUIClip.Pop()即可

// 反射工具类
public static class GUIClip
{
private static object CallReflection(string name, params object[] arguments)
{
Assmebly assembly = Assembly.Load("UnityEngine");
Type type = assembly.GetType("UnityEngine.GUIClip");
MethodInfo method = type.GetMethod(name, BindingFlags.Static | BindingFlags.NonPublick);
return method.Invoke(null, arguments);
} // Push a clip rect to the stack with pixel offsets.
public static void Push(Rect screenRect, Vector2 scrollOffset, Vector2 renderOffset, bool resetOffset)
{
CallReflection("Push", screenRect, scrollOffset, renderOffset, resetOffset);
} // Removes the topmost clipping rectangle, undoing the effect of the lastest GUIClip.Push
public static void Pop()
{
CallReflection("Pop");
}
}

一开始的OnGUI修改为

public void OnGUI(Rect rect)
{
// ...
GUIClip.Push(rect, Vector2.zero, Vector2.zero, false);
for (int i = 0; i < 100; i++)
{
int row = Mathf.FloorToInt(i / visibleColumns);
int column = i % m_VisibleColumns; // 在clip的处理过程中不需要再手动加上rect的位置了
float x = padding.left + column * (cellSize.x + spacing.x);
float y = padding.top + row * (cellSize.y + spacing.y);
Rect cellRect = new Rect(x, y - scrollPos, cellSize.x, cellSize.y);
GUI.Box(cellRect, i.ToString());
}
GUIClip.Pop();
}
```csharp

Unity EditorWindow GUI裁剪的更多相关文章

  1. Unity EditorWindow知识记录

    1.创建EditorWindow using UnityEditor; using UnityEngine; public class ZZEditorWindow : EditorWindow { ...

  2. Unity EditorWindow 笔记

    一:功能 1.实例化 //设置插件在菜单栏的位置 和快捷键 [MenuItem("YCC's Tools/模型更改/更改父物体和测量长度 %W")] //实例化窗体 static ...

  3. Unity用GUI绘制Debug/print窗口/控制台-打包后测试

    Unity游戏视窗控制台输出 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  4. unity, editorWindow lose data when enter play mode

    我写了个editorWindow,其中有个成员变量m_x,在创建editorWindow的时候为m_x赋的值,而在editorWindow的OnGUI里把m_x显示出来. 当我开着这个editorWi ...

  5. unity, editorWindow update计时

    对于editorWindow,Time.deltaTime不起作用,所以需用下面方法对update进行计时: public class myEditorWindow : EditorWindow{ p ...

  6. Unity绘制GUI连连看(尚未完善效果和重置)

    OneImage.cs public class OneImage : MonoBehaviour { public int row, col; public Rect rect; public Te ...

  7. Unity之GUI控件

    在这里就贴一个连接吧:GUI

  8. 王立平--Unity中间GUI Skin

    C#文字: public class NewBehaviourScript2 : MonoBehaviour { public Texture t; public GUISkin skin; // U ...

  9. Unity引擎GUI之Slider和Scrollbar

    Slider(滑动条):是一个主要用于形象的拖动以改变目标值的控件,他的最恰当应用是用来改变一个数值,最大值和最小值自定义,拖动滑块可在此之间改变,例如改变声音大小. Scrollbar(滚动条):是 ...

  10. Unity引擎GUI之Canvas和EventSystem

    最近想写一套关于UGUI所有控件的基础使用教程系列,主要是根据本人的使用心得以及部分测试附带字面翻译来写的,所以其中可能难以避免会有不正确的地方. 好了进入主题,既然是第一篇,我觉得我有必要先介绍一下 ...

随机推荐

  1. 微信小程序常用的view、text、button、image组件

    [黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)] https://www.bilibili.com/video/BV1834y1676 ...

  2. 【Kubernetes】kubectl常用命令手册 -- 持续更新

    元信息 api列表: kubectl api-resources kubectl api-resources -o wide 用法查询: kubectl explain <>.<&g ...

  3. 行行AI人才直播第10期:CTC智仝咨询联合创始人王发鑫《AI时代职场进阶之路——资深猎头的职场洞见》

    当今AI技术正在快速渗透各个行业,从去年热门的AIGC到今年爆火的ChatGPT,人工智能高速发展让人惊叹的同时,也让"算法取代人类"."AI或带来失业潮"等老 ...

  4. SpringBoot整合Websocket,实现作为客户端接收消息的同时作为服务端向下游客户发送消息

    SpringBoot整合Websocket 1. SpringBoot作为服务端 作为服务端时,需要先导入websocket的依赖 <dependency> <groupId> ...

  5. vulnhub_me and my grilfriend

    解题步骤 主机nmap扫描,开放22和80端口 访问该ip,发现只能本地访问 查看源代码,提示需要使用x-forwarded-for的请求头,可以在burp suite中每次添加一个请求头,也可以使用 ...

  6. 操作系统复习 MITS6.1810 lab util 记录

    lab util sleep 介绍:主要用来熟悉下环境以及代码结构. See kernel/sysproc.c for the xv6 kernel code that implements the ...

  7. C# 多线程访问之 SemaphoreSlim(信号量)【进阶篇】

    SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待. 由于 SemaphoreSlim ...

  8. AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享

    作者:vivo 互联网数据分析团队 - Li Bingchao AB实验是业务不断迭代.更新时最高效的验证方法之一:但在进行AB实验效果评估时需要特别关注"用户不均匀"的问题,稍不 ...

  9. 搭建rsyncd服务

    前言 rsync常用来做文件传输和同步.本文示例中客户端通过rsync同步服务端的/home/tmp目录到本地(不是将客户端的文件同步到服务端). 环境信息 IP 系统版本 rsync版本 说明 19 ...

  10. 【译】摇摆你的调试游戏:你需要知道的 Parallel Stack Window 小知识!

    在 Visual Studio 2022 17.6和17.7中,我们在 Parallel Stack 窗口中添加了大量新功能,可以将您的多线程调试提升到一个新的水平. 但是 Parallel Stac ...