- POSITION 语义为坐标,SV_POSITION 语义为屏幕坐标,system value ->SV
struct vertInput {
float4 pos : POSITION;
};
struct vertOutput {
float4 pos : SV_POSITION;
};
The struct vertOutput is decorated with SV_POSITION, which indicates that we will initialise it with the screen position of a vertex. Despite requiring only two values (X and Y), SV_POSITION typically contains also a Z and W components, used to store the depth (ZTest) and one value for the homogeneous space, respectively.
- 获取物体的中心坐标
mul(_Object2World, half4(0,0,0,1))
#include "UnityCG.cginc"
struct vertOutput {
float4 pos : SV_POSITION; // Clip space
fixed4 color : COLOR; // Vertex colour
float2 texcoord : TEXCOORD0; // UV data
float3 wPos : TEXCOORD1; // World position
float4 sPos : TEXCOORD2; // Screen position
float3 cPos : TEXCOORD3; // Object center in world
};
vertOutput vert (appdata_full v)
{
vertOutput o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord = v.texcoord;
o.wPos = mul(_Object2World, v.vertex).xyz;
o.sPos = ComputeScreenPos(o.pos);
o.cPos = mul(_Object2World, half4(0,0,0,1));
return o;
}
half4 frag (vertOutput i) : COLOR
{
i.sPos.xy /= i.sPos.w;
// ...rest of the shader
}
-
MVC
UI 架构搭建的各个逻辑模块,上图中显示的窗体模块并不全面,游戏中的窗体是非常多的,在此以登录窗体和英雄窗体为例进行说明:Loginwindow 和 HeroWindow 它们是负责显示的,也就是说,它对应具体的窗体逻辑,它对应的 MVC 模式中的 V,相当于 View 显示,该模块是不继承 Mono 的,也就是不挂接任何 UI 对象。LoginCtrl、HeroCtrl 模块相当于 MVC 中的 C,Control 控制,用于操作 LoginWindow,HeroWindow 所对应的 UI 窗体,比如用于控制不同窗体的显示、隐藏、删除等等操作,在图中没有列出 MVC 中的 Model 模块,这个模块主要是用于网络消息数据的接收,也可以通过文本文件直接赋值的,它可以使用列表进行存储,相对来说用处并不是不可替代的。
游戏中存在的窗体是非常多的,这么多窗体,如果不同的开发者写逻辑,会搞的很多,不利于统一管理。由此需要一个类 WindowManager 管理类进行统一注册管理各个窗体类模块,这种处理方式也就我们经常说的工厂模式。
另外,窗体之间是经常会进行不同的切换,这些切换也可以对它们进行流程管理,因为窗体之间的切换是一种固定的流程。既然经常转换,我们不免会想到状态机用于处理这种流程。在此,引入了状态机进行统一管理不同窗体状态的变换。各个模块之间的耦合性也是要重点考虑的问题,在此采用了自己封装的事件机制进行解耦合。
具体实现逻辑如下,每个窗体对应自己的类,以登录 UI 为例进行说明,每个 UI 都是一个 Window 窗体对象,它对应着 Loginwindow 类、LoginCtrl 类、LoginState 类。其他的窗体类似,而这些类都不继承 Mono 也就是说不挂接到任何 UI 窗体对象上,这样,彻底实现了资源和代码的分离,UI 系统思想设计完成,接下来再介绍技能模块和角色系统的架构设计。