Unity节点编辑器(五) -- 引导遮罩
遮罩需求目前市面上游戏的引导,基本上都采用了在需要突出的地方高亮引导玩家,通过点击等方式去触发下一步操作。所以需求就抽象成两个:1.高亮某一块区域2.高亮区域的点击判断和通知 高亮区域实现高亮区域有多种做法,第一种是通过继承Unity的BaseMeshEffect去自己写顶点、三角面最后形成高亮,第二种是使用Shader通过像素的判定实现。第一种比较里面的逻辑比较复杂,所以我用的是第二种。 矩形高亮区域的C#代码实现一个矩形高亮区域需要两个数据:矩形的中心和大小。为了使用同一个材质实现合批,我使用一个继承于BaseMeshEffect的类中(Unity提供的类不熟悉的可以查一下),在类中把这两个数据写入每个顶点中。 顶点处理基类重写ModifyMesh方法,在其中使用抽象方法SetVertexData,传入顶点数据,并重新赋值出来。 123456789101112131415161718192021222324252627282930public abstract class MaskVertexBase : BaseMeshEffect{ public over...
Unity节点编辑器(四) -- 保存&打开Graph数据
打开SO数据使用Unity内置函数添加双击打开事件使用Unity提供的OnOpenAsset(0),然后重新设置graphView的数据并重绘。 123456789101112131415161718[OnOpenAsset(0)]public static bool OnOpen(int instanceID, int line){ GraphSoData nodeGraph = EditorUtility.InstanceIDToObject(instanceID) as GraphSoData; if (nodeGraph != null) { Open(nodeGraph); return true; } return false;}public static void Open(GraphSoData nodeGraph){ ShowExample(); m_graphView.SetGraphData(nodeGraph); m_graphVi...
Unity节点编辑器(三) -- 创建Node节点
编辑器数据类要做的节点如下图所示根据图片可以很清晰的知道,数据分为4部分。1.要有一个类存储着所有的节点数据。2.每个节点需要保存自己的类型名字(用于反射生成)、节点唯一ID(用于标识节点)、标题、节点位置、输出/输出端口的数据、以及一个Object类型的每个子类自己的数据。3.端口数据记录端口所在节点ID、端口唯一ID以及连接的数据。4.连接数据记录着连接的节点ID和端口。我的实现使用了Unity的ScriptableObject。数据结构的图如下。 GraphSoData 黑板数据12345678910111213141516[Serializable]public class GraphSoData : ScriptableObject{ [SerializeField] public string graphName; [SerializeField] public List<NodeSoData> nodeSoDataList = new List<NodeSoData>(); public void Dis...
Unity节点编辑器(二) -- GraphView窗口
编辑器窗口创建我这里直接用了Unity编辑器uss创建一个窗口。然后添加了一个网格样式。 窗口代码窗口中持有一个NodeGraphView实例,并且在其中OnEnable中进行初始化。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293public class NodeGraphWindow : EditorWindow{ protected static NodeGraphView m_graphView; [MenuItem("★Tools★/NodeGraphWindow")] public static void ShowExample() { GetWindow<NodeGraphWind...
Unity节点编辑器(一) -- 需求分析
最近需求的思考最近工作上在处理项目内的引导系统,我之前的做法是根据策划的需求,通过继承引导基类实现具体子类的做法,来实现不同的引导。但是这样有一个缺点:所有的引导实现都基于我的硬编码,当引导的流程变更的时候,我代码的流程也需要跟着修改,非常麻烦。而且这些变更也仅仅是步骤改变,1->2->3变成了1->3->2,修改就是纯粹的体力活,非常的琐碎。然后最近在各种机缘巧合之下,接触到了节点编辑器,突然激发了我的灵感,要是我把引导的逻辑封装在一个Node里面,由策划自己去建立Node流程,就是完全由策划编辑,我提供具体的引导Node实现,完美解决。 关于节点编辑器其实这个东西在已经应用非常广泛了,Unity的ShareGraph和UE的蓝图,都是节点编辑器的应用。而且在Unity上开源的节点编辑器框架也不少,比较出名的就有:xNode,NodeGraphProcessor。本来是打算直接使用这些框架,省下自己造轮子的时间,但是深入了解之后,发现这些框架为了通用性,代码都比较多且太重度了(我目前的需求根本用不上)。所以就想着自己造一个只提供流程的简单节点编辑器。 编...
Unity颜色空间:sRGB和Linear
发现问题最近在项目中遇到一个问题,就是一张显示正常的图片,放到了UI中莫名其妙的就显示偏黑了,就像这样经过询问同事后发现,原来项目的相机是使用的Linear空间。 sRGB和Linear在物理世界中,如果光增加一倍,那么亮度也增加一倍,这是线性关系。但是在最早的显示器中,显示图像的时候,电压增加一倍,亮度并不是跟着增加一倍,而是呈亮度增加量等于电压增加量的2.2次幂的非线性关系: l_亮度=u2.2 (l ∈[0,1],u∈[0,1])2.2也叫做显示器的Gamma值。因为亮度0是黑,1是白,这种关系意味着当电压线性变化的时候,相对于真实的世界来说,亮度的变化在暗处黑的地方变换比较慢,暗占据数据范围更广,颜色整体偏暗。如图,直线代表物理世界的线性空间(Linear Space),下曲线是显示器输出的Gamma2.2空间(Gamma Space)。 &...
第一篇博客
为什么弄博客自从工作以来,一些记忆性的东西越来越多,再加上自己平时积累的东西,之前一直都是用一些第三方的笔记软件记录,但这样进行分享的时候就特别不方便,越来越需要一个地方记录下来,但是国内写到某DN博客,总觉得文章就变成不是自己的,心里不舒服。刚好最近看到了一些个人博客搭建的教程,有非常方便的工具可以快速部署。所以趁着周末有空,搭建了这个博客,之后用来记录和分享技术文档。每天进步一点,做更好的自己!




