
Unity3D
文章平均质量分 87
本专栏梳理了Unity相关技术栈
little_fat_sheep
图形学领域爱好者,未来将在图形渲染(OpenGL、LibGDX、Filament、Unity3D、UE)、图形编解码(FFmpeg)等领域长期深耕。
展开
-
【Unity3D】Unity3D技术栈
本文梳理了笔者在学习 Unity3D 的过程中,对 Unity3D 的理解和学习路线,以帮助读者循序渐进地学习 Unity3D,后续笔者仍会持续更新 Unity3D 相关技术栈,并同步到本文中。原创 2023-01-19 00:47:49 · 46084 阅读 · 50 评论 -
【Unity3D】Unity与Android交互
本文主要介绍 Unity 打包发布 Android apk 流程、基于 AndroidJavaObject(或 AndroidJavaClass)实现 Unity 调用 Java 代码、基于 UnityPlayer 实现 Java 调用 Unity 代码,官方介绍见→Android。原创 2023-10-24 23:35:59 · 5966 阅读 · 6 评论 -
【Unity3D】资源管理
Unity 中资源管理方案主要有 Resources、TextAsset、ScriptableObject 、AssetDatabase、PlayerPrefs、Addressables、AssetBundle、SQLite,本文将介绍其中大部分方案。原创 2023-09-14 23:53:45 · 2405 阅读 · 1 评论 -
【Unity3D】UI Toolkit数据动态绑定
本文将实现 cvs 表格数据与 UI Toolkit 元素的动态绑定。如果读者对 UI Toolkit 不是太了解,可以参考以下内容。UI Toolkit简介UI Toolkit容器UI Toolkit元素UI Toolkit样式选择器UI Toolkit自定义元素// 便于在UI Builder中导入自定义UI, 需要有无参构造函数// 模板容器// 角色属性。原创 2023-09-12 17:06:26 · 2488 阅读 · 1 评论 -
【Unity3D】UI Toolkit自定义元素
UI Toolkit 支持通过继承 VisualElement 实现自定义元素,便于通过脚本控制元素。另外,UI Toolkit 也支持将一个容器及其所有子元素作为一个模板,便于通过脚本复制模板。如果读者对 UI Toolkit 不是太了解,可以参考以下内容。UI Toolkit简介UI Toolkit容器UI Toolkit元素UI Toolkit样式选择器1)UI 搭建。原创 2023-09-10 16:49:43 · 1579 阅读 · 0 评论 -
【Unity3D】UI Toolkit样式选择器
UI Toolkit简介中介绍了样式属性,本文将介绍样式选择器(Selector),主要包含样式类选择器(Class Selector)、C#类选择器(Type Selector)、名称选择器(Name Selector)、通用选择器(Universal Selector)、后代选择器(Descendant Selector)、子选择器(Child Selector)、多重选择器(Multiple Selector)、伪类选择器(Pseudo Class)等。样式选择器官方介绍见→。原创 2023-09-05 23:36:52 · 2467 阅读 · 0 评论 -
【Unity3D】UI Toolkit元素
UI Toolkit简介 中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit容器中介绍了 VisualElement、ScrollView、ListView、GroupBox 等容器,UI Toolkit样式选择器中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,本文将介绍 UI Toolkit 中的元素,主要包含 Label、Button、TextField、Toggle、Radio Button、Slider、Progress Bar、Drop原创 2023-09-04 14:18:56 · 3367 阅读 · 0 评论 -
【Unity3D】UI Toolkit容器
UI Toolkit简介中介绍了 UI Builder、样式属性、UQuery、Debugger,UI Toolkit元素中介绍Label、Button、TextField、Toggle、Radio Button、Slider、Progress Bar、Dropdown、Foldout 等元素,UI Toolkit样式选择器中介绍了简单选择器、复杂选择器、伪类选择器等样式选择器,本文将介绍 UI Toolkit 中的容器,主要包含 VisualElement、ScrollView、ListVie原创 2023-09-01 23:04:59 · 3510 阅读 · 0 评论 -
【Unity3D】UI Toolkit简介
UI Toolkit 是一种基于 Web 技术的 GUI 框架,是为了解决 UGUI 效率问题而设计的新一代 UI 系统(UGUI 的介绍详见→UGUI概述)。与 UGUI 不同,UI Toolkit 没有采用 GameObject 的方式,而是参考了 Web 技术的 XML 和 CSS 方案。这意味着它只保存变化的数据,而不是整个界面状态,这使得它具有更高的效率。UI Toolkit 的历史可以追溯到 Unity 2018 年发布的 UIElement,起初主要用于 Editor原创 2023-08-30 17:30:07 · 10251 阅读 · 3 评论 -
【Unity3D】水面特效
本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节。深水区和浅水区颜色差异;水面有波纹,并且在移动;水面起伏波动;水面边缘有水泡;水中物体因折射而扭动。原创 2023-08-22 23:32:27 · 4123 阅读 · 1 评论 -
【Unity3D】程序纹理简单应用
Rotate 节点用于对 uv 坐标进行旋转变换,Polar Coordinates 节点用于将直角坐标系下的 uv 坐标转换为极坐标系下的坐标,Checkerboard 节点用于生成棋盘网格,Combine 节点用于将多个通道的输入合并为一个向量,详见→。说明:Border 节点是 1)节中创建的子图,用于计算边框的颜色和透明度,Rotate 节点用于对 uv 坐标进行旋转变换,Polygon 节点用于生成多边形纹理,Rounded Polygon 节点用于生成圆角多边形纹理,详见→。原创 2023-08-21 12:16:35 · 1076 阅读 · 0 评论 -
【Unity3D】Shader Graph节点
Shader Graph 16.0.3 中有 208 个 Node(节点),本文梳理了 Shader Graph 中大部分 Node 的释义,官方介绍详见→。选中节点后,右键弹出菜单栏,点击 Open Documentation(或 按 F1 键),浏览器中将跳转到该节点的官方释义网页。Shader Graph 通过图像的形式表达了顶点变换和片元着色流程,其背后都是一系列的数学理论支撑着,为更好地理解 Shader Graph 中的 Node,推荐读者学习以下内容。渲染管线空间和变换。原创 2023-08-13 20:15:43 · 5980 阅读 · 3 评论 -
【Unity3D】Renderer Feature简介
3D 项目迁移至 URP 项目后,会出现很多渲染问题,如:材质显示异常、GL 渲染不显示、多 Pass 渲染异常、屏幕后处理异常等问题。下面将针对这些问题给出一些简单的解决方案。3D 项目中,我们在MonoBehaviour的生命周期的 OnRenderImage 方法中实现屏幕后处理(详见→调整屏幕亮度、饱和度、对比度)。但是,在 URP 项目中,OnRenderImage 方法不会回调。所幸,Unity 为我们提供了 Rnederer Feature(详见第 3 节),为屏幕后处理提供了一个解决原创 2023-08-08 20:46:30 · 3748 阅读 · 2 评论 -
【Unity3D】消融特效
选中物体消融特效中基于 Shader 实现了消融特效,本文将基于 Shader Graph 实现消融特效,两者原理一样,只是表达方式不同,另外,选中物体消融特效中通过 discard 丢弃片元,本文通过 alpha 测试丢弃片元。Shader Graph环境搭建、简单应用详见→Shader Graph简介。原创 2023-08-06 16:43:30 · 1366 阅读 · 0 评论 -
【Unity3D】花瓣特效
我们在 xOz 平面上绘制花朵,假设花心为 O 点,其世界坐标为 _Center, 花瓣个数为 _PetalNum,花瓣半长度和半宽度分别为 _PetalLength、_PetalWidth,背景、花心、花蕊、花瓣的颜色分别为 _BackgoundColor、_HeartColor、_StamenColor、_PetalColor;如下图是实现的花瓣特效效果,为方便描述,我们将每个红色的扁状长条称为花瓣,每个花瓣中心的绿点称为花蕊,花朵的正中心称为花心。为简化计算,我们定义旋转零度方向为 z 轴正方向。原创 2023-08-05 21:57:56 · 1597 阅读 · 0 评论 -
【Unity3D】Shader Graph简介
Shader Graph 是 Unity 官方在 2018 年推出的 Shader 制作插件,是图形化的 Shader 制作工具,类似于 Blender 中的 Shader Editor 和 UE 中的 Material Editor,它使用流程图的形式表达顶点变换和片元着色的流程,通过节点(Node)的连接实现各种复杂的特效,关于节点的介绍详见→Shader Graph节点。原创 2023-08-02 22:25:08 · 3941 阅读 · 0 评论 -
【Unity3D】地面网格特效
本文实现了地面网格特效,包含以下两种模式:实时模式:网格线宽度和间距随相机的高度实时变化;分段模式:将相机高度分段,网格线宽度和间距在每段中对应一个值。原创 2023-07-22 18:51:27 · 2049 阅读 · 0 评论 -
【Unity3D】Cesium加载大地图
Cesium 是一个地球可视化平台和工具链,具有数据切片、数据分发、三维可视等功能。Cesium 支持 JS、Unity、Unreal、O3DE、Omniverse 等平台,框架如下。https://www.cesiumlab.com/CesiumLab地理信息基础数据处理平台使用手册.pdf。原创 2023-07-20 22:08:03 · 4649 阅读 · 4 评论 -
【Unity3D】伽马校正
在早期,CRT(Cathode Ray Tube,阴极射线管)几乎是唯一的显示设备,它有一个特性,输入电压和显示亮度不是线性关系,而是伽马函数关系,并且其 γ 值刚好是伽马编码函数的 γ 值的倒数,这正好补偿了图像捕捉设备的伽马编码造成的亮度非线性问题。伽马空间中,Unity 不会对 Shader 的输入和输出进行任何处理,因此,输入的像素可能是非线性的,输出的像素经过显示器的伽马解码处理后可能会得到非预期的亮度,通常表现为场景整体变暗。处理后,再存入 jpeg 等格式图片文件中,在读取图片文件时,通过。原创 2023-07-16 22:57:24 · 1699 阅读 · 0 评论 -
【Unity3D】动态路径特效
本文通过导航系统(NavMeshAgent)和线段渲染器(LineRenderer)实现了角色走迷宫和绘制路径功能,同时实现动态路径特效。导航系统分离路面导航动态路障导航。线段渲染器LineRenderer。动态路径特效的原理是:通过对顶点的 uv 纹理坐标平移实现路径节点的移动效果。原创 2023-07-09 21:23:07 · 2682 阅读 · 1 评论 -
【Unity3D】选中物体消融特效
当前实现消融特效的方法主要有 Alpha 测试消融、clip(或 discard)消融,它们的本质都是随机丢弃一些片元,以实现消融效果。为模拟随机效果,可以通过对噪声纹理进行采样实现,如下是一些常用的噪声纹理。这些噪声有一个共同特点:在小的邻域范围内,灰度是渐变的,使得模拟的消融效果更加和谐。Alpha 测试消融原理:将片元的 alpha 通道设置为随机值,通过 AlphaTest 剔除 alpha 值小于阈值的片元,以实现消融效果,代码如下。案例见→固定管线着色器二。由于改变了 alpha 通原创 2023-07-07 01:13:29 · 1403 阅读 · 0 评论 -
【Unity3D】素描特效
中讲述了普通光照的渲染原理,实现的效果比较贴近真实世界(照相写实主义,Photorealism),非真实渲染(Non-Photorealism Rendering,NPR)在照相写实主义的基础上添加了一些风格处理,如:卡通、水彩、素描等风格。线条采样方法:先计算顶点对应的漫反射强度,假设为 diffuse,再根据 diffuse 所处的区间在多个素描纹理(如下)中采样。素描特效不直接渲染漫反射效果,而是通过线条的疏密程度表现漫反射效果,即:较亮处线条稀疏,较暗处线条密集。原创 2023-06-27 23:40:02 · 1070 阅读 · 2 评论 -
【Unity3D】平面光罩特效
屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将沿用激光雷达特效中重构像素点世界坐标的方法,实现平面光罩特效。shieldHeight < height - lineWidth:渲染背景颜色,即 tex2D(_MainTex, i.uv);shieldHeight > height + lineWidth:渲染遮罩与背景的混合颜色;原创 2023-06-23 18:30:24 · 1410 阅读 · 0 评论 -
【Unity3D】基于深度和法线纹理的边缘检测方法
边缘检测特效中使用屏后处理技术,通过卷积运算计算梯度,检测每个像素周围像素的亮度差异,以识别是否是边缘像素;选中物体描边特效中也使用了屏后处理技术,通过 CommandBuffer 获取目标物体渲染后的模板纹理,并将模板纹理模糊化,使得模板纹理的边缘向外扩张,再将模糊化后的模板纹理与原纹理进行合成,得到描边后的纹理;基于模板测试和顶点膨胀的描边方法。原创 2023-06-22 17:45:55 · 2153 阅读 · 0 评论 -
【Unity3D】流动雾效
屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将介绍使用深度纹理重构屏幕像素点在相机坐标系下的坐标计算方法,并使用重构后的坐标模拟雾效。雾效即离观察者越远的点越趋近于雾的颜色,并且雾的浓度越大。本文将使用屏幕后处理技术,计算每个顶点与相机的距离,并根据距离计算雾的浓度,依据浓度给该像素点混合原始颜色与雾效颜色。原创 2023-06-21 22:49:21 · 3177 阅读 · 2 评论 -
【Unity3D】激光雷达特效
Q 点在近平面上,可以通过近裁剪平面的四个角插值得到,O 和 near 为定值,因此 (OQ / near) 也可以通过插值得到。对于屏幕上的任意一点,它对应的世界坐标系中的点记为 P,对应的近裁剪平面上的点记为 Q,相机位置记为 O(坐标为 _WorldSpaceCameraPos),假设 P 点的深度为 depth(由 LinearEyeDepth 函数获取),相机到近平面的距离为 near,如下图所示。其中,公式 2 由三角形相似原理得到,公式 2 由 O、P、Q 三点共线得到。原创 2023-06-18 14:05:53 · 3735 阅读 · 0 评论 -
【Unity3D】屏幕深度和法线纹理简介
深度纹理本质是一张图片,图片中每个像素反应了屏幕中该像素位置对应的顶点z值相反数(观察坐标系),之所以用 “反应了”而不是 “等于”(或 “对应” ),因为深度纹理中颜色的值域是 [0, 1],而顶点z值相反数不一定在该区间,另外顶点 z值相反数与深度纹理不是线性关系(透视投影引起的)。法线纹理本质也是一张图片,图片中每个像素的 R、G值对应该点法线向量的x、y 值(观察空间),z值通过公式 z =sqrt(x * x + y * y)计算得到。深度纹理和法线纹理可以用于边缘检测特原创 2023-06-13 00:35:47 · 2461 阅读 · 0 评论 -
【Unity3D】运动模糊特效
开启混合(Blend)后,通过Alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合,当有物体运动时,就会将当前位置的物体影像与历史位置的物体影像进行混合,从而实现运动模糊效果。第一个 Pass通过Alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合,通过 ColorMask RGB保证融合不影响Alpha通道值;第二个Pass对当前屏幕的Alpha通道进行采样,通过 ColorMask A保证采样不影响RGB通道的值。原创 2023-06-04 16:40:12 · 2199 阅读 · 1 评论 -
【Unity3D】Bloom特效
Bloom 特效是指:将画面中较亮的区域向外扩散,造成一种朦脓的效果。实现 Bloom 特效,一般要经过 3 个阶段处理:亮区域检测、高斯模糊、Bloom 合成。根据亮度阈值检测亮区,如下从原图中提取亮区域。将高斯模糊处理后的亮区域图像与原图像叠加。对亮区域进行高斯模糊(原理见→。),使得亮区域往外扩散,并产生朦脓效果。原创 2023-06-03 21:48:41 · 2585 阅读 · 0 评论 -
【Unity3D】高斯模糊特效
我们将用于模糊处理的卷积核称为模糊算子,它一般满足以下条件:卷积核中权值上下对称、左右对称;卷积核中每个权值大于或等于 0,小于 1;卷积核中所有权值之和为 1。 我们将所有权值都为 1 / n(n 为权值个数)的卷积核称为平均模糊算子;将权值随位置变化且符合高斯分布(或正太分布)的卷积核称为高斯模糊算子(或高斯核),它较好地模拟了邻域中每个像素对当前处理像素的影响程度(距离越近,影响越大)。σ是标准差,其值越大,高斯分布函数的图像越矮胖,一般取值为 1,x、y为当前位置到卷积核原创 2023-06-03 18:00:23 · 2363 阅读 · 1 评论 -
【Unity3D】边缘检测特效
边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色。周围像素的亮度差异计算,也需要使用卷积运算。对于每个像素的周围像素,我们可以给它赋予一个权值,对这些像素的亮度进行加权求和,将该加权和记作该点的一个特征值,我们可以根据该特征值决策该点是否显示为边缘色。为方便描述上述运算,我们将周围像素的权值序列记作卷积核,将加权运算记作卷积运算。原创 2023-06-03 01:12:40 · 1951 阅读 · 0 评论 -
【Unity3D】调整屏幕亮度、饱和度、对比度
在 OnRenderImage 方法里,通常使用 Graphics.Blit 方法完成对纹理的处理,如下是常用的 Bilt 方法,source 是源纹理,dest 是目标纹理,mat 是进行屏幕后处理的材质,用户可以在该材质绑定的 Shader 中实现屏幕后处理特效。用户通过 CommandBuffer.DrawRenderer和Graphics.ExecuteCommandBuffer也可以实现Graphics.Blit效果。在Shader中,用户也可以通过 GrabPass抓取屏幕图像。原创 2023-05-31 01:03:55 · 3455 阅读 · 0 评论 -
【Unity3D】广告牌特效
广告牌特效是指:空间中的一个 2D 对象始终(或尽可能)面向相机,使得用户能够尽可能看清楚该 2D 物体。广告牌特效一共有以下 3 种:正视广告牌:广告牌始终以正视图姿态面向相机,即广告牌的 x、y、z 轴正方向始终指向相机的 x、y、z 轴正方向;血条广告牌:游戏中的血条效果广告牌,广告牌可以绕世界坐标系的 y 轴旋转,使其尽可能面向相机,即广告牌的 x 轴正方向始终指向相机的 x 轴正方向,y 轴正方向始终指向 (0, 1, 0) 方向,z 轴正方向可以随相机位置和姿态变动;测距广告牌。原创 2023-05-28 18:58:12 · 2934 阅读 · 6 评论 -
【Unity3D】反射和折射
立方体纹理(Cubemap)和天空盒子(Skybox)中介绍了生成立方体纹理和制作天空盒子的方法,本文将使用立方体纹理进行采样,实现反射、菲涅耳反射和折射效果。另外,本文还使用了 GrabPass 抓取屏幕图像,替代立方体纹理,作为折射的采样纹理。立方体纹理采样原理:从世界坐标系的坐标原点出发,发射一条射线,与边长为 1 的立方体相交(其中心在坐标原点,并且每个面与对应坐标轴垂直),交点位置的像素即为采样的像素。原创 2023-05-23 01:36:25 · 1923 阅读 · 2 评论 -
【Unity3D】立方体纹理(Cubemap)和天空盒子(Skybox)
立方体纹理是指由上、下、左、右、前、后 6 张纹理组成的立方体结构纹理,其主要用于天空盒子、环境映射、反射、折射等场景。天空盒子用于渲染场景背景,需要将相机的Clear Flags属性设置为Skybox才能使用天空盒子。原创 2023-05-21 16:20:26 · 4212 阅读 · 0 评论 -
【Unity3D】魔方
1)魔方渲染模块用户选择魔方阶数,渲染指定阶数的魔方;2)魔方整体控制模块用户 Scroll 或 Ctrl + Scroll,控制魔方放大和缩小;用户 Drag 空白处(或右键 Drag),控制魔方整体连续旋转;用户点击翻面按钮(或方向键,或 Ctrl + Drag,或 Alt + Drag),控制魔方翻面;用户点击朝上的面按钮,控制魔方指定面朝上;可以实时识别用户视觉下魔方的正面、上面、右面;3)魔方局部控制模块用户点击刷新按钮,打乱魔方;用户 Drag 魔方相邻的两个方块,控制该层旋原创 2023-04-19 21:15:59 · 5751 阅读 · 5 评论 -
【Unity3D】阴影原理及应用
如果当前 Shader 文件中没有 LightMode 为 ShadowCaster 的 Pass,就去 Fallback 指定的 Shader 中继续寻找,如果仍没有找到,就继续去 Fallback 里寻找,直到找到了 ShadowCaster Pass 或没有 Fallback,如果最后找到了,Unity 会使用该 Pass 更新光源的阴影映射纹理。注意:投射阴影和接收阴影开关可以独立控制,不相互依赖,因此,一个物体可以只投射阴影而不接收阴影,也可以只接收阴影而不投射阴影。其原理是:先生成相机的。原创 2023-03-30 23:57:55 · 3107 阅读 · 0 评论 -
【Unity3D】法线贴图和凹凸映射
漫反射和镜面反射光照计算使用了法线向量、灯光向量、观察向量,但是它们所处的坐标系不相同,为方便计算光照,需要统一坐标系,即将纹理法线向量由切线坐标系转换到世界坐标系,或者将灯光向量和观察向量由世界坐标系转换到切线坐标系。其中,_ModelColor、_LightColor0 分别表示模型颜色、灯光颜色,UNITY_LIGHTMODEL_AMBIENT 表示环境光强度,normal、lightDir、viewDir、halfDir 分别表示法向量、灯光向量、观察向量、半向量(见上图,它们都已归一化)。原创 2023-03-24 00:09:07 · 1784 阅读 · 0 评论 -
【Unity3D】空间和变换
Unity 局部空间、世界空间、裁剪空间、屏幕空间都采用左手坐标系,只有观察空间采用右手坐标系。左右手坐标系除了坐标系朝向(旋向性)不同,还存在以下差异:左手坐标系下旋转正方向的定义遵循左手法则,右手坐标系下旋转正方向的定义遵循右手法则;左手坐标系下向量叉乘遵循左手法则。Unity局部空间世界空间裁剪空间屏幕空间都采用左手坐标系,只有观察空间采用右手坐标系。左右手坐标系除了坐标系朝向(旋向性)不同,还存在以下差异:旋转正方向的定义旋转正方向的定义向量叉乘向量叉乘。原创 2023-02-23 01:01:57 · 7067 阅读 · 13 评论 -
【Unity3D】Shader常量、变量、结构体、函数
Unity Shader 常量、变量、结构体、函数一般可以在 Unity Editor 安装目录下面的【Editor\Data\CGIncludes\UnityShader】目录下查看源码,主要源码文件如下:UnityCG.cgincUnityShaderUtilities.cgincUnityShaderVariables.cginc原创 2023-02-12 16:39:06 · 5510 阅读 · 1 评论