Unity合批规则
Unity合批规则参考资料Unity UGUI Batches合批规则详解(含源码)
Unity性能优化之合批
Unity基础知识回顾 DrawCall、Batch、SetPassCall
UnityUI合批学习笔记
基础概念DrawCallCPU每次调用图像编程接口 glDrawElements(OpenGl中的图元渲染函数)或者 DrawIndexedPrimitive(DirectX中的顶点绘制方法)命令GPU渲染的操作称为一次Draw Call。Draw Call就是一次渲染命令的调用,它指向一个需要被渲染的图元(primitive)列表,不包含任何材质信息,glDrawElements 或者 DrawIndexedPrimitive 函数的作用是将CPU准备好的顶点数据渲染出来。
Batch把数据加载到显存,设置渲染状态,CPU调用GPU渲染的过程称之为一个Batch。这其实就是渲染流程的运用阶段,最终输出一个渲染图元(点、线、面等),再传递给GPU进行几何阶段和光栅化阶段的渲染显示。一个Batch必然会触发一次或多次DrawCall,且包含了该对象的所有的网格和顶点数据以及 ...
Playable动画系统
前言参考资料:Unity Playable API 定制化动画系统
2D地形笔刷探索
2D地形九宫格笔刷前言参考地址:War3 魔兽争霸悬崖地形算法
主要思路如下
划分cell的内部格子为0001,0010,0100,1000四部分
在笔刷采样时采样划分出的小格
计算每个cell被采样到的小格之和作为weight权重,用weight来采样对应texture,如上图中最终采样的结果为
采样地形纹理贴图:
最终结果:
实现过程
主要通过Odin设计编辑器+ScriptableObject记录笔刷数据、地图数据、笔刷资源的方式
对地图中所有cell生成对应的4个小格brushCell,整合为Sample Map,通过射线方式采样九宫格范围内的brushCell,同时记录下对应实际地图cell的weight,最终通过每个cell的weight采样获取对应的贴图
项目使用创建地图
在Tools/2DBrush中打开编辑界面
放置一个GameObject作为地图cell存放的parent,这里取名为MapRoot
在Map/MapConfig中右键创建MapConfig,并配置地图数据参数
在MapMenuEditor中选择对应的MapConfig,读取对应的配置信息 ...
UI EventSystem点击源码解析
UI EventSystem源码解析总流程
RaycasterManager中注册了所有的Raycaster,其中有一个为GraphicRaycaster,其与Canvas配套使用,管理了自己所有勾选了raycastTarget的Graphic
每次通过InputModule点击时,会调用EventSystem遍历所有Raycaster,找到点到的所有内容,UI通过GraphicRaycaster,找到点到的所有Graphic,然后取第一个
将拿到的Graphic对应的GameObject填充到PointerEventData中,ExecuteEvents执行handler并传递PointerEventData,向上找到第一个对应的handler进行处理
RaycastManager管理了所有的BaseRaycaster,其实就包括GraphicRaycaster、PhysicsRaycaster、Physics2DRaycaster,通过AddRaycaster(BaseRaycaster baseRaycaster)进行注册
GraphicRaycaster与Canvas配套使用 ...
Shader-处理2DSprite在3D场景中穿模现象
2DSprite与3D场景穿模参考资料:https://www.bilibili.com/video/BV1rr4y1c7wz
主要思路参考自方舟的思路分享,通过修改Vert Shader内的深度写入,将角色的实际深度以脚底的对应深度为基准进行写入,环境即可通过深度测试来正确控制层级关系。
Shader代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697Shader "Unlit/2DUnlitShader"{ //MARKER:注意在使用的时候必须保证Scale的Y与Z相同 Properties { _MainTex ("Texture", 2D) = "white& ...
C# CLR VIA--委托
CLR VIA委托
所有委托类型都派生自MulticastDelegate(间接继承Delegate),其中三个重要的非公共分为别_target、_methodPtr、_invocationList,其在CLR中都有具体解释
所有委托都有一个构造器,它获取两个参数:一个是对象引用,另一个是引用了回调方法的整数,在Invoke被调用时,它使用私有字段_target和_methodPtr在指定对象上调用包装好的回调方法
所有的委托对象都是一个包装器,其中包装了一个方法和调用该方法时需要操作的对象,包装器之间通过_invocationList之间进行连接,作为委托链来使用。
对于+=和-=进行了封装,通过IL代码可以看到+=其实是调用了Delegate.Combine,而-=其实是调用了Delegate.Remove
Combine:以Combine(fbChain,fb1)为例子
若发现fbChain已引用了一个委托对象,会构造一个新的委托对象,对其_target和_methodPtr进行初始化,同时将_invocationList初始化为一个数组,数组中对应元素会指向对应的委托 ...
基于ET的回合制战棋-场景切换部分
前言 先吐槽一下ET自带的场景切换组件实在是太简陋了。。因此自己根据项目需要对整个流程进行了重构,不得不说ETTask单线程异步任务是真的好用,免去了命令模式的编写。
场景切换流程
通过SceneChangeData实现数据流在场景转换流程中的传递
具体函数
InitLoadingUI:实现LoadingUI淡入效果
1234567891011121314private static async ETTask InitLoadingUI(this SceneChangeComponent self, SceneChangeData data){ //LoadingUI淡入 UIComponent.Instance.ShowWindow(WindowID.WindowID_Loading); DlgLoading dlgLoading=UIComponent.Instance.GetDlgLogic<DlgLoading>(); if (dlgLoading != null) { dat ...
基于ET的回合制战棋-技能部分
前言 目前技能设计大类分为普通技能和终结技,且技能物件都基于BaseSkillItem,两种的思路都会在之后进行介绍,同时也会介绍技能的具体生命周期与针对服务器/客户端双端使用的函数分发处理。
终结技 因为考虑到终结技需要营造出的效果,需要配合相机Animation、受击方Animation、音效、UI显示、特效生成的情况。这时就想到了timeline这种方式,而将具体的伤害数值处理延后到Timeline播放之后。
Timeline轨道拓展 根据具体的使用情况,我拓展了四类轨道,AnimationValueTrack、EffectTrack、TransformTrack、UITrack
Timeline的本质是通过TrackAsset创建出对应的PlayableGraph(内含多种Playable),而后进行通过PlayableDirector进行播放
对Timeline中Track的拓展需要进行TrackAsset(轨道文件)、PlayableAsset(轨道内文件)、PlayableBehaviour(轨道内文件在PlayableG ...
基于ET的回合制战棋-网络部分
前言 过年时间因为个人的某些原因所以毕设搁置了一下,现在也慢慢重新完善后续功能。网络部分依旧借助了ET框架的网络部分,采取了双端的设计方案,尽可能将Client和Server端的相同部分通过Link方式关联起来,实现了部分的双端互通。
网络部分流程介绍 总的流程基本可以分为四个部分,分别为登入流程、地图服进入流程、匹配流程、游戏流程,下面对其分别进行介绍。
登入流程:
关键部分代码: 主要体现在登入流程实际上是客户端与服务器中两个分布式服务器的分别交互,先通过C2R_Login在验证服中获取到分配的网关登入Key后再通过实际的C2G_LoginGate在网关服实现登入操作。
验证服网关分配和具体Key获取,验证服在接收到C2R_Login协议后其实也在内部进行服务器通讯操作,在内网向分配到的网关服传递C2R_GetLoginKey协议进行Key申请
123456789101112131415protected override async ETTask Run(Session session, C2R_Login r ...
EGUI详解-LoopScrollRect解析
前言 在毕设demo中想要实现一个角色选择界面,其中是需要用到类似背包的GridLayoutGroup组件的,同时之前的EGUI文章中也没对其中的LoopHorizontalScrollRect和LoopVerticalScrollRect进行解析,所以也趁这个机会看一下源码,且其对于背包系统的优化来说对很多类型的游戏都是通用的。
整体设计 对于抽象类LoopScrollRect来说,其基于Unity官方的ScrollView进行了一定的拓展。由LoopScrollRect继承出两种滚动类型,分别为HorizontalScrollRect和VerticalScrollRect。
本文主要针对于其的拓展与采取的优化手段进行解析:
拓展部分的UML图(包括Item的数据存储):
数据存储对于数据的存储主要是通过LoopScrollPrefabSource和LoopScrollDataSource,前者主要是对UIPrefab源,后者是对其具体存储数据源
LoopScrollPrefabSource
内部存储了对应UIPrefab的prefabName, ...