在使用Unity过程中,你会发现Unity提供了很多好用的图形编辑窗口,在动画机Animator和ShaderGraph中只需要“连连看”就能得到效果。 但对于一些其他需求,例如状态机,对话编辑器,Unity则并没有提供官方工具。
虽然我们可以通过一些成熟插件,例如NodeCanvas、Behavior Designer等也可以实现相同效果,但却不能深入理解,学习这类大型插件也有一定的学习成本,因此对于一些简单需求,我们完全可以自己打造一个节点编辑器,恰好Unity官方也提供了我们工具来实现该需求,那我们就以一个例子开始从零开始吧。
推荐Unity版本:2021以上
UI Builder是官方提供给我们的工具,是用来做编辑器扩展的非常好用的工具,据说可以直接通过UI Builder搭建游戏UI,不过好像用的人不多,大多数都是用来创建编辑器。
首先在Assets创建Editor文件夹,Editor文件夹是Unity中特殊文件夹的一种,有关编辑器的内容都需要放到该文件夹下。
右键创建Create->UI Toolkit->Editor Window

会弹出如下窗口

这里我以行为树为例子,填入BehaviourTreeEditor后Confirm
完成后会生成三个文件并弹出一个窗口


该三个文件就对应创建时的C#,UXML,USS文件,弹出窗口中的三行文字就是分别从3个文件里得到的。
在unity中双击UXML文件,也就是最下面那个文件,会打开UI Buider窗口,如下图所示

我们不需要默认文字,因此我们去到对应地方删除默认文字
在UI Builder窗口中左侧Hierarchy面板下,展开后删除Label

然后去第二个文件也就是.uss文件中清空内容

最后到C#脚本中

其中root为我们刚刚删除Label的父物体,也就是整个窗口的根节点,而VisualElement为所有窗口中元素类的基类,我们暂时用不上其他内容,注释或删除掉root赋值语句下的其他语句
然后更改MenuItem内容和函数名,如下图

当然,如果你喜欢默认打开路径也行,可以不用更改
返回到Unity中,发现左上角新建了一个菜单项,
点击BehaviourTreeEditor->Open Editor即可打开我们的编辑器窗口,不过我们现在窗口内啥也没有。
首先进入到UI Builder窗口,点击Hierachy下根物体,在右侧Inspector面板中勾选Editor Extension Authoring

勾选该选项能使用仅在Editor下的元素,可以发现左下角Library中的内容变多了,做编辑器时需要勾选上。
在Editor文件夹下创建脚本SplitView.cs
public class SplitView : TwoPaneSplitView
{
public new class UxmlFactory : UxmlFactory<SplitView, TwoPaneSplitView.UxmlTraits> { }
}
该类继承自TwoPaneSplitView,相当于官方提供的分屏,将Editor Window分成两块,在低版本下是没有该类的,在UI Builder中用2个Visual Element也能达成相同的效果,区别就是官方的TwoPaneSplitView 提供了几个参数调整布局,因此不使用也无伤大雅。
而下面一句中则是与构造相关,按照默认写即可。
回到UI Builder,在左侧Library下选择Project,可以发现我们自己的SplitView,拖入到Hierarchy窗口中,如下图所示

我们在Stardard中拖入两个Visual Element到container下(如果拖不进去就拖到ViewPort面板后再调整),重命名为left和right,如下图所示

这样,我们就有了两个区域,通过调整SplitView中Inspector面板里的Fixed Pane Initial Dimension,可以调整左右两边区域大小。
老样子,在Editor文件夹下创建InspectorView脚本用来显示点击节点后的窗口左边内容,用来查看当前节点信息,当然,如果你对UI Builder比较熟悉,也可以直接拖入元素进行布局。
public class InspectorView : VisualElement
{
public new class UxmlFactory : UxmlFactory<InspectorView, VisualElement.UxmlTraits> { }
}
在创建之前,我们先打开uss文件,填入以下内容
GridBackground{
--grid-background-color: rgb(40,40,40);
--line-color: rgba(193,196,192,0.1);
--thick-line-color: rgba(193,196,192,0.1);
--spacing: 15;
}
该内容是我们节点的背景网格,当然如果你不喜欢也可以不用。
创建BehaviourTreeView脚本
public class BehaviourTreeView : GraphView
{
public new class UxmlFactory : UxmlFactory<BehaviourTreeView, GraphView.UxmlTraits> { }
public BehaviourTreeView()
{
Insert(0, new GridBackground());
//添加背景网格样式
var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/BehaviourTreeEditor.uss");
styleSheets.Add(styleSheet);
this.AddManipulator(new ContentZoomer());
this.AddManipulator(new ContentDragger());
this.AddManipulator(new SelectionDragger());
this.AddManipulator(new RectangleSelector());
}
}
该脚本继承自GraphView,GraphView继承自VisualElement,通过Insert添加格子背景,并通过添加styleSheet来改变格子样式,默认情况下格子是基本没有的。通过AddManipulator给GraphView面板添加一些基础的缩放拖拽功能等。
将BehaviourTreeView拖入right下,你可能看不到格子,这时我们选中该view,在Inspector面板调整InlinedStyles->Flex->Grow 为1,即可看到效果,如下图所示

public class NodeView : UnityEditor.Experimental.GraphView.Node
{
}
继承上述命名空间下的Node类,Node继承自GraphElement类
该类以后会和输入输出口相关,暂时先空着,用到的时候再继续。
接下来应该是与数据相关,要让EditorWindow能显示数据,做出的更改也能应用到数据上,有空的时候再继续写。
博主是第一次写博客,如果有什么错误的地方请指出,万分感谢!ε≡٩(๑>₃<)۶ 一心向学
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里编辑 3.解析依赖到项目中
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位
这是我当前的类定义和规范:classEvent:not_starteddoevent:game_starteddotransition:not_started=>:in_progressendevent:game_endeddotransition:in_progress=>:finalendevent:game_postponeddotransition[:not_started,:in_progress]=>:postponedendstate:not_started,:in_progress,:postponeddovalidate:end_time_before_finalen