单一职责模式:包括装饰器模式和桥模式
装饰器模式
过度的使用继承会导致类膨胀,而使用组合则可以避免类膨胀,但是组合的缺点在于无法复用父类的方法,而装饰器模式可以实现复用父类的方法,同时也可以扩展功能。
more >>面向对象:
面向对象的设计原则:
虚幻引擎为了多平台的特性,对线程实现进行封装,抽象为FRunnable类,使用时需要继承FRunnable类,并重写Init、Run、Exit函数。
Init中执行所有内容的初始化,如果初始化失败将自行退出线程并返回错误代码,否则将会执行Run函数,Run函数中逻辑执行完毕后将调用Exit函数退出线程。
我们创建一个类并继承FRunnable,重写Init、Run、Exit函数。
1 | class UMyThread : public FRunnable |
堆(Heap):堆是一棵完全二叉树,且满足以下性质:
以小顶堆为例,因为堆是一棵完全二叉树,所以可以使用数组来模拟堆。
假设我们现在有一数组,可以将该数组调整为堆,调整时,需要从最后一个非叶子节点开始调整,因为叶子节点没有孩子节点,所以调整时,只需要调整非叶子节点即可,它的整体调整过程是自下而上然后自上而下的。
调整过程:比较节点与它的左右孩子。将最小的节点放在父节点。
假设有一数组需要调整为堆,数组下标从0开始,从n/2-2位置开始调整,一直到0的位置。
假如要调整为大顶堆,代码如下:
本段代码将数组调整为一个大顶堆,若要调整为小顶堆,只需要改变比较条件即可(将大于号改为小于号)——将最大值置于父节点。
在新版虚幻引擎中,Niagara已经集成到引擎中,无需额外安装。
在Edit-Plugins-FX中可以找到Niagara,勾选后重启编辑器即可。
安装完成后在内容浏览器中右键可以在FX中找到包含Niagara的内容。
这里只是在C++和蓝团中如何使用Niagara,并不自己创建Niagara,关于如何创建可以参考官方文档。
要使用Niagara,首先要将Niagara的模块添加进入工程中:
打开工程,在build.cs中添加:”Niagara”,使该模块添加如工程中。
需要在C++中创建一个NiagaraSystem,并添加到需要使用的物体上。
1 | //添加头文件 |
对使用函数作出实现:
1 | void ProjectName::FireNiagara() |
在蓝图中使用就很简单了,直接搜索Spawn System Attach 或者 Spawn System at Location,参数于C++中相同,直接按照需求填入即可。
只是使用现成的System并没有什么难度,但自己实现一个Niagara比普通粒子效果要复杂得多。
更多细节以及API可以查看官方文档:
https://docs.unrealengine.com/4.27/zh-CN/RenderingAndGraphics/Niagara/
https://docs.unrealengine.com/4.27/en-US/API/Plugins/Niagara/UNiagaraFunctionLibrary/
https://docs.unrealengine.com/4.27/en-US/API/Plugins/Niagara/UNiagaraComponent/
反射是虚幻引擎中的基础技术,虚幻中的细节面板、序列化、垃圾回收、蓝图与C++交互等功能都依赖于反射。但原生C++并不支持反射,因此虚幻拥有一套自己的反射系统。
本文将对虚幻的反射机制进行浅析,更多信息可以查看工程文件中的generated和Marcos源码文件,里面有对反射更详细的解释。
Unreal Build Tool(UBT)和Unreal Header Tool(UHT)两个协同工作来生成运行时反射需要的数据。UBT通过扫描头文件,记录任何至少有一个反射类型的头文件的模块。如果其中任意一个头文件从上一次编译起发生了变化,那么UHT就会被调用来利用和更新反射数据。UHT分析头文件,创建一系列反射数据,并且生成包含反射数据的C++代码,放到每一个模块的generated文件中,使用标记宏标记的数据编译后可以在generated文件中看到,使用了一些宏对数据进行包装。
用生成的C++代码来存储反射数据的一个最大好处就是,它可以保证跟二进制做到同步,不会加载陈旧或者过时的反射数据,因为它是跟引擎的其它代码同时编译的,并且它会在程序启动的时候使用C++表达式来计算成员偏移等,而不是通过针对特定平台/编译器/优化的组合中进行逆向工程。
more >>基于比较的排序算法,通过不断交换元素的位置,使得排序的元素达到有序。
主要有冒泡排序和快速排序。
冒泡排序思路与实现都很简单,通过不断比较两个相邻的元素,如果第一个元素比第二个元素大,则交换两个元素的位置,这样循环一轮下来,最大的元素就浮到了最右边。
同样将数组分为待排区和有序区,实现如下:
1 | void BubbleSort(int* arr, int n) |
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true