UE4 C++联网RPC教程笔记(一)(第1~4集)
前言
本系列笔记将会对梁迪老师的《UE4C++联网RPC框架开发吃鸡》教程进行个人的知识点梳理与总结,此课程也像全反射零耦合框架的课程那样,已经超过报名截止时间了,无法通过正常方法观看。
笔者依旧是采取神奇的方法,通过手机浏览器(不同浏览器的效果有差别,有的会直接要求你登录,遇到这样的就换一个;还有可能点开网页会发现没有播放按钮,遇到这样的就换一个网页)搜索该课程后可以在课程预览界面观看,也可以在目录进行跳转,不过没有字幕。建议是在 PC 端的手机模拟器观看。
本课程集数不多,可以通过目录跳转看完,就不需要复制一串数字到 URL 来切换集数了。
笔者用的引擎版本是 4.26.2,老师推荐的引擎版本是 4.20,不同的版本可能在代码上有所区别,笔者会通过注释标明。
本系列文章不允许转载。
本系列笔记可供读者学习后用于复习回顾或参考代码来解决一些敲错了代码导致的 Bug。并且笔者只会贴出对应集数修改的代码内容,已经有了的部分代码基本都不会贴出来,以免笔记篇幅过长。
1. 教程介绍与资源
此处列出本课程需要翻阅的网址:虚幻文档关于 RPC 的讲解 >>【】
RPC 的全称是 Remote Procedure Calls 远程过程调用。
本课程篇幅较短,分两步走:1. RPC 基础 2. 分别用蓝图和 C++ 实现监听服务器。
2. 自定义 Debug 功能
打开 UE4,创建一个新的 C++ 第三人称游戏项目,需带有初学者内容包,命名为 RPCCourse。
如果学过梁迪老师另一个课程《UE4全反射零耦合框架开发坦克游戏》的读者可能会有印象,因为这个自定义 Debug 功能也在那个课程里面实现了,学过的读者可自行决定是否再看一遍。
创建以下 C++ 类:
创建一个 Object,命名为 RPCHelper,路径为默认。
要实现自定义 Debug 功能,我们需要用到单例模式
RPCHelper.h
#include "CoreMinimal.h"
// 引入头文件
#include "Engine/GameEngine.h"
class RPCCOURSE_API DDRecord
{
private:
// 自身单例
static TSharedPtr<DDRecord> RecordInst;
// 最终输出的字符串
FString RecordInfo;
// 显示时长
float ShowTime;
// 显示的颜色
FColor ShowColor;
public:
// 构造和析构函数不写内容,并且由于可能会被大量调用所以写成内联函数
inline DDRecord() {
}
~DDRecord() {
}
static TSharedPtr<DDRecord> Get();
// 初始化显示时长和颜色
inline void InitParam(float InTime, FColor InColor)
{
ShowTime = InTime;
ShowColor = InColor;
}
// 实际依赖引擎自带输出逻辑
inline void Output()
{
if (GEngine)
GEngine->AddOnScreenDebugMessage(-1, ShowTime, ShowColor, RecordInfo);
// 清空最终输出字符串
RecordInfo.Empty();
}
// 移位操作符重写,将传入的各种类型数据都转换成 FString 然后加入最终输出字符串
inline DDRecord &operator<<(FString Info) {
RecordInfo.Append(Info); return *this; }
inline DDRecord &operator<<(FName Info) {
RecordInfo.Append(Info.ToString()); return *this; }
inline DDRecord &operator<<(FText Info) {
RecordInfo.Append(Info.ToString()); return *this; }
inline DDRecord &operator<<(const char* Info) {
RecordInfo += Info; return *this; }
inline DDRecord &operator<<(const char Info) {
RecordInfo.AppendChar(Info); return *this; }
inline DDRecord &operator<<(int32 Info) {
RecordInfo.Append(FString::FromInt(Info)); return *this; }
inline DDRecord &operator<<(float Info) {
RecordInfo.Append(FString::SanitizeFloat(Info)); return *this; }
inline DDRecord &operator<<(double Info) {
RecordInfo.Append(FString::SanitizeFloat(Info)); return *this; }
inline DDRecord &operator<<(bool Info) {
RecordInfo.Append(Info ? FString("true") : FString("false")); return *this; }
inline DDRecord &operator<<(FVector2D Info) {
RecordInfo.Append(Info.ToString()); return *this; }
inline DDRecord &operator<<(FVector Info) {
RecordInfo.Append(Info.ToString()); return *this; }
inline DDRecord &operator<<(FRotator Info) {
RecordInfo.Append(Info.ToString()); return *this; }
inline DDRecord &operator<<(FQuat Info) {
RecordInfo