UE伤害系统
简介伤害(Damage)是游戏中常见的概念,几乎所有的游戏都具有伤害,难怪 UE 在 Actor 中自带了承担伤害的方法。
如果让开发者自己写一套伤害系统,第一个想法应该是通过 Interface 或 Actor 组件去承担伤害逻辑,不会想到 UE 中已经提供了一个简单的伤害逻辑。
伤害的代码主要在 Actor. h 中,此外 GameplayStatics. h 封装了 Actor 的 TakeDamage 方法。没想到的是,Controller 和 PrimitiveComponent 中也有 Damage 相关的代码,Controller 可获得造成伤害时的事件,PrimitiveComponent 可在接受伤害时应用冲击力。
对 Actor 应用伤害的方法
1234567891011// Actor.hvirtual float TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, class AController* EventInstigator, AActor* Damag ...
UE材质大师
A 常用遮罩1 UV坐标系转换成笛卡尔直角坐标系
2 圆形遮罩方法一:不能用power节点代替multiply,因为power节点不支持负数运算,小于0的数都会被clamp到0。
方法二:UE材质中的Sine函数,取值范围是-1~1,周期为1(不是2pai)。
方形遮罩使用这两个节点相乘即可:
方法三:SphereMask
RadialGradientExponential(指数径向渐变)函数UV(矢量 2)(UVs (Vector 2))用于控制渐变所在的位置及其涵盖 0-1 空间的程度。
中心点(矢量 2)(CenterPosition (Vector2))基于 0-1 的渐变中心位置偏移。
半径(标量)(Radius (Scalar))源自中心的径向渐变的大小。默认值 0.5 使渐变边缘位于纹理空间边缘附近。
密度(标量)(Density (Scalar))调整此函数所产生的渐变的硬度。这个数值越大,意味着渐变越清晰。
反转密度(布尔值)(Invert Density (Boolean))对于渐变,将白色反转为黑色,并将黑色反转为白色。
DiamondGradient(钻石型渐变 ...
UEC++委托
类之间尽量保持单向依赖,使用委托就可以防止双向依赖。
委托 是一种泛型但类型安全的方式,可在 C++对象上调用成员函数。可使用委托动态绑定到任意对象的成员函数,之后在该对象上调用函数,即使调用程序不知对象类型也可进行操作。
复制委托对很安全。你也可以利用值传递委托,但这样操作需要在堆上分配内存,因此通常并不推荐。请尽量通过引用 & 传递委托。
委托函数使用 UDELEGATE 宏,支持与 UFUNCTION 相同的说明符。
1 使用方法发送者步骤:
声明委托签名 FOn...Siganature,定义参数列表 【可以简单理解为构建一个委托类】
声明委托对象【理解为实例化一个类】
在需要的位置触发委托(执行或者广播,此时所有绑定委托的观察者都会执行绑定的回调函数),需要传入参数【相当于发送消息】
观察者(接收者)步骤:**
观察者引用发送者 (即观察者知道发送者,发送者不知道观察者的存在)
在其他类中需要接收消息位置,绑定委托回调函数【接收消息,并且根据消息内容执行绑定的操作】
实现具体的执行函数内容【被触发后,实际执行的内容】
例子:为角色添加一个血条 compo ...
UEC++容器
TArray 数组TArray 是 UE4 中最常用的容器类。其速度快、内存消耗小、安全性高。TArray 类型由两大属性定义:元素类型和可选分配器。
同质容器:所有元素均为完全相同类型。
分配器常被省略,默认为最常用的分配器。 其定义对象在内存中的排列方式;以及数组如何进行扩展,以容纳更多的元素。若默认行为不符合要求,可选取多种不同的分配器,或自行编写。
Tarray 为数值类型,建议在实际操作中勿使用 new 和 delete 创建或销毁 TArray 实例。元素也为数值类型,为容器所拥有。TArray 被销毁时其中的元素也将被销毁。若在另一 TArray 中创建 TArray 变量,其元素将复制到新变量中,且不会共享状态。
创建和填充数组如要创建数组,将其以此定义:
1TArray<int32> IntArray; //创建用于存储整数序列的空白数组
元素类型是可根据普通 C++值规则进行复制和销毁的数值类型,例如 int32、FString、TSharedPtr 等。
由于无指定分配器,因此 TArray 将采用基于堆的默认分配器。
此时尚未分配内存。
有多种填 ...
UEC++类型
一、属性 UPROPERTY属性声明属性使用标准的 C++变量语法声明,前面用 UPROPERTY 宏来定义属性元数据和变量说明符。UPROPERT 宏作为声明序言的变量可被引擎执行垃圾回收,也可在虚幻编辑器中显示和编辑。
12UPROPERTY([specifier, specifier, ...], [meta(key=value, key=value, ...)])Type VariableName;
属性说明符声明属性时,属性说明符 可被添加到声明,以控制属性与引擎和编辑器诸多方面的相处方式。
``
实例:实例化到场景中的原型:未实例化,比如直接点开蓝图
注意:EditAnyWhere 可以分别在实例和原型修改值。如果实例没有修改,则值始终等于原型中的值。如果实例修改了,则覆盖原型中的值。
属性标签
效果
AdvancedDisplay
属性将被放置在其出现的任意面板的高级(下拉) 部分中。
AssetRegistrySearchable
AssetRegistrySearchable 说明符说明此属性与其值将被自动添加到将此包含为成员变量 ...
Unity编辑器扩展
1 GUI/GUILayout[[《GUI》#GUI]]
关键字:GameView GUI, MonoBehaviour.OnGUI()
UnityEngine. GUI :可以用于运行时(在 Game 视图中显示)/ 编辑器(诸如在 Inspector)面板下显示相关 UI 组件与内容,需要自行计算 Rect [[1 前言]] ( https://zhuanlan.zhihu.com/p/503154643#ref_1 )
Rect这个类型在编辑器拓展中十分常见,官方解释为A 2D Rectangle defined by X and Y position, width and height.一个由 X,Y 坐标,width,height 宽高定义的 2D 矩形其以左上角为坐标原点,X 往右递增,Y 往下递增更加详细介绍可参照:Unity Rect 官方文档
UnityEngine. GUILayout :是基于 GUI 的实现,自动进行排版,计算坐标与宽高。
2 EditorGUI/EditorGUILayout关键字:编辑器扩展,Editor,E ...
UEC++指针
1 ObjectPtr
[!bug] Title
声明 UObject 指针的地方都可以用 TObjectPtr 替换
但是函数返回类型仍然要使用原始指针!
在 UE5 中,新增了对象指针类型 FObjectPtr/TObjectPtr,以提供编辑器下动态解析和访问追踪功能。很多引擎类的 UPROPERTY 的 UObject* 的裸指针也被替换成了 TObjectPtr<UObject>(例如 AActor 的 RootComponent 成员)。而在非编辑器下,TObjectPtr<UObject > 会退化为 UObject*,从而避免额外的运行时开销。
本文将从源码的角度对 FObjectPtr/TObjectPtr 对象指针的原理做一些简要的分析,并提供使用建议以及示例代码。
动机:为什么要引入 FObjectPtr/TObjectPtr 对象指针类在 UE4 中,很多引擎类型的成员是 UObject* 裸指针,其中只记录内存地址。由于内存地址在每次运行时都会发生变化,这就给编辑器下的序列化静态保存、延迟加载等带来了不便。此外 ...
模板与泛型编程
OOP 能处理类型在程序运行之前都未知的情况,在泛型编程中,在编译时就能获知类型。
[!NOTE] Title
函数模板和类模板成员函数的定义通常放在头文件中
模板程序应该尽量减少对参数类型的要求,即追求通用性
编写泛型代码的两个重要原则:
模板中的函数参数是 const 的引用。保证了函数可以用于不能拷贝的类型
函数体条件判断使用 < 可以用标准库自带的函数对象 less<Type> 代替。
注意模板编程不支持分离式编译,即模板类 / 模板函数的声明与定义应该放在头文件里,否则会在链接时报错;
1 模板参数通常将模板参数设为 T,也可以用任意名字
模板参数名不可重用
1template <typename T, typename T> //错误,重用T
模板声明与函数参数相同,声明中的模板参数的名字可以和定义中不同
1234567//3个ca1c都指向相同的函数模板template <typename T>T calc(const T&,const T&); //template <typena ...
LeetCode笔记
一、数组01 二分查找 (折半查找)性能优异,仅适用于有序的顺序表
二分查找:每次将中间位置的数与 key 比较,若相等则查找成功,不等则选择前半部分或后半部分继续查找。由于顺序表是有序的,所以中间位置与前面和后面元素的关系也是确定(例如,在升序表中,前面元素<中间位置<后面元素。若给定值 key 大于中间元素,则查找的元素只能在后半部分)
时间复杂度:$O (log_n)$
二分查找704. 二分查找 - 力扣(LeetCode)
给定一个 $n$ 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 $target$,如果目标值存在返回下标,否则返回 $-1$。
123输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4
123输入: nums = [-1,0,3,5,9,12], target = 2 输出: -1 解释: 2 不存在 nums 中因此返回 -1
提 ...
Unity Primer
零、工作原理反射机制
[!NOTE] 反射
程序正在运行时,可以查看其它程序集或者自身的元数据。一个运行的程序查看本身或者其它程序的元数据的行为就叫做反射
在程序运行时,通过反射可以得到其它程序集或者自己程序集中代码的各种信息,比如类,函数,变量,对象等等我们可以实例化它们,执行它们,操作它们
Unity 开发的本质就是在 Unity 引擎的基础上,利用反射和引擎提供的各种功能进行的拓展开发。
场景中对象的本质是什么?GameObject 类对象是 Unity 引擎提供给我们的,作为场景中所有对象的根本。在游戏场景中出现一个对象,不管是图片、模型、音效、摄像机等等都是依附于 GameObject 对象。拟人化记忆: GameObject 就是没有剧本的演员。
除了 Transform 这个表示位置的标配脚本外,我们可以为这个演员 (GameObject)关联各种剧本(脚本 ),让它按照我们剧本中 (代码逻辑中)的命令来处理事情而为演员添加剧本的这个过程,就是在利用反射 new 一个新的剧本对象和演员 (GameObject)对象进行关联,让其按我们的命令做事。
Unity 场景文 ...