- 博客(258)
- 收藏
- 关注
原创 UE GAS 属性集
我们需要实现一个简单的属性集,里面有生命值和最大生命值等属性,这些属性能够复制,以及有一些获取设置属性的函数。下面是属性集中的属性,可以网络复制注意网络复制的属性需要重写 virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override;同时处理复制后的通知使用自带的宏GAMEPLAYATTRIBUTE_REPNOTIFY为了方便定义一些获取设置属性的方法我们自己对原本设置的宏整理成一个专门设置的宏。
2025-11-30 20:47:48
864
原创 UE GAS 基础能力以及播放蒙太奇并等待
我们可以抽象出来一层,避免我们的能力直接继承UGameplayAbility,我们可以对通用的一些能力功能放到基类中,比如一些调试开关。
2025-11-22 17:07:09
258
原创 UE GAS 能力
Instanced Per Actor+ Local Predicted)是一个非常经典和通用的组合,适用于绝大多数由玩家主动释放、需要保持内部状态(如冷却)且要求高响应速度的技能。Instanced Per Actor 让你可以在技能对象里方便地管理状态。Local Predicted 让玩家的操作几乎没有延迟,体验流畅。
2025-11-20 19:38:48
690
原创 UE GAS AbilitySystemComponent 能力系统组件
本文介绍了UE GAS(AbilitySystemComponent)能力系统组件的初步使用方法。主要内容包括:1)根据角色类型选择ASC组件的附加位置(玩家角色附加到PlayerState,敌人等附加到Actor本身);2)使用前的插件和模块导入准备;3)实现IAbilitySystemInterface接口以获取ASC组件;4)区分AvatarActor和OwnerActor的概念(玩家角色两者不同,敌人相同);5)在多人联网环境下正确初始化ASC组件(玩家在服务器获得控制权后初始化,敌人在BeginP
2025-11-19 19:59:38
335
原创 UE GAS 核心部件
作用:ASC 是 GAS 的“中枢神经系统”,必须附加到游戏中的 Actor(如角色、怪物或物体)上。它负责统一管理该 Actor 的所有能力相关逻辑,包括:存储和跟踪该 Actor 的 Gameplay Abilities(技能)、Gameplay Effects(效果)和 Attribute Sets(属性集合)。处理技能的激活、冷却、中断和资源消耗(如魔法值)。广播事件(例如技能开始或结束),以便其他系统(如 UI 或动画)响应。
2025-11-19 19:14:55
812
原创 C++ 多线程(三)
dwCreationFlags 控制线程的标准,0为一开始就执行,#define CREATE_SUSPENDED 0x00000004 为开始挂起。WaitForSingleObject 是类似lock一样的上锁,后面的参数为等待的时间。为了更方便的使用多线程,UE中有Runnable,仿造UE的实现,实现一个简易版本的。我们创建的子线程名称是系统自动生成的,如果我们需要自己修改创建的名称该如何处理?和之前的std的线程一样都是使用一样的api。lpName 锁的名称。
2025-08-05 20:55:08
651
原创 C++ 多线程(二)
一些简单临时的异步任务可以使用async创建,对应需要将任务放到线程池或者自己管理的线程中则可以使用packaged_task。当使用async时,传入launch::async是执行在子线程,而若使用launch::deferred 是执行在主线程。同理的还有try_lock_for、try_lock_until 以及 wait_for、wait_until。sleep_for 是睡眠多少时间,而sleep_until 是睡眠到某一时间点。这种异步任务和之前的async有什么区别呢?
2025-08-02 14:24:59
428
原创 C++ 多线程(一)
如下是定义一个线程其开始运行有两种方式,一个是阻塞当前调用进程,一个是异步的方式不会阻塞当前调用的进程join会阻塞当前调用的进程detach不会阻塞当前调用进程。
2025-07-27 22:25:52
870
原创 C++ 分配内存释放内存
让我们定义如下的对象public:cout << "构造函数调用" << endl;cout << "析构函数调用" << endl;int a = 0;int b = 0;然后使用new和malloc分配内存,使用delete和free分别释放free(p_m1);我们会发现最终只有new 和 delete 配对的方式走了生命周期那我们把他们换过来配对会怎么样呢free(p_n1);可以看到:delete 释放都会调用析构函数,而free都不会调用。
2025-07-21 22:10:56
717
原创 C++ 异常处理、typeid
std::exception是所有标准异常类的基类。直接派生类有:bad_alloc, bad_cast, bad_exception, bad_typeid, logic_error, runtime_error。logic_error的派生类表示程序逻辑错误,包括:domain_error, invalid_argument, length_error, out_of_range。
2025-07-16 19:59:18
774
原创 C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例
左值:有名字、有地址的对象。右值:临时对象,没有名字。左值引用(T&):只能绑定左值,用于别名。右值引用(T&&):只绑定右值,用于移动语义。std::move:让左值变成右值引用。std::forward:在泛型编程中保持值类别。记住核心目的:右值引用和移动语义是为了避免不必要的拷贝,提升性能。
2025-07-14 21:57:22
599
原创 C++ 模板元编程 type_traits
可以看到下图的源码,定义了一个泛型模板,一个特化模板,由于优先匹配特化模板若没有匹配再去找泛化模板的顺序,故实现了此功能!比如我们只想根据传入函数参数的类型来进行限定可以使用enable_if。答案就是模板的匹配,true匹配一个模板,false匹配另外一个模板。这样可以限定传入参数的类型,根据不同类型的参数做不同的操作。根据前面的知识我们可以知道,这样是不相同的。为了之后我们的例子,先创建一些测试的类型。可以看到如下代码,去除前后的变化。可以看到运行后的结果。那么是如何实现的呢?
2025-07-13 14:17:39
378
原创 C++ 模板工厂、支持任意参数代理、模板元编程
模板元编程(Template Metaprogramming,简称TMP)是C++的一项强大技术,利用模板系统在编译期进行计算、生成代码和执行逻辑。如下是对核心语法 (Object->*Function)(std::forward<>(Param)…如下图,我们使用可变参数实现了不同遍历的赋值操作,但是每次赋值都会产生拷贝,我们继续优化。使用 #include <type_traits> 下的forward函数,避免拷贝。我们可以用如下模板创建,但是有个弊端,我们无法为创建的对象进行赋值。
2025-07-12 20:22:00
427
原创 C++ 模板参数展开
在 C++ 模板元编程中,typename 关键字在这里起着关键作用,主要用于解决依赖名称的解析问题。>::Type 是依赖于模板参数 N 和 ParamTypes…下一步:FSpawnIndex<1,1,2> : FSpawnIndex<0,0,1,2>下一步:FSpawnIndex<2,2> : FSpawnIndex<1,1,2>继承:FSpawnIndex<3> : FSpawnIndex<2,2>匹配终止条件:FSpawnIndex<0,0,1,2>参数包变为 0,1,2。
2025-07-10 22:16:26
377
原创 C++ 模板宏相关
可以看到我们把模板定义到.h中实现在.cpp中编译时会报错,应该把实现也放到一起可以用.hpp文件来组织\ 表示宏没有结束2个# 表示拼接名称VA_ARGS获取变长参数(只能出现在宏定义的可变参数模板中)\ public :\ Code;\ };\ };\ };\ };\ };T。
2025-07-06 18:18:08
667
原创 C++ 模板参数匹配、特化
当多个模板可能匹配时,编译器按以下优先级选择:完全特化:最具体匹配部分特化:更特化匹配主模板:最通用匹配。
2025-07-05 22:06:54
403
原创 C++ 变长参数、折叠表达式
含义:(((init op pack1) op pack2) …含义:(((init op pack1) op pack2) …(packN op init)))含义:((pack1 op pack2) op pack3) …二元右折叠:(arg1 << (arg2 << (arg3 << init)))一元左折叠:(((arg1 + arg2) + arg3) + …二元左折叠:(((100 - arg1) - arg2) - …二元左折叠:(((100 - arg1) - arg2) - …
2025-07-05 09:48:29
1079
原创 UE5 游戏模板 —— ThirdPersonGame
本文介绍了UE5第三人称游戏模板的实现方法。主要讲解了角色初始化的关键参数设置,包括旋转控制(bUseControllerRotation系列参数)、移动方向控制(bOrientRotationToMovement)以及相机组件设置(bUsePawnControlRotation)。同时展示了输入系统的实现代码,涵盖了跳跃、移动和视角控制等功能。该模板基于Character基类搭建,可快速实现第三人称角色控制,强调输入响应和视角分离,为后续扩展动画和物理交互提供基础框架。
2025-06-22 20:22:29
677
原创 UE5 游戏模板 —— FirstShootGame
本文介绍了UE5第一人称射击游戏模板的实现。通过ShooterPickUpComponent实现武器拾取功能,使用动态多播委托触发蓝图事件;ShooterWeaponComponent处理武器附着、射击功能,生成子弹并播放效果;ShooterProjectile组件利用UE内置功能实现子弹轨迹和碰撞检测。文章还讲解了UE中的单播/多播委托机制,以及角色移动输入的实现方式。这种组件化设计提高了代码复用性,便于衍生不同武器类型。虽然是入门模板,但展示了UE5游戏开发的模块化设计思路和事件系统应用。
2025-06-21 20:16:05
1001
原创 UE5 游戏模板 —— TopDownGame 俯视角游戏
这篇文章介绍了UE5引擎中TopDownGame模板的使用方法,重点讲解了模块导入、GameMode设置、PlayerController输入系统配置、Character初始化以及射线检测的实现。主要内容包括:1)如何使用AIModule等关键模块;2)PlayerController如何通过EnhancedInput系统处理鼠标/触摸输入,实现角色移动和寻路;3)Character的相机设置;4)射线检测原理及其在不同场景下的应用。文章通过代码示例展示了如何实现点击移动、特效播放等功能,为开发俯视角游戏提
2025-06-18 22:08:58
965
原创 UE5 游戏模板 —— Puzzle 拼图游戏
其余的函数主要是设置点击后的材质切换,注意这里的材质需要加上UPROPERTY 是因为避免材质被主动释放,加上属性宏标签防止释放。这里还有一个细节为什么一个是UMaterial 其余的是UMaterialInstance 是因为,UMaterialInstance是材质实例,是由UMaterial转换过来的,只需要修改颜色值即可。Pawn 自然有些游戏行为去操纵,在PuzzleGame这个例子中的输入都由Pawn进行,在Pawn中主要是发射射线检测碰撞。Pawn可以是人、动物、NPC、等…
2025-06-17 20:54:13
1135
原创 C# 实现Lru缓存
代码实现的基本原理就是使用链表,当某个元素被访问时(Get或Set)就将该元素放到链表的头部或者尾部(根据用户自己定义规则即可)当达到了缓存的最大容量时对最不常使用的元素进行移除(移除的时候可以定义一系列的规则,用于判读如何移除,是否移除)LRU 算法全称是最近最少使用算法(Least Recently Use),是一种简单的缓存策略。通常用在对象池等需要频繁获取但是又需要释放不用的地方。下面直接贴出来代码供大家参考。
2023-12-09 09:19:12
626
原创 分享一个看到的有意思的对象池(灵活对象池)
相比于传统的对象池中的对象是拿到对象之后在另外的脚本中书写逻辑,能不能给对象池中的对象都创建一个基类,创建回收或者销毁都在该池子中实现呢,并且一般的对象池不能去使用Unity常规API进行销毁其中的对象只有回收和释放,能不能有一种更自由的方式呢,根据不同的项目进行取舍即可没有最优只有最适合的方式。
2023-10-10 18:31:19
337
原创 Unity实现设计模式——适配器模式
适配器模式又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。在一个在役的项目期望在原有接口的基础上拓展,那么适配器模式是最适合的。即需要使用一个已有或新建的类,但这个类又不符合系统的接口,则可以使用适配器模式。client:需要使用适配器的对象,不需要关心适配器内部的实现,只对接目标角色。Target:目标角色,和client直接对接,定义了client需要用到的功能。
2023-10-09 09:49:12
700
原创 Unity实现设计模式——访问者模式
访问者模式(Vistor Pattern)是一种将数据结构和数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各种元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。访问者模式的基本思想是针对系统中拥有的某些固定类型的对象结构(元素),在其内部提供一个accept()方法用来接受访问者对象的访问。不同的访问者对同一元素的访问内容不同,所以使得相同的元素可以产生不同的元素结果。就是说不同的访问者访问同一个对象里面的不同属性,产生了不同的结果。
2023-10-08 15:51:52
653
原创 Unity实现设计模式——模板方法模式
模板模式(Template Pattern), 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说, 模板方法模式定义一个操作中的算法的骨架,而将这些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
2023-10-08 15:23:51
634
原创 Unity实现设计模式——策略模式
策略模式是一种定义一些列算法的方法,这些所有的算法都是完成相同的工作,只是实现不同。它可以通过相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。策略模式的 Strategy 类层次为 Context 定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。需要注意的是策略模式与工厂模式的区别简单工
2023-10-08 14:55:24
441
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1