【转载】UE4 面试基础知识(二)

1、在客户端是否可以获取到 AIController

不可以,在 DSdedicated server)模型下,AIController 只存在于服务端,其主要是通过在服务端对 Pawn 进行操控,然后再同步到客户端。

UE4 AIController
设置专用服务器

2、客户端上面能够执行 RPC 的对象有哪些?

RPC(远程过程调用),是在本地调用但能在其他机器(不同于执行调用的机器)上远程执行的函数。

在客户端上能够执行 RPC 的对象需要满足:

  • 该 Actor 必须被复制
  • 如果 RPC 是从 客户端 调用并在 服务器 上执行,客户端就 必须 拥有调用 RPC 的 Actor 。
  • 如果是多播 RPC 是个例外:

当从客户端调用时,只是在本地运行而非服务器上执行。

RPC

3、如果在 C++ 中需要使用 windows 的头文件,如何操作?

#include “AllowWindowsPlatformTypes.h”
#include <windows.h>
#include “HideWindowsPlatformTypes.h”
复制代码

关于 UE4 引用 windows 头文件的类型冲突
[UE4][C++]使用 Windows 的 SOCKET

4、在头文件中经常出现的 xxx.generated.h 是什么?

当一个头文件中 include "xxx.generated.h",意味着这个头文件加入了反射系统。那些 UPROPERTY, UFUNCTION 之类的宏,也标记着这些方法属性等等加入了 UE4 的反射系统, 加入了反射系统,UE4 才能帮你做 GC(垃圾回收),你才能实现蓝图、C++ 通信等等很多功能。

【UE4】"xxx.generated.h"

5、对一个 Actor 调用 AIMoveTo 失败了,其可能原因是什么?

  • 未放入 NavMeshNavRecast.
  • Nav 导航组件设置太大,也可能会导致失效
  • 目标点超出 Nav 导航范围。

UE4 AI 移动到 出现的 BUG 以及解决方案

6、试说出宏、函数、事件的部分区别和联系

函数与事件的区别:

  • 函数有返回值,事件无返回值
  • 函数调用会等待函数执行结果,事件调用只是触发但不会等待。
  • 函数执行在同一个线程,事件执行在不同线程。
  • 函数可以用局部变量,事件没有局部变量。
  • 因为函数执行顺序有保证,所以优先使用函数
  • 没有返回值的函数,在被子类 Override 时,会变成事件。

宏与函数的区别在于:

  • 宏是直接展开,即直接将宏的代码直接复制替换到所有使用当前宏的地方,这点类似于 C++ 中的宏,而函数则是需要编译。
  • 宏运行时无实体,函数运行时有实体。
  • 宏有多个入口 Exec 多个出口 Exec ,函数只有一个入口 Exec 一个出口 Exec
  • 宏可以使用 Delay, 函数不可以使用 Delay
  • 宏不可以复制,函数可以复制。
  • 宏的参数可以使用 Exec 类型,函数不可以

[UE4]函数和事件的区别
[UE4]宏

7、试使用 C++ 实现一个对蓝图中任意 Actor 排序的框架。

  • 创建蓝图宏库,鼠标右键->Blueprints->Blueprint Macro Library -> All Classes->Object,以 UObject 作为蓝图宏库的基类。
  • My Blueprint 窗口,Add New 创建二个宏 Select SortBubble Sort
  • 实现代码逻辑,如下

算法描述:

选择排序(详情请查阅选择排序方法)

bGreater = ( Array[min] >Array[i] ) ? true : false;

Array[min]Array[i] 成员的大小比较结果连接上 bGreater(pin), 内部循环根据 bGreater(bool) 值判断是否交换 Array[min]Array[i] 成员位置。 排序结束,返回有序数组

第1期 在蓝图实现任意类型数组排序

8、客户端上面对一个 Actor 中的 RPC 事件调用失败,可能原因是什么?

(1)该 Actor 不可被复制 (2)其他的客户端上,未拥有可以调用 RPC 的 Actor 。 (3)在 Pawn 派生类的蓝图收到 Possessed 事件时,Connection->ViesTarget 还未被赋值。

UE4 RPC 调用不起作用
RPC

9、UE4 中的 RPC 事件有哪些?

RPC 主要包括 Multicast(广播)、Run On Server(在服务端执行)和 Run On Owning Client (在客户端执行)三种 类型。其中

  • 广播类型,在服务器上调用执行,然后自动转发给客户端;
  • 在服务端执行的函数,由客户端调用,然后仅在服务器执行。
  • 在客户端执行的函数,由服务器调用,然后仅在自己的客户端上执行。

UE4网络之(二) 远程调用函数(RPC)

10、如何设置 Actor 的同步间隔?

更改 Actor 中的:NetUpdateFrequency 网络更新频率属性。

深入浅出 UE4 网络
UE4 网络同步属性笔记

11、若需要实现一个多播事件,如何操作?

不是很理解这个问题问的是网络的多播,还是多播委托。

网络的多播:

  • 先使用 "Switch Has Authority" 判断是否在服务器端。然后在事件的 Detials 中将Replacates 设置为 Multicast
  • 先创建一个只在服务端运行的事件,然后由该事件去执行播放方法。

多播委托:

  • 构建动态代理
  • 在类内部声明动态代理对象
  • 在蓝图中绑定
  • 在 C++ 中执行多播委托。

[UE4]多播(广播)
UE4 在 C++ 中实现多播通知到蓝图(动态代理应用)

12、连接服务器的命令是什么,如何传递参数?

连接服务器的命令是 Socket->Connect(*addr); 其中的 *addrInternetAddr 指针,用于传递 IPPort

UE4 客户端与服务器的通信
UE4基础三:客户端服务器连接流程
网络概述

13、为什么需要 TWeakPtr

TWeakPtr 不会参与应用技术,当 TWeakPtr 指向的对象不存在共享指针指向时,TWeakPtr 将 自动失效,所以使用该指针的时候需要 有效性判断 。用于非 UObject 类,想要引用它又不想因为引用它而 影响 引用计数时。

【UE4】共享(智能)指针用法
TWeakptr,TWeakObjectPtr和TSoftPtr的概念,为什么要引入这几个概念?


 

猜你喜欢

转载自blog.csdn.net/ale26/article/details/125914287