unity

对Shader Variant的研究(概念介绍、生成方式、打包策略)

做~自己de王妃 提交于 2020-01-27 22:21:47
unity 打包动态生成 ShaderVariantCollection 对Shader Variant的研究(概念介绍、生成方式、打包策略) https://blog.csdn.net/RandomXM/article/details/88642534 基础知识介绍 什么是ShaderVariant 在写shader时,往往会在shader中定义多个宏,并在shader代码中控制开启宏或关闭宏时物体的渲染过程。最终编译的时候也是根据这些不同的宏来编译生成多种组合形式的shader源码。其中每一种组合就是这个shader的一个变体(Variant)。 Material ShaderKeywords与ShaderVariant Material所包含的Shader Keywords表示启用shader中对应的宏,Unity会调用当前宏组合所对应的变体来为Material进行渲染。 在Editor下,可以通过将material的inspector调成Debug模式来查看当前material定义的Keywords,也可在此模式下直接定义Keywords,用空格分隔Keyword。 在这里插入图片描述 在程序中,可用Material.EnableKeyword()、Material.DisableKeyword()、Shader.EnableKeyword()、Shader

unity shader 空间坐标转换

萝らか妹 提交于 2020-01-27 11:53:46
空间转换 v2f vert ( a2v v ) { v2f o ; //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。 o . vertex = UnityObjectToClipPos ( v . vertex ) ; //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。 o . vertex = UnityObjectToClipPos ( v . vertex ) ; //模型坐标转为世界坐标,因为要计算绝对位置 o . pos = mul ( unity_ObjectToWorld , v . vertex ) ; //将坐标转为裁剪空间,否则就无法正常可视化 o . pos = mul ( UNITY_MATRIX_VP , o . pos ) ; //输出法线 = 转换后的世界坐标法线 float3 worldNormal = UnityObjectToWorldNormal ( o . normal ) ; //从世界坐标转换到裁剪空间的坐标信息 pIn . pos = mul ( UNITY_MATRIX_VP , p [ 0 ] . pos ) ; //从世界坐标转换到裁剪空间的坐标信息 pIn1 . pos = mul ( UNITY_MATRIX_VP , pos ) ; //当前的模型观察矩阵, 用于将顶点/方向数据从模型空间变换到观察空间

Unity-LightMap

泪湿孤枕 提交于 2020-01-27 10:25:45
烘焙:把灯光信息写到贴图里 比如影子 AO 这样就可以不用实时灯光 是节省硬件资源的一种较好的方法 Realtime GI(Global Illumination),实时全局光照 首先来说说GI是干啥的,非常粗略的来描述下,如果说我们以前的光照系统就是由光源 - 物体 - 视点组成的话,那么全局光照系统就是由光源 - n多环境反射光 - 物体 - 视点。就是说GI额外包括了环境反射光的计算,它可以使得渲染出来的场景物体间的光影交互更为真实。但是这个方式的代价很大,所以基本上采用的是预渲染技术而不是实时计算。 如果是离线烘焙的话,n多的环境反射光就是通过辐射度算法或者是光线追踪算法一点点计算出来的,但是实时渲染没有这么多的时间。为了实现实时的GI,简单的说来,Unity(Enlighten GI)需要预计算一些信息,这些信息大概包括场景间物体之间的位置、反射关系,以及一个环境反射树(这些都是我瞎猜的),在实时渲染时,利用这些信息Unity会动态生成一张间接光照贴图,像原先的Lightmap一样只不过上面记录的是物体表面受到间接光的信息,这样在实时渲染时就会看到物体受到反射光的影响了。 不过多数情况下如果说你的场景中不存在光线变化或是动态的自发光材质,还是固定镜头的话(没错,我说的就是RPG),GI对于游戏来说仍然是没有用处的

unity 委托delegate的理解

扶醉桌前 提交于 2020-01-27 05:27:54
unity中的委托类似于c/c++中的函数指针 直接上代码 public class delegateTest : MonoBehaviour { // Start is called before the first frame update void Start() { //用法1 GoodMorning(GoodMorningChinese); //用法2 m = GoodMorningEnglish; m(); //用法3 匿名委托 GoodMorning(delegate { Debug.Log("aaaaa"); }); } delegate void MorningLanguage();//声明一个委托 (类似函数指针,指向参数为空,返回值为void的函数) MorningLanguage m; //实例化一个委托的对象 void GoodMorning(MorningLanguage ml)// { ml();//参数是空的 } void GoodMorningChinese()//某一个参数为空,返回值为void的函数 { Debug.Log("早上好"); } void GoodMorningEnglish() { Debug.Log("good morning"); } } 来源: CSDN 作者: Murphy402 链接: https://blog

Unity编辑器录屏神器:Unity Recorder

跟風遠走 提交于 2020-01-26 22:45:41
摘要:汇报工作进展时你还在使用截屏或者录屏软件?来试试Unity Recorder插件,一站解决截屏、录屏、全景图、全景视频的录制,特别对于异形、超大分辨率有奇效。(本插件仅能在Unity编辑器中使用) 你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。 大智和小新在这里给你拜年啦!春节只能宅家里,那就用Unity做一些好玩的东西吧! 小新:“智哥,我最近接了个小项目,今天需要汇报工作进展,要录个屏,不过我遇到问题了!” 大智:“啥问题?” 小新:“要是普通的录屏倒是简单,录屏软件整上,搞定。不过这个项目的分辨率有些奇葩,是8000*1200的分辨率,我用录屏软件录不出来这么大啊,我又没有这么大分辨率的显示器。” 大智:“那你有没有找到什么可行的方案?” 小新:“我在网上看了说要什么在程序里面截图写文件,然后把这些截图再转成视频,感觉好麻烦哦,有没有简单的方法?” 大智:“那必须有的,用Unity Recorder这个插件。” 小新:“好熟悉…好熟悉…哦!我想起来了,上次讲Timeline最后提到过!” 大智:“对,一看你就没实际去操作去用,遇到实际问题就没想到吧?” 小新挠挠头:“嘿嘿。” 大智:“去复习总结一下吧。” Unity Recorder插件 Unity Recorder是一个编辑器中的录制工具( 仅能用于编辑器中 )

【Unity|C#】(2)——异常处理

邮差的信 提交于 2020-01-26 15:30:02
【学习资料】 > 在线文档 官方文档: https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程: https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院、Siki学院 【笔记】 try 一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。 catch 程序通过异常处理程序 捕获异常 。catch 关键字表示异常的捕获。 finally finally 块用于执行给定的语句, 不管异常是否被抛出都会执行 。 例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。 throw 当问题出现时,程序 抛出一个异常 。使用 throw 关键字来完成。 C#中内置的异常类型 C# 中的异常类主要是直接或间接地派生于 System.Exception 类。 System.ApplicationException 和 System.SystemException 类是派生于 System.Exception 类的异常类。 System.ApplicationException :支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。 System.SystemException :是所有预定义的系统异常的基类。 下表列出了一些派生自

【Unity|C#】(3)——文件读写(I/O类)

狂风中的少年 提交于 2020-01-26 15:09:57
【学习资料】 > 在线文档 官方文档: https://docs.microsoft.com/zh-cn/dotnet/csharp/ 菜鸟教程: https://www.runoob.com/csharp/csharp-tutorial.html > 视频教程 腾讯学院、Siki学院 【笔记】 文件操作 File / FileInfo / FileStream        https://www.runoob.com/csharp/csharp-file-io.html 文本读写 StreamReader / StreamWriter        https://www.runoob.com/csharp/csharp-text-files.html 二进制读写 BinaryReader / BinaryWriter    https://www.runoob.com/csharp/csharp-binary-files.html 目录操作 DirectoryInfo        https://www.runoob.com/csharp/csharp-windows-file-system.html 来源: https://www.cnblogs.com/shahdza/p/12234207.html

关于Unity,Button点击无反应

半城伤御伤魂 提交于 2020-01-26 10:05:47
问题出现的原因 网上的相关原因都找了,也没有**“ UI相互覆盖的问题 ”**,我一开始以为的" UI覆盖 "问题是两个被加了button脚本的按钮相互覆盖,但是我实际运行时胜利和失败的同一位置按钮可以正常点击,而当我写了暂停相关的按钮后就出了问题. 后来发现,我的暂停按钮需要一直出现在界面,所以我没有disable掉它,而我的胜利和失败界面则一开始都是为disable状态, 但是我的暂停按钮和胜利界面的按钮并没有重合,怎么会冲突 ,那是因为我为暂停按钮的父级写了一个渐变效果, 这是一个矩形覆盖了整个游戏界面 , 并且我是后来才写的暂停按钮,所以理所当然的它出现在了hierarchy的最下层也就是挡住了胜利界面。 解决方法:把它拖到最顶层就好了,通过这个bug更好理解了ui,同时说明预先disable掉ui是种很好的选择?或者说将enable的ui对象放置在最上层,同时还要避免相互之间的冲突? 来源: CSDN 作者: Sprinkble 链接: https://blog.csdn.net/xiongzhen159753/article/details/103809244

Unity AssetBundle自动化打包

六月ゝ 毕业季﹏ 提交于 2020-01-26 06:49:03
//先批量创建配置Prefab,方便AB包加载后导入场景 private void CreatePrefab ( GameObject obj , string path ) { PrefabUtility . CreatePrefab ( path + "/" + obj . name + ".prefab" , obj , ReplacePrefabOptions . ConnectToPrefab ) ; AssetDatabase . SaveAssets ( ) ; } //清理所有AssetBundle名字 private void ClearAssetBundleName ( ) { foreach ( var abName in AssetDatabase . GetAllAssetBundleNames ( ) ) { AssetDatabase . RemoveAssetBundleName ( abName , true ) ; } AssetDatabase . RemoveUnusedAssetBundleNames ( ) ; } //设置路径下打包文件AssetBundle名和后缀 private void SetAssetImport ( string Assetpath ) { //获取路径下所有文件及子目录路径 var paths =

Unity苹果内购

喜欢而已 提交于 2020-01-26 06:00:42
Unity内购IAP的二三事 Unity端 iOS平台进行打包 Unity端 这里需要使用Unity内置的IAP插件,下载IAP插件的方式:Window–>Services–>In-App Purchasing(这个就是unity内置的内购插件),点击把OFF->ON 点击之后会有个询问是否是对13岁以下儿童设计的游戏,按照情况勾选,之后点击continue进入安装界面,点击input安装 下面的Options是谷歌商店支付相关的,可以空着不用管它。 下载好插件之后会包含IAP内购的Demo,可以点击查看效果,此Demo在Unity上运行点击购买会出现一个fakeStore界面,在真机测试中会弹出正常IP的支付界面。 此时当你下载好IAP插件点击Window后会发现多出来一个UnityIAP选项,这时插件就已经安装好了。 当安装好插件后,有两种方式实现IAP内购: 一、使用IAPButton按钮 这种方法可以在层级界面点击右键可以看到UnityIAP->IAPButton,在要生成支付按钮的位置生成它,它就是一个挂载IAPButton脚本的Button按钮。 Product ID是设置在Unity端你要购买物品的ID,它是与你在APPStore上设置的购买项目在Unity端的映射,这个ID可以自己设定,点击下面IAP Catalog可以设定这个映射关系。