記事のリスト

# 一、简介 开源地址:RecastNavigation RecastNav 寻路 = 导航网格 + 寻路算法。 Recast 负责根据输入的环境网格 (Mesh) 生成导航网格。-> 路径数据 Detour 使用导航网格寻路。-> 路径算法 RecastDemo 使用 Recast+Detour 的一个示例工程。 知乎大佬详解 Recast Navigation 知乎大佬详解 Recast Navigation # 二、RecastDemo UML 程序入口 Main 函数 - 初始化。 While 循环实现 Tick 功能。 构建...

# 一、菜单系统架构图 # 二、游戏流程状态 每一个菜单对应一个游戏流程状态去处理逻辑。为什么要这样设计? 菜单只负责显示、游戏流程状态负责处理逻辑,典型的将 MVC 架构思想。 解耦。 方便游戏流程的控制和管理。 比如:切入 \ 切出主菜单,只需要简单的切换流程状态就行,其他的 UI 细节全部隐藏在流程状态之下,使外部不用去关系内部的实现。 # 三、Menu 和游戏流程状态一一对应。 # 四、Option 菜单中的每一个选项(按钮)就是一个 Option。 Option 排列在菜单中显示,但是逻辑交给对应的 GameFlowState 处理。 配置一些数据。比如:这个...

# 一、背景 以前的我 /* 伪代码 if( Press(ButtonSpace) ) { Jump(); } */ // 或者UE5的输入绑定 EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); 很明显输入和游戏行为绑定死了,需求一变全部改! 现在的我? 受到《游戏编程模式》中命令模式的启发,决定重新设计上面的输入系统。 #...

# 一、简介 游戏有很多不同的流程状态(比如:Login、Mainmenu、Loading、StartBattle、Battling、EndBattle、Dialog(NPC 对话)、....)。 以前的我可能最喜欢用枚举来列举这些状态,用 if else/switch 来判断状态,处理对应的游戏逻辑,但这太 low...

# 一、简介 存档是游戏的重要功能,尤其是单机游戏。虚幻的存档功能相当完善,只需要继承 USaveGame,然后将属性打上 UPROPERTY (SaveGame) 标签, 再调用 UGameplayStatics::AsyncSaveGameToSlot 就万事大吉了!真的如此吗? 对于单机游戏一般有多个存档,还有存档 UI 界面,而且当游戏功能越来越多,你就会感到上面的设计的乏力。 游戏存档很适合用备忘录模式。 #...

# 一、资料 UE5 官方文档,略。 网络游戏基础 UE5 源码 # 二、UE5 网络架构 UML 类图 # 二、Socket 系统(FSocket) Socket 套接字是端到端通信的接口(API)。Socket API 标准接口:绑定 IP 和端口、连接指定 IP 和端口、接受连接、接收消息、发送消息、获取 IP 等信息...。 UE5 的 Socket Subsystem 处理底层各个平台 Socket API 的差异,并为上层引擎提供统一的 FSocket 接口。 #...

# 一、参考资源 书籍 《Unity 网络游戏开发》 书籍 《网络多人游戏架构与编程》 # 二、网络七层模型 OIS 七层模型:概念略,网上有很多参考料。 物理层:物理硬件发送信息,如:光纤,无线电波... 链路层:MAC 地址,寻址唯一主机。封装 MAC 地址。缺点:不灵活、不支持子网划分、不支持不同协议主机通信... 网络层:IPV4/IPV6 协议。解决链路层的缺点。封装 IP 地址。 传输层:端口(TCP/UDP 协议),主机之间的进程通信。封装端口。 应用层:App 协议。如:DNS 域名系统协议、NAT...

# 一、函数 #   1. 函数基础 每个函数都有独一无二的内存空间,和全局变量一样,函数代码直接保存在可执行文件中,在程序被进程加载时,函数就已经分配好了内存空间。 函数代码在代码区(_TEXT SEGMENT)。 在结构体和类中,每个成员函数有且只有一个函数 “实例”(或叫共享函数),不论是对象的实例化,还是多态的继承等等。 代码示例:void Log() { printf("Hello Wolrd!\n"); } class LogClass { public: void...

# 一、Input 流程图 # 二、引擎底层输入架构 # I. 架构简介 为引擎抽象一层输入接口(FGenericApplicationMessageHandler),五花八门的输入接口应有尽有。 通过硬件 SDK API 检测输入,并调用引擎对应的输入接口(FGenericApplicationMessageHandler)。 将输入封装为引擎输入事件(FInputEvent)。 层层传递、分流、再传递! # II....