unity

【Unity】GUI(二)

早过忘川 提交于 2020-02-10 23:56:07
上一章介绍了GUI的基础概念:什么是GUI、GUI的两种模式(immediate mode, retained mode)。本章详细介绍如何使用基于retained mode 的GUI编辑系统。 1. 创建Canvas Canvas是一切GUI元件的基础,所有的GUI都必须附在Canvas上(Unity官方原文是 All UI elements must be children of a GameObject that has a Canvas component attached. )。 Canvas有三种渲染模式 Screen Space - Overlay 所有的UI元件都渲染在屏幕视野的最顶层( 没有相机时,Canvas上的UI也能照常渲染 )。无论相机对准何处、摄影角度如何、与Canvas的距离有多远,UI的大小样貌会一直保持不变(因为与相机不相关, without reference with camera ),屏幕大小、分辨率改变了,UI也会跟着自动调整适应( automaitcally rescale to fit )。 特点: (1)UI大小不会受相机的影响,屏幕大小、分辨率改变时UI能自动缩放以适应。 (2)UI不会被游戏内物体遮挡 Sreen Space - Camera UI元件大小不会因相机远近、拍摄位置、角度而改变

UnityGameFramework学习笔记 1 简介

与世无争的帅哥 提交于 2020-02-10 20:26:27
简介 这个框架市面上已经有大型网游在使用了,在官网上也有很多大佬做的教程(萌新伊卡参上) 开始学习之前先吹一波Ellan大大的Game Framework 以下简介出自 https://gameframework.cn/ Game Framework 是什么? Game Framework 是一个基于 Unity 引擎的游戏框架,主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量。 适用于所有 Unity 5.3.0 及以上的版本,即包括 5.3.x、5.4.x、5.5.x、5.6.x、2017.x.x、2018.x.x 和 2019.x.x。 在最新的 Game Framework 版本中,包含 18 个内置模块,后续还将开发更多的扩展模块供开发者使用。 基础和工具 – 关于日志、引用池、工具集的文档。 全局配置 (Config) – 存储一些全局的只读的游戏配置,如玩家初始速度、游戏初始音量等。 数据结点 (Data Node) – 将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据。 数据表 (Data Table) – 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。 调试器 (Debugger) – 当游戏在 Unity

Unity Shader Early-Z技术

老子叫甜甜 提交于 2020-02-09 23:06:08
Early-Z技术 传统的渲染管线中,ZTest其实是在Blending阶段,这时候进行深度测试,所有对象的像素着色器都会计算一遍,没有什么性能提升,仅仅是为了得出正确的遮挡结果,会造成大量的无用计算,因为每个像素点上肯定重叠了很多计算。 因此现代GPU中运用了Early-Z的技术,在Vertex阶段和Fragment阶段之间(光栅化之后,fragment之前)进行一次深度测试,如果深度测试失败,就不必进行fragment阶段的计算了,因此在性能上会有很大的提升。但是最终的ZTest仍然需要进行,以保证最终的遮挡关系结果正确。 前面的一次主要是Z-Cull为了裁剪已达到优化的目的,后一次主要是Z-Check,为了检查,如下图: Early-Z的实现,主要是通过一个Z-pre-pass显示,简单来说,对于所有不透明的物体(透明的没有用,本身不会写入深度),首先用一个超级简单的shader进行渲染,这个shader不写入颜色缓冲区,只写深度缓冲区,第二个pass关闭深度写入,开启深度测试,用正常的shader进行渲染。其实这种技术,我们也可以借鉴,在渲染透明物体时,因为关闭了深度写入,有时候会有其他不透明的部分遮挡住透明的部分,而我们其实不希望他们被遮挡,仅仅希望被遮挡的物体半透,这时我们就可以用两个pass来渲染,第一个pass使用Color Mask屏蔽颜色写入,仅写入深度

unity Camera.main.X找不到

萝らか妹 提交于 2020-02-09 14:39:28
在unity中编辑camera的脚本时遇到了这个问题 想要去访问并修改Camera的相关属性以期达到操纵主相机的目的,但是main老是找不到 原因: 脚本名称/类名设置成Camera了! 解决方法: 1. 使用 UnityEngine.Camera.main 代替 Camera.main 使用 2. 修改摄像机的脚本名/类名(只要不是Camera即可) 来源: https://www.cnblogs.com/yocichen/p/12287033.html

unity接入bugly无法显示C#错误行号

被刻印的时光 ゝ 提交于 2020-02-08 18:48:34
项目上线后在bugly后台收集到一些c#的错误日志,如下所示: 可以看到堆栈信息,但看不到具体的行号,这对于一个函数中有多行代码的逻辑来说只能说帮助有限. 在unity社区发现目前并不支持release发布的l2cpp的版本显示行号,于是我尝试改为develop+mono进行打包测试,结果如下: 这次可以正常显示行号了,为了确认是develop+mono才能正常显示,我又试了试release+mono,结果如下: 跟release+l2cpp有点类似,可以看到堆栈,但仍然看不到行号,只是堆栈地址不再是00000000000,而变成aa376b8e5f9f41dbbb82909ca4c277f4了 目前googleplay必须用l2cpp打64位包进行上传,因此也不再深究这个堆栈地址有什么意义了. 总结:目前要想在bugly中看到c#异常的堆栈信息和明确的行号,必须使用develop+mono版进行打包,否则是看不到的. 目前无法获得具体行号,只知道哪个函数里的某行逻辑出错了,目前能做的只有把这个函数里的逻辑进行拆分,拆到多个函数里逐个调用,每个函数尽量保持最小切分粒度,然后放线上等下次报错了,无奈. 好消息 :unity官方说正在开发release+l2cpp版提供明确出错行号的功能,预计会在unity2020的某个版本里发布,参考链接如下: https://forum.unity

【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader

浪子不回头ぞ 提交于 2020-02-08 09:38:50
本文为翻译,附上 原文链接 。 转载请注明出处—— polobymulberry-博客园 。 动机 如果你满足以下条件,我建议你阅读这篇教程: 你想学习片段着色器(Fragment Shader)。 你想实现复杂的多通道着色器(multipass),但是对其不是很了解。 你想使用上面提到的两种技术(片段着色器和多Pass)来实现描边效果的Toon shader,你就需要理解这两种技术的概念。 学习资源 Martin Kraus's fantastic Wiki Book GLSL Programming/Unity 引论 在教程的第4部分,我们创建了一个相当好的toon shader,该shader使用了边缘光照(rim lighting)对模型进行描边 — 但是这种方法的问题在于它只能使用在表面光滑的模型上。对于那些平整的,有棱角的表面,我们计算其边缘的法向量时,会发现两个面的边界法向会产生突变(比如正方形的六个面,单个面上的法向都一致,但是两个面之间的法向会发生突变,不像球面上的法向是渐变的),这将产生我们不想要的边界效果。 有一个更好的办法对模型进行描边效果处理 — 先将模型背面稍微扩大一些(边缘延伸一些)然后渲染为全黑,最后正常渲染模型正面即可,这样我们看到的黑色边缘其实是背面呈现的颜色。这就要求在shader中使用两个Pass — 你可能还记得

Unity图文混排

半世苍凉 提交于 2020-02-07 07:58:50
一.打图集 将生成的json文件与图集放入项目中(如果使用其他地方也需要用图集就生成Unity类型的) 需要注意的是图集最好打成正方形的 否则会被拉伸成正方形 二.生成asset文件 1)Json格式的打开SpriteImporter 将生成的json文件和图集设置上去 点击create 并保存 2)Unity类型(需要导出插件 Asset Store中下载 TextMeshPro Text在第三步写了) 直接右键创建出来 三.导入插件 导入Import TMP Essential Resources 和 Import TMP Examples and Extras 可以修改TMPSettings里的默认设置(默认使用的图集) 四.使用 创建TextMeshPro Text 在Text中设置文字 <sprite=1> 就可以引用默认图集中的图片 如果想引用其他图集中的图片<sprite=“图集名” index=1> 就可以引用其他图集中的图片了 五.注 如果图片位置不对 可以修改asset文件中的属性调整图片的位置 OX OY 下方的Global Offests &Scale 可以将所有图片一起修改 来源: CSDN 作者: 不流逝的年华丶 链接: https://blog.csdn.net/weixin_46034566/article/details/103944387

Unity生命周期

一个人想着一个人 提交于 2020-02-07 04:39:32
Awake ->OnEable-> Start -> -> FixedUpdate-> Update -> LateUpdate ->OnBecameVisible ->OnBecameInvisible -> OnDisable ->OnDestroy 1.Awake:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次. Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游 戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息Awake总是在Start之前被调用。 它不能用来执行协同程序。 2.Start:仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake 的不同是Start只在脚本实例被启用时调用。你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。 在所有脚本实例中,Start函数总是在Awake函数之后调用。 3.FixedUpdate:固定帧更新,在Unity导航菜单栏中,点击“Edit”–>“Project Setting”–>“Time”菜单项后,右侧的Inspector视图将弹出时间管理器,

unity学习笔记(脚本生命周期)

我的未来我决定 提交于 2020-02-07 04:04:05
脚本生命周期 脚本代码使用技巧 using System . Collections ; using System . Collections . Generic ; using UnityEngine ; /// <summary> /// /// </summary> public class LifeCycle : MonoBehaviour { public int a = 100 ; //序列化字段 作用:在编辑器中显示私有变量 [ SerializeField ] private int b ; //作用:在编译器中隐藏字段 [ HideInInspector ] public int c ; //设置数据范围 [ Range ( 0 , 100 ) ] public int d ; public LifeCycle ( ) { //Debug.Log("Hello"); } //初始阶段 //执行时机:创建游戏对象--》立即执行(早于Start) //作用:初始化 private void Awake ( ) { //Debug.Log("Awake--" + Time.time); } //执行时机:创建游戏对象--》脚本启用--》才执行 //作用:初始化 private void Start ( ) { //Debug.Log("Start--" + Time

unity3d中脚本生命周期(MonoBehaviour lifecycle)

岁酱吖の 提交于 2020-02-07 03:54:31
最近在做一个小示例,发现类继承于MonoBehaviour的类,有很多个方法,于是乎必然要问出一个问题:这么多个方法,执行先后顺序是如何的呢?内部是如何进行管理的呢?于是在网上找了许多资料,发现了Richard Fine在2012年就已经发布了一篇文章,而且讲得算是相当深入,并且很有道理的,这里加上我的一些尝试与思考,分享给大家。 先贴上图,大家有个直观认识: 接下来,做出一下讲解:最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其它的任何方法,都将不再被执行。 如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable,当然我们可以在另外一个脚本中实现这个脚本组件的启动:this.enab=true; 再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。这是个什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将不再被执行。比如说:第一次启用时,将怪物的初始位置定在了(0,0,0)点,然后怪物可能会发生了位置的变换,后来被禁用了,再次启用时