- 博客(242)
- 收藏
- 关注
原创 C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例
左值:有名字、有地址的对象。右值:临时对象,没有名字。左值引用(T&):只能绑定左值,用于别名。右值引用(T&&):只绑定右值,用于移动语义。std::move:让左值变成右值引用。std::forward:在泛型编程中保持值类别。记住核心目的:右值引用和移动语义是为了避免不必要的拷贝,提升性能。
2025-07-14 21:57:22
256
原创 C++ 模板元编程 type_traits
可以看到下图的源码,定义了一个泛型模板,一个特化模板,由于优先匹配特化模板若没有匹配再去找泛化模板的顺序,故实现了此功能!比如我们只想根据传入函数参数的类型来进行限定可以使用enable_if。答案就是模板的匹配,true匹配一个模板,false匹配另外一个模板。这样可以限定传入参数的类型,根据不同类型的参数做不同的操作。根据前面的知识我们可以知道,这样是不相同的。为了之后我们的例子,先创建一些测试的类型。可以看到如下代码,去除前后的变化。可以看到运行后的结果。那么是如何实现的呢?
2025-07-13 14:17:39
250
原创 C++ 模板工厂、支持任意参数代理、模板元编程
模板元编程(Template Metaprogramming,简称TMP)是C++的一项强大技术,利用模板系统在编译期进行计算、生成代码和执行逻辑。如下是对核心语法 (Object->*Function)(std::forward<>(Param)…如下图,我们使用可变参数实现了不同遍历的赋值操作,但是每次赋值都会产生拷贝,我们继续优化。使用 #include <type_traits> 下的forward函数,避免拷贝。我们可以用如下模板创建,但是有个弊端,我们无法为创建的对象进行赋值。
2025-07-12 20:22:00
279
原创 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
308
原创 C++ 模板宏相关
可以看到我们把模板定义到.h中实现在.cpp中编译时会报错,应该把实现也放到一起可以用.hpp文件来组织\ 表示宏没有结束2个# 表示拼接名称VA_ARGS获取变长参数(只能出现在宏定义的可变参数模板中)\ public :\ Code;\ };\ };\ };\ };\ };T。
2025-07-06 18:18:08
561
原创 C++ 模板参数匹配、特化
当多个模板可能匹配时,编译器按以下优先级选择:完全特化:最具体匹配部分特化:更特化匹配主模板:最通用匹配。
2025-07-05 22:06:54
339
原创 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
968
原创 UE5 游戏模板 —— ThirdPersonGame
本文介绍了UE5第三人称游戏模板的实现方法。主要讲解了角色初始化的关键参数设置,包括旋转控制(bUseControllerRotation系列参数)、移动方向控制(bOrientRotationToMovement)以及相机组件设置(bUsePawnControlRotation)。同时展示了输入系统的实现代码,涵盖了跳跃、移动和视角控制等功能。该模板基于Character基类搭建,可快速实现第三人称角色控制,强调输入响应和视角分离,为后续扩展动画和物理交互提供基础框架。
2025-06-22 20:22:29
412
原创 UE5 游戏模板 —— FirstShootGame
本文介绍了UE5第一人称射击游戏模板的实现。通过ShooterPickUpComponent实现武器拾取功能,使用动态多播委托触发蓝图事件;ShooterWeaponComponent处理武器附着、射击功能,生成子弹并播放效果;ShooterProjectile组件利用UE内置功能实现子弹轨迹和碰撞检测。文章还讲解了UE中的单播/多播委托机制,以及角色移动输入的实现方式。这种组件化设计提高了代码复用性,便于衍生不同武器类型。虽然是入门模板,但展示了UE5游戏开发的模块化设计思路和事件系统应用。
2025-06-21 20:16:05
738
原创 UE5 游戏模板 —— TopDownGame 俯视角游戏
这篇文章介绍了UE5引擎中TopDownGame模板的使用方法,重点讲解了模块导入、GameMode设置、PlayerController输入系统配置、Character初始化以及射线检测的实现。主要内容包括:1)如何使用AIModule等关键模块;2)PlayerController如何通过EnhancedInput系统处理鼠标/触摸输入,实现角色移动和寻路;3)Character的相机设置;4)射线检测原理及其在不同场景下的应用。文章通过代码示例展示了如何实现点击移动、特效播放等功能,为开发俯视角游戏提
2025-06-18 22:08:58
607
原创 UE5 游戏模板 —— Puzzle 拼图游戏
其余的函数主要是设置点击后的材质切换,注意这里的材质需要加上UPROPERTY 是因为避免材质被主动释放,加上属性宏标签防止释放。这里还有一个细节为什么一个是UMaterial 其余的是UMaterialInstance 是因为,UMaterialInstance是材质实例,是由UMaterial转换过来的,只需要修改颜色值即可。Pawn 自然有些游戏行为去操纵,在PuzzleGame这个例子中的输入都由Pawn进行,在Pawn中主要是发射射线检测碰撞。Pawn可以是人、动物、NPC、等…
2025-06-17 20:54:13
831
原创 C# 实现Lru缓存
代码实现的基本原理就是使用链表,当某个元素被访问时(Get或Set)就将该元素放到链表的头部或者尾部(根据用户自己定义规则即可)当达到了缓存的最大容量时对最不常使用的元素进行移除(移除的时候可以定义一系列的规则,用于判读如何移除,是否移除)LRU 算法全称是最近最少使用算法(Least Recently Use),是一种简单的缓存策略。通常用在对象池等需要频繁获取但是又需要释放不用的地方。下面直接贴出来代码供大家参考。
2023-12-09 09:19:12
552
原创 分享一个看到的有意思的对象池(灵活对象池)
相比于传统的对象池中的对象是拿到对象之后在另外的脚本中书写逻辑,能不能给对象池中的对象都创建一个基类,创建回收或者销毁都在该池子中实现呢,并且一般的对象池不能去使用Unity常规API进行销毁其中的对象只有回收和释放,能不能有一种更自由的方式呢,根据不同的项目进行取舍即可没有最优只有最适合的方式。
2023-10-10 18:31:19
305
原创 Unity实现设计模式——适配器模式
适配器模式又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。在一个在役的项目期望在原有接口的基础上拓展,那么适配器模式是最适合的。即需要使用一个已有或新建的类,但这个类又不符合系统的接口,则可以使用适配器模式。client:需要使用适配器的对象,不需要关心适配器内部的实现,只对接目标角色。Target:目标角色,和client直接对接,定义了client需要用到的功能。
2023-10-09 09:49:12
629
原创 Unity实现设计模式——访问者模式
访问者模式(Vistor Pattern)是一种将数据结构和数据操作分离的设计模式。是指封装一些作用于某种数据结构中的各种元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。访问者模式的基本思想是针对系统中拥有的某些固定类型的对象结构(元素),在其内部提供一个accept()方法用来接受访问者对象的访问。不同的访问者对同一元素的访问内容不同,所以使得相同的元素可以产生不同的元素结果。就是说不同的访问者访问同一个对象里面的不同属性,产生了不同的结果。
2023-10-08 15:51:52
581
原创 Unity实现设计模式——模板方法模式
模板模式(Template Pattern), 指在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。简单说, 模板方法模式定义一个操作中的算法的骨架,而将这些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。
2023-10-08 15:23:51
595
原创 Unity实现设计模式——策略模式
策略模式是一种定义一些列算法的方法,这些所有的算法都是完成相同的工作,只是实现不同。它可以通过相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。策略模式的 Strategy 类层次为 Context 定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。需要注意的是策略模式与工厂模式的区别简单工
2023-10-08 14:55:24
407
原创 Unity实现设计模式——备忘录模式
它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。源发器(Originator):需要保存和恢复状态的对象。它创建一个备忘录对象,用于存储当前对象的状态,也可以使用备忘录对象恢复自身的状态。备忘录(Memento):存储源发器对象的状态。备忘录对象可以包括一个或多个状态属性,源发器可以根据需要保存和恢复状态。管理者(Caretaker):负责保存备忘录对象,但不能修改备忘录对象的内容。
2023-10-08 14:29:47
508
原创 Unity实现设计模式——迭代器模式
迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。抽象迭代器(Iterator):定义了遍历聚合对象所需的方法,包括hashNext()和next()方法等,用于遍历聚合对象中的元素。具体迭代器(Concrete Iterator):它是实现迭代器接口的具体实现类,负责具体的遍历逻辑。它保存了当前遍历的位置信息,并可以根据需要向前或向后遍历集合元素。
2023-10-07 19:30:36
552
原创 Unity实现设计模式——解释器模式
解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的模式,现实项目中用得较少。给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。下面用一个例子演示:将罗马文字转换为十进制的格式。
2023-09-29 10:40:53
683
原创 Unity实现设计模式——责任链模式
责任链模式定义:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。这里使用管理者、副总裁、总裁、依次采购商品的例子。
2023-09-28 16:33:16
1472
原创 Unity实现设计模式——状态模式
状态模式最核心的设计思路就是将对象的状态抽象出一个接口,然后根据它的不同状态封装其行为,这样就可以实现状态和行为的绑定,最终实现对象和状态的有效解耦。在实际开发中一般用到FSM有限状态机的实现,GF框架中的FSM和流程控制就是基于这个原理实现的。
2023-09-27 09:29:56
1774
原创 Unity实现设计模式——命令模式
命令模式使得请求的发送者与请求的执行者之间消除耦合,让对象之间的调用关系更加灵活。在命令模式中,会将一个命令封装成一个对象,同时命令模式也支持可撤销的操作。命令里面通常聚合接收者,初始化命令时传入接收者,调用者直接调用命令即可。
2023-09-26 10:42:14
561
原创 C# 一些工具集优化使用(String,Random,Assembly,Json)
日常开发中会有大量时间接触例如:字符串、随机数、程序集、json等的场景,像字符串使用不当就会产生大量的GC通过封装一些静态的工具方法对这些常用的地方进行适当简单优化。
2023-09-11 10:38:21
360
原创 C# Unity FSM 状态机
使用状态机可以降低代码耦合性,并且可以优化代码可读性,方便团队协作等。对于游戏开发内容来讲游戏开发的流程控制玩家动画都可以使用FSM有限状态机来实现。
2023-09-08 17:00:02
1242
原创 Unity 时间定时调度系统
之前的文章也有写过时间调度系统,但是没有支持异步调度只有回调调度,而且效率和代码可读性不是很好,下面介绍一种更优质的时间调度系统。
2023-09-06 10:24:55
1160
原创 EventSystem 事件系统
事件系统在开发中必不可少事件系统使用观察者模式可以极大程度降低程序的耦合,之前的文章也讲过事件系统但是不够高效简洁,如何轻便高效优雅的实现一个事件呢?依然基于之前的和进行开发,主要原理也是根据反射去获取事件的接口使用反射进行实例化处理类,而非人工手动订阅事件。
2023-09-02 10:02:16
806
1
原创 SingletonSystem 单例管理系统
单例模式是项目中最为常见的设计模式之一,但是写法都不够优雅不方便查找和管理,下面介绍一种使用反射实现的单例管理架构
2023-09-01 14:05:14
274
1
原创 AssemblyManager 程序集管理器
程序执行中使用反射对框架的搭建有着强大的影响,如何管理程序集方便使用反射获取类型操作对象是本文章的重点。
2023-08-30 19:31:41
260
原创 C# Unity 一个Key对应多个值的字典
C# 中没有提供一个Key对应多个值的容器,需要自己封装一层,实现方式很多,可以使用链表去实现(分区域划分一个链表即可)但是这样做比较复杂但是频繁插入要比使用List性能好一些不用动态扩展长度,有机会可以分享一下如何使用链表实现更加高效率的一个Key对应多个值,今天分享一下简单快捷便于理解的。
2023-08-27 15:57:26
1052
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人