Luffy Blog

一生想做浪漫极客

透明shader不接受阴影

解决transparent shader不受光源shadow反应

前言 最近美术在做场景时发现,透明的模型无法对光源反应产生阴影,搜索到官方解释,是因为如果使用透明shader的物体可以接收阴影的话,则会使得渲染效率大大下降。 解决方案 核心思想是通过非透明渲染来 –> 模拟透明shader , 从而实现使用改shader的物体模型可以接收阴影。 在此之前,我们先来理解两个相关概念。 1.AlphaTest与Transparent 的区别 ...

LuaFramework工作流程(一)

Lua的工作原理及加载流程

前言 在新的Momo项目中使用Lua实现脚本热更,最终决定采用ToLua —-> Github地址。 用两篇BLOG分别谈一下Tolua相关例子及Lua相关使用方法;然后再介绍LuaFramework的使用流程。 Lua及热更新简介 关于热更新,这篇BLOG简单介绍了热更的含义及游戏中使用热更的目的,简单的说就是减短玩家获取最新资源的流程与时间,从而改善游戏体验。而对于正常的资...

ShadowCaster的应用

阴影穿透BUG及使用ShadowCaster解决方法

前言 在写完场景的自发光Shader之后,在实际应用中会发现一个问题: 当开启阴影时会发生阴影的显示不正确、穿透等问题,如: 人物的影子出现在树上等。 出现的原因在查了一些资料后发现,是由于Unity在生成深度图时,需要Shader中含有ShadowCaster的Pass,由于自己写的Shader没有此通道导致相应部分没有写入深度图,从而导致开启阴影时所造成的各种显示问题。 阴影生成原...

EarlyZ渲染管线优化

EarlyZ相关概念及实际Shader优化

前言 最近在整理项目中过往使用的Shader,有一些Shader是从插件如:ShadowGun等移植过来;一些是根据项目新写的,有一些注意事项和风格并不统一。在对Shader的优化整理过程中,主要参考相关的UWA博客和Unity的相关优化文档。 Alpha Testing的使用 Alpha Test通过判断像素的Alpha值来确定是否渲染该像素。AlphaTest示例。 AlphaTe...

Dotween及Lambda应用

Dotween的实现及其中Lambda的作用

前言 在使用Dotween时,其中用到了Lambda表达式。好奇匿名表达式原理和特点,如:闭包(最近看Lua–小本本先记下)。 同时在C#中有大量的使用匿名函数的场景,于是花了点时间研究相关知识点。 2018/01/22 好久前写的,之前没有太多时间去写,结果就耽误了。现在看来这几点又有些没什么需要写的,那就简单的加上点网站索引吧。 Dotween 至于为何项目中要使用Dotwe...

Alpha通道分离减少图片内存

编写脚本与Shader实现图片ETC分离

前言 在对项目进行性能分析时发现,项目中RGBA/RGB等格式的图片存在很多,浪费内存且加载时间过长。查了一下U3D官方手册,推荐在Android使用ETC2格式。但是,在与UWA客服交流过程中得知,市面上还是有许多不支持ETC2格式的手机,所以决定编写代码/Shader来将图片的Alpha通道分离,分解成两张ETC1格式的图片。 实现 主要实现思路: 获取当前选中图片,获取图...

优化图片音效载入流程

编写hook程序统一处理资源载入

前言 最近在做项目的相关优化工作,首先是针对资源的格式。例如纹理在不同平台下的格式选择和对纹理大小的控制。还有不同音频的格式和加载方式。 若手动对其进行一一设置则太过于麻烦,所以本篇介绍一下相关资源格式的选择策略和unty平台下,资源加载的hook脚本。 格式选择 资源分为很多种类,这里主要针对纹理和音频进行举例讲解。 图片格式 根据Unity3D官方文档,对于纹理格式的选项有许多,这些...

GC的实现原理及应用

c#的垃圾回收原理详解及实际项目应用

前言 考虑下面一个问题 (引用自StackOverFlow): //A,B recycle reference public class A { B b; public A(B b) { this.b = b; } } public class B { A a; public B() { this.a = new A(this)...

U3D封装有限状态机

封装有限状态机提高代码可读性

前言 最近在做活动模块,设计到大量的tab页切换、按钮状态和显示界面的状态切换。若用最直白的方式实现,即在每个点击事件时,响应相应的处理。这样就会出现大量的switch case,降低了代码可读性和系统的复杂度。在GitHub这个项目中,通过封装FSM来简化程序代码,增加可读性。 使用方法 首先介绍一下使用方法。 包含命名空间: using MonsterLove.StateMac...

使用sqlite存储游戏数据

在U3D中使用sqlite存储protobuf数据

前言 在介绍实现本地化工具开发时,提及到将数据存入sqlite。在老项目中,直接传递protobuf的二进制文件。大致流程: 加载Assetbundle并转换为TextAsset文件 ProtoBuf.Serializer.NonGeneric.Deserialize反序列化为对应类 将数据加载为Dictionary<int,数据>,并存储 使用时,查找Dic...