在之前Unity想要实现延迟执行或者是等待,要么只能使用自己计数的方法,要么使用协程。
Ep.1 协程首先让我们来看一个协程示例:
示例是循环10次,每次等待0.2s。
协程示例1234567891011IEnumerator Func(){ for (int i = 0; i < 10; i++) { print(i); yield return new WaitForSeconds(0.2f); }}//启动协程StartCoroutine(Func());
Ep.2 Async 异步
Async异步的概念是微软基于多线程提出的Task解决方案,相比传统多线程具有很多优势。
:heart:相比协程来说,异步的方式不需要搭建基础的协程框架(不需要新创建一个方法),可以直接在方法中使用关键字实现等待。
不需要启动
Async示例12345678async void AsyncFunc(){ for (int i = 0; i < 10; i++) ...
因为第一章内容太少,就再更一章吧~
第二篇 渲染流水线Q:渲染流水线在干什么?
A:渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等。
使用流水线的好处在于可以提高单位时间的生产量。
流水线系统中决定最后生产速度的是最慢的工序所需的时间(短板效应)
理想情况下,如果把一个非流水线系统分成n个流水线阶段,且每个阶段耗费时间相同的话,会使整个系统得到n倍的速度提升。(多线渲染?)
渲染流程(概念上的流水线)
渲染流程分成3个阶段:应用阶段(Application Stage)、几何阶段(Geometry Stage)、光栅化阶段(Rasterizer Stage)。
应用阶段这个阶段是由我们的应用主导的,因此通常由CPU负责实现。主要包含三个任务:
12graph LR准备场景数据 --> 粗粒度剔除culling--> 渲染图元and输出渲染所需几何信息
几何阶段几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在 ...
致自己
之前我学习过一段时间的Shader入门精要(大概是学到第六章吧),但后面的章节都没有学习,加上时间久远很多内容都忘记了,故打算重新学一遍。
为了勉励自己坚持下去,也为了记录一些学习过程,此系列就出现啦!
:heart: :heart:
(希望自己能够坚持学完,在渲染方面有所收获,可以制作出满意的效果)
:bookmark_tabs: 此系列每周一更
第一篇 欢迎来到Shader的世界语录
程序员的三大浪漫是编译原理、操作系统和图形学(是的,我已经听到很多人在反驳这句话了,不要当真啦)
我们是程序员中的“外貌协会”,期待着用代码编写出一个绚丽多姿的世界。这就是我们的浪漫。
我们之所以要学习Shader,是想要学习如何把物体按照自己的意愿渲染到屏幕上,但是,Shader只是整个渲染流程中的一个子部分。
和C++这样的高级语言不同,尽管Shader的编写语言已经达到了我们可以理解的程度,但Shader更多地是面向GPU的工作方式,所以它的一些语法对我们来说并不那么直观。
基础篇大纲1-4章
第2章 渲染流水线 这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对 ...
除去三大功能外,NodeCanvas还有一些别的有趣的东西,能帮助我们改进3大流程。
Standalone Action List
给对线添加如上脚本后,我们可以在对象上进行一些可视化的对话构建。
自定义Action和Condition
我们可以自定义自己的节点,方便我们在3大功能上使用。
生成脚本如下:
生成的行为123456789101112131415161718192021222324252627282930313233343536373839using NodeCanvas.Framework;using ParadoxNotion.Design;namespace NodeCanvas.Tasks.Actions{ [Category("my")] [Description("输出一些内容")] public class Mylog : ActionTask{ //Use for initialization. This is called only once in the lifet ...
主要功能
基础功能都有,具备良好的扩展性。
播放对话
对话音效
分支对话
概览对话
条件对话
……
快速食用添加脚本
添加角色并给角色添加
编写对话树
启动对话树
默认是不启动对话树的,可以在代码中控制启动也可以在属性面板设置游戏开始时启动。
12345678public DialogueTreeController dialogueTreeController;private void Update(){ if (Input.GetKeyDown(KeyCode.X)) { dialogueTreeController.StartBehaviour(); }}
为了保证对话正确显示,在UI层需要添加官方的预制体和事件系统监听
存在的问题待学习
:question:NodeCanvas的对话树似乎 在显示富文本内容时存在问题。例如使用颜色代码,会出现输出颜色代码之后再实现效果的问题
:question: 其配置的UI显示界面不清楚是如何进行绑定的
FSM有限状态机是一种设计方式,用于处理不同状态的切换
其主要包含以下几个部分:
状态(进入、更新、离开)
过渡条件 【用于控制状态的切换】
状态机控制器【用于控制状态机】
本文主要介绍NodeCanvas的FSM使用,具体基础FSM概念不做解释。
FSM示例图
开始为游戏对象添加如下脚本:
结点类型NodeCanvas中结点分为几个类型:
Action State(动作状态,只处理进入状态)
Super Action State (超级动作状态,能处理进入、更新、离开状态)
Pass(过渡态,不做任何处理)
Parallel(并行。 在状态机处于任意状态时,并行执行)
Any State(能够从任意状态进行状态切换,在状态机过程中,时刻监听)
结语在FSM中,也没什么太多可以讲的,其条件和行为结点为NodeCanvas行为树、状态机、对话树所共用。
个人感觉,NodeCanvas设计最棒的一点就是,他三种系统用的同一个底层,而且可以互相嵌套兼容。
认识行为树
什么是行为树?自顶向下的树形结构
行为树Behavior Tree 是一种数据结构,自顶向下的树形结构。
什么情况下要使用行为树?情况多变,条件复杂
在处理逻辑复杂的问题时,这个复杂可能是条件复杂,情况多样。
行为树并非是游戏Ai的专属,在处理其他复杂业务逻辑或可能时都可以尝试用行为树来解决。
行为树有什么优点?高效可读,易于扩展
行为树解决的问题是将复杂的关系,简单化,能很大程度的加强程序的可读性,健壮性。
行为树由哪几部分组成?主要由四部分 CDAC 组成 ,两根两叶
1234Composites 组合节点 只能作为根节点,控制子节点的执行(顺序)Decorator 装饰节点 只能作为根节点,修饰子节点Actions 行为节点 只能作为叶子节点,执行具体动作Conditinals 条件节点 只能作为叶子节点,判断条件
行为树的工作流程?自顶向下,从左至右(并发进行),逐层进行
行为树执行的成果(成功/失败),由其子节点决定,子节点执行完成后会向父节点传递成功/失败的 ...
本文采用:unity2021.1.5f1c1 HDRP渲染管线
开始创建HDRP项目,并设置好相关配置。
搭建的场景如图所示:
:small_orange_diamond:认识VFX Graph创建一个VFX Graph可以点击Edit进入编辑界面,其编辑界面和ShaderGraph类似。
:small_blue_diamond: 编写Graph孵化器循环
针对于持续性和非持续性进行区分
初始化粒子
完成上述2个步骤时,效果如下,记得替换粒子的贴图
渲染粒子
通过渲染器设置,火花效果更好了
更新粒子-使用重力现在我们的火花是直线发射的,我们想让其受到一个重力自动下垂。
在更新粒子模块,增加重力,设置一个随机数重力。
添加重力后,可以看到我们的粒子受重力而下垂。
:heart:完善火花发射形状
Local和World坐标
在布局坐标中,粒子效果不会残留,为了让我们的火花可以在世界中残留,需该为世界坐标系
添加碰撞
我们希望火花粒子能够和周围环境产生碰撞
碰撞框添加如下碰撞框组件:
其中:LifeTime Loss为生命损失
发现我们的粒子在接触 ...










