- 博客(132)
- 收藏
- 关注
原创 UE5蓝图-汽车展示2
下面我们来完善每个ButtonUI按钮的功能。第一个按钮的功能是显示和隐藏3DUI控件,然后隐藏3DUI控件时,如果汽车门没关或者车灯开着,那么还需要让汽车门关闭和车灯关闭。我们在汽车蓝图中新创建一个Car 3DUI V/H函数用来完成第一个按钮的功能。然后创建一个SetVisibility节点来控制3DUI控件的可见性,如果SetVisibility节点的New Visibility参数的值为true就表示可见。
2025-11-12 22:53:17
1856
原创 UE5蓝图-汽车展示
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。框架这个广泛的定义使用的十分流行,尤其在软件概念。框架也能用于机械结构。框架(framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
2025-11-11 21:03:05
740
原创 UE5C++-AnimInstance
下面我们在UE5中创建一个C++类,这个C++类继承自AnimInstance类。然后我们来重载UPlayerAnim类的两个函数,这两个函数是父类UAnimInstance的虚函数,所以我们需要重写。这两个函数就类似于APlayerCharacter类的BeginPlay()函数和Trick()函数。然后在UPlayerAnim类中暴露三个属性给蓝图。然后我们来实现NativeInitializeAnimation()函数和NativeUpdateAnimation()函数。然后在VS中生成项目。
2025-11-11 09:00:51
764
原创 UE5C++-控制输入
输入映射上下文是一个定义了哪些输入键触发哪些输入动作的规则集合。它们通常与特定的游戏状态相关联,比如游戏中的主菜单、游戏中的行走状态等。可以通过编辑项目设置或蓝图脚本来创建和管理输入映射上下文。Input Action代表了玩家可以执行的某种动作,比如跳跃、射击、打开菜单等。输入动作通常与键盘按键、鼠标按钮或游戏手柄按钮相关联。可以通过编辑输入映射来创建和管理输入动作,然后可以在蓝图或代码中监听这些输入动作,以便在玩家执行相应操作时触发相应的逻辑。
2025-11-10 16:07:20
836
1
原创 UE5C++-虚幻中的C++
下面我们先创建一个空的C++项目。然后创建一个Game文件夹,在Game文件夹中创建BP蓝图文件夹和Maps关卡文件夹。然后在Maps文件夹下面创建一个关卡并保存。下面我们来创建一个C++类。此时我们看到在项目源码中就有了新建类的头文件和cpp文件。下面我们在BP文件夹下面创建一个Player文件夹,然后在Player文件夹里面创建一个蓝图类,这个蓝图类继承我们刚刚创建的PlayerCharacterC++类。然后我们给这个游戏角色添加一个骨骼。如果找不到骨骼的话,可以设置显示引擎内容。
2025-11-06 14:32:28
717
原创 UE5C++-基础知识
我们使用的IDE是Visual Studio2022。下面是安装时的一些选项。除了Visual Studio2022之外,还有一些其他的IDE,例如Code::Blocks,这个IDE很多欧美开发者使用。然后我们来设置一些配置。1.设置’Asset Editor Open Location’为’Main Window’,这个的作用是打开新窗口时在主窗口的旁边。如果不设置的话,那么打开一个新的窗口后,它会跳出来一个单独的窗口。
2025-11-04 17:15:54
735
原创 UE5蓝图-物体漂浮运动
我们先创建一个新的蓝图,类型还是Actor对象蓝图。然后我们在浮动蓝图的场景中放一个球体模型。然后将浮动蓝图放入到关卡场景中。然后我们实现一个球体自身旋转,然后上下浮动运动的效果。我们需要使用到Add Timeline时间轴节点,这个节点是在蓝图中做动画的一个节点。表示在一段时间内发生的一系列变化,这个时间可以自定义。这个节点的Play表示从0秒开始沿着时间轴播放动画;Play from Start表示播放时如果在中间停止的话,那么马上回到起始点0秒处重新开始播放;Stop表示停止;
2025-10-28 21:03:27
649
原创 UE5蓝图-物体基础运动
下面我们学习蓝图,我们先创建一个新的空项目。然后我们新建一个自己的文件夹MySelf,然后在MySelf文件夹下面创建BP文件夹用来存储蓝图类,创建Maps文件夹用来存储关卡文件。然后我们新建一个关卡,并且存储到MySelf文件夹的Maps文件夹下面。下面我们学习物体基础运动。我们在BP文件夹下面先创建一个蓝图类,蓝图类型选择Actor,然后双击打开蓝图编辑器。然后我们放置一个引擎中的模型到蓝图场景中。选中模型然后拖拽到组件栏中的DefaultSceneRoot组件下面即可。
2025-10-28 20:15:33
1045
原创 UE5基础学习
当打开UE5后,可以点击游戏中的空白项目来创建一个新的空白项目,项目默认设置中,选择蓝图(C++是程序员使用的选项),初学者内容包可以选择也可以不选,后面在项目中都可以再添加。光线追踪是UE4中的选项,UE5可以不需要选择。然后可以调整项目位置和为项目命名。这是一个空项目中的场景。我们在创建项目时,游戏那一栏的项目中除了空项目,还有第一人称游戏、第三人称游戏等项目。虽然此时我们创建的是一个空项目,但是我们可以在空项目中添加这些项目。
2025-09-01 20:58:06
1266
原创 Git原理与使用
为了能够更⽅便我们管理不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。⽬前最主流的版本控制器就是Git。Git可以控制电脑上所有格式的⽂件,例如doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!
2024-09-03 00:06:55
1425
1
原创 c++并查集
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。例如某公司今年校招共招10个人,北京招4人,河南招3人,西安招3人,10个人来自不同的学校,刚开始互相都不认识,所以每个人都是一个独立的小团体,我们给这些人进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2024-04-27 23:03:05
1741
原创 Qt 信号与槽
在 Qt 中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如 “⽤⼾点击按钮” 是⼀个事件,“⽤⼾关闭窗⼝” 也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出 “按钮被点击” 的信号,⽤⼾关闭窗⼝会发出 “窗⼝被关闭” 的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到 “按钮被点击” 的信号后,会做出 “关闭⾃⼰” 的响应动作;
2024-01-26 17:51:13
1757
原创 MySQL Connect
MySQL数据库的基础知识我们前面已经学习了,下面我们就开始学习怎么将MySQL数据库和我们学习的C/C++等语言连接。要使用C语言连接mysql,需要使用mysql官网提供的库。对于MySQL链接库中接口的使用,我们可以查阅官方文档。在MySQL的文档中,我们看到MySQL还构建了一些结构体,为了更好的使用接口函数。我们想要使用MySQL库,就必须先进行初始化,即需要先调用mysql_init函数来进行初始化。
2024-01-26 15:35:29
1592
原创 MySQL用户管理
我们前面学习MySQL数据库,一直都使用root用户来登录数据库并且进行操作。其实这样是存在安全隐患的,因为root用户是权限最高的用户,可以对所有数据库进行操作,这样数据库的安全性就会存在隐患,即如果不是自己登录了root用户,那么可以随便修改我们的数据库中的内容了。所以MySQL中就有了用户管理,通过对每个用户的权限进行设置,可以让不同的用户看到不同的数据库。
2024-01-25 22:26:41
1536
原创 MySQL视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
2024-01-25 19:57:11
467
原创 MySQL事务管理
我们在学习Linux和C++时,知道了有些程序在并发场景下会出现问题。那么如果对MySQL数据库进行CURD操作时,如果不加以控制,也是会出现问题的。例如下面的一个案例。当客户端A判断tickets表中的nums值大于0后,还没有执行update语句。此时并发执行的客户端B也判断tickets表中的nums值大于0,然后客户端B执行update语句将nums减1,然后此时客户端A也将nums减1,这样的话就造成了同一张票被卖了两次的情况。
2024-01-25 19:26:28
965
原创 Qt 概述
当我们安装了Qt Creater后,我们创建一个新项目。Build System为选择构建工具。Qt框架会在编译时自动先调用一系列的生成工具,基于我们写的代码生成一系列其它的C++代码,然后最后将这些代码进行编译。qmake是老牌的Qt构建工具了,CMake并非是Qt专属的构建工具,很多其它项目也会使用CMake构建。Qbs为Qt新一代的构建工具。我们选择qmake即可。Translation File为Qt国际化相关的内容,在这里可以选择翻译文件,我们现在暂时不关注。
2024-01-24 18:47:58
1135
原创 MySQL索引
当我们有一个海量数据的表时,在查询的时候,如果我们使用正常的sql语句进行查询,我们看下面的案例。我们先构建一个有8000000条数据的表。下面的index_data.sql文件中存储了表的创建语句和插入数据的语句,并且可以随机生成8000000条随机数据。因为需要插入8000000条数据,所以建表的过程很慢,大概需要几分钟。当emp表创建成功后,我们可以使用select语句进行数据查询,然后我们可以明显感觉到当表中数据较多时,我们使用前面学习到的普通查询语句会很耗时。
2024-01-22 15:46:02
1922
原创 MySQL复合查询
前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。下面我们来学习一些MySQL中更复杂的查询。下面的表还是来自oracle 9i的经典测试表。EMP员工表DEPT部门表SALGRADE工资等级表查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J可以看到内置函数在where子句中也是可以使用的。按照部门号升序而雇员的工资降序排序使用年薪进行降序排序。
2024-01-15 18:53:51
1228
原创 MySQL内置函数
current_函数使用date函数使用会返回参数的日期部分。date_add和date_sub使用我们看到可以在内置函数中再次调用内置函数。datediff函数创建一个记录生日的表下面我们创建一个表用来记录用户的生日。我们将birthday设为date日期类型。当我们插入数据时,我们看到正常的日期可以插入进行。并且now()函数和current_timerstamp()函数返回的日期时间类型也可以插入进行。但是为什么current_time()函数返回的时间类型也能插入进去呢?
2024-01-15 11:50:16
1770
原创 MySQL基本查询
insert into 表名 (要插入数据的列) values(数据);下面我们先创建一个students表。然后我们向表中插入数据。如果我们不指定要插入数据的列,那么就是全列插入,即我们需要为每一列都输入数据。如果我们指定了要插入数据的列,那么只需输入指定列数据即可。我们还可以进行多行插入,每一行数据之间使用逗号分割开。
2024-01-14 16:31:46
1719
原创 MySQL表的约束
前面我们在学习数据库知识时,知道了当我们向数据库中插入数据时,如果数据不合法,那么MySQL不会允许数据插入成功,这也算是MySQL对数据合法性的一种约束。但是仅仅靠这一种约束是不够的。虽然真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
2024-01-13 19:18:30
1133
原创 数据库的数据类型
下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tinyint为无符号类型时,tinyint默认为有符号类型整数。在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的下面我们向表中插入数据。我们看到当向表中插入tinyint范围内的数据时,可以成功插入。当插入的数据不在tinyint时,会直接插入失败。下面我们创建一个表t2,该表中的tinyint类型为无符号整型。
2024-01-13 15:23:02
1771
原创 c++智能指针
下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析Func函数中的问题。下面的代码中会因为异常的抛出而造成内存泄漏。例如如果在p2的new中抛出异常,那么会直接跳到异常的处理catch的代码块中,这样就没有执行Func函数中的delete p1来释放p1的内存了。而如果在div()函数中抛出异常,那么不会执行delete p1和delete p2,这样就造成了p1和p2的内存泄漏。throw "除0错误";
2024-01-12 19:14:10
1632
原创 数据库和表的操作
大写的表示关键字[] 是可选项CHARACTER SET: 指定数据库采用的字符集COLLATE: 指定数据库字符集的校验规则我们看到创建一个目录后,Linux的/var/lib/mysql下也会出现对应的目录。我们也可以在创建数据库时进行判断,如果当前数据库已存在,那么就不再创建。我们还可以在创建数据库时,指定这个数据库的字符集和校验规则。下面为创建一个使用utf8字符集的数据库。使用下面的两种方式都可以指定数据库的字符集。
2024-01-12 16:28:52
1166
原创 数据库基础
mysql本质就是一个基于C(mysql)S(mysqld)模式的一种网络服务。mysql本质上是一个网络服务。我们可以看到mysql的连接。存储数据用文件就可以了,为什么还要弄个数据库?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库。数据库本质就是对数据内容存储和查询数据的一套解决方案。
2024-01-11 19:37:38
973
原创 c++异常
终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
2024-01-11 14:30:02
996
原创 初识 Qt
命名规范类名:首字母大写,单词和单词之间首字面大写。函数名,变量名称:首字母小写,单词和单词之间首字母大写。快捷键注释:ctrl + /运行:ctrl + r编译:ctrl + b字体缩放:ctrl + 鼠标滑轮查找:ctrl + f整行移动:ctrl + shift + 上箭头或下箭头自动对齐:ctrl + i同名之间的.h和.cpp文件切换:F4帮助文档第一种方式:F1帮助文档第二种方式:左侧按键帮助文档第三种方式:在安装路径下找下面我们来自定义信号和槽函数。
2024-01-11 13:57:35
1212
原创 C++11
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2024-01-06 20:06:52
1348
1
原创 UDP协议与TCP协议
所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。端口号(Port)标识了一个主机上进行通信的不同的应用程序。在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看)。
2023-12-27 11:12:13
1998
原创 HTTPS协议
下面这个图为http和https的关系。HTTPS协议也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层。我们在学习http协议时,也分析了http协议中传输数据都是明文传输,所以是不安全的,所以才会有了https协议,https协议会将http协议发送到网络中的数据先进行加密,然后再收到数据时再进行解密,这样在网络中传输的数据就是经过加密后形成的密文,这些数据就不是以明文的方式传输了。要了解HTTPS协议,我们就需要先了解加密和解密。加密就是把明文(要传输的信息)进行一系列变换,生成密文。
2023-12-22 13:44:35
1063
原创 HTTP协议
平时我们说的一个网站的网址,其实就是说的URL。下面我们来分析一个网站的url。URL是统一资源定位器,即根据URL就可以定位互联网中唯一的一个资源。
2023-12-21 12:36:28
1110
原创 c++内存池项目
下面我们来实现项目的ThreadCache部分。我们将ThreadCache类的成员函数的声明和定义分别写到ThreadCache.h和ThreadCache.cc文件中。然后我们在Common.h文件中实现一些共用的类或函数。我们实现ThreadCache的初步思想和定长内存池类似,只不过内存池中申请的内存块不再是定长的,而是有可能为1、2、4、8、9、10…等字节的内存块,所以这些申请的内存块释放时,我们就不能挂载到同一个链表上,所以我们采用哈希桶类似的数据结构来管理这些大小不一的被释放的内存块。
2023-12-21 12:24:56
1371
原创 linux网络版计算机
协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端。约定方案一:客户端发送一个形如"1+1"的字符串;这个字符串中有两个操作数, 都是整形;两个数字之间会有一个字符是运算符, 运算符只能是 +;数字和运算符之间没有空格;
2023-12-19 10:32:05
971
原创 linux网络编程套接字
文章目录一、预备知识1、IP地址和MAC地址二、简单的UDP网络程序在windows系统下运行客户端程序三、简单的TCP网络程序一、预备知识1、IP地址和MAC地址IP地址IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4IP地址是在IP协议中, 用来标识网络中不同主机的地址;对于IPv4来说, IP地址是一个4字节, 32位的整数;我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用
2023-12-16 13:19:08
944
原创 c++-定长内存池
我们知道申请内存使用的是malloc,malloc其实就是一个通用的申请函数,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定长内存池。定长内存池的特点就是每次都申请固定大小的内存,这样做的话就可以使性能达到极致,并且不需要考虑内存碎片等问题。我们在定长内存池类中创建一个 _memory来指向申请的大块内存。然后设置一个 _freeList指针来存还回来的内存块。再设置一个 _remainBytes来记录申请的大块内存的剩余空间。
2023-12-07 15:46:22
1135
原创 linux线程池
一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。需要大量的线程来完成任务,且完成任务的时间比较短。WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。
2023-12-04 13:26:52
1097
原创 c++-哈希
在学习哈希之前,我们先来学习四个c++11中新添加的两个容器。我们知道在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2Nlog_2 Nlog2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。
2023-11-13 17:24:42
370
原创 linux线程
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。下面我们先来看一下之前我们学习的进程地址空间。
2023-11-13 17:23:46
357
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅