1、在客户端是否可以获取到 AIController
?
不可以,在 DS(dedicated server)模型下,AIController
只存在于服务端,其主要是通过在服务端对 Pawn 进行操控,然后再同步到客户端。
2、客户端上面能够执行 RPC 的对象有哪些?
RPC(远程过程调用),是在本地调用但能在其他机器(不同于执行调用的机器)上远程执行的函数。
在客户端上能够执行 RPC 的对象需要满足:
- 该 Actor 必须被复制
- 如果 RPC 是从 客户端 调用并在 服务器 上执行,客户端就 必须 拥有调用 RPC 的 Actor 。
- 如果是多播 RPC 是个例外:
当从客户端调用时,只是在本地运行而非服务器上执行。
3、如果在 C++ 中需要使用 windows 的头文件,如何操作?
#include “AllowWindowsPlatformTypes.h”
#include <windows.h>
#include “HideWindowsPlatformTypes.h”
复制代码
4、在头文件中经常出现的 xxx.generated.h 是什么?
当一个头文件中 include "xxx.generated.h"
,意味着这个头文件加入了反射系统。那些 UPROPERTY
, UFUNCTION
之类的宏,也标记着这些方法属性等等加入了 UE4 的反射系统, 加入了反射系统,UE4 才能帮你做 GC(垃圾回收),你才能实现蓝图、C++ 通信等等很多功能。
5、对一个 Actor 调用 AIMoveTo
失败了,其可能原因是什么?
- 未放入
NavMesh
和NavRecast
. - Nav 导航组件设置太大,也可能会导致失效
- 目标点超出 Nav 导航范围。
6、试说出宏、函数、事件的部分区别和联系
函数与事件的区别:
- 函数有返回值,事件无返回值
- 函数调用会等待函数执行结果,事件调用只是触发但不会等待。
- 函数执行在同一个线程,事件执行在不同线程。
- 函数可以用局部变量,事件没有局部变量。
- 因为函数执行顺序有保证,所以优先使用函数
- 没有返回值的函数,在被子类 Override 时,会变成事件。
宏与函数的区别在于:
- 宏是直接展开,即直接将宏的代码直接复制替换到所有使用当前宏的地方,这点类似于 C++ 中的宏,而函数则是需要编译。
- 宏运行时无实体,函数运行时有实体。
- 宏有多个入口
Exec
多个出口Exec
,函数只有一个入口Exec
一个出口Exec
。 - 宏可以使用
Delay
, 函数不可以使用Delay
。 - 宏不可以复制,函数可以复制。
- 宏的参数可以使用
Exec
类型,函数不可以
7、试使用 C++ 实现一个对蓝图中任意 Actor 排序的框架。
- 创建蓝图宏库,鼠标右键->Blueprints->Blueprint Macro Library -> All Classes->Object,以
UObject
作为蓝图宏库的基类。 - My Blueprint 窗口,Add New 创建二个宏
Select Sort
、Bubble Sort
; - 实现代码逻辑,如下
算法描述:
选择排序(详情请查阅选择排序方法)
bGreater = ( Array[min] >Array[i] ) ? true : false;
将 Array[min]
与 Array[i]
成员的大小比较结果连接上 bGreater(pin)
, 内部循环根据 bGreater(bool)
值判断是否交换 Array[min]
与 Array[i]
成员位置。 排序结束,返回有序数组
8、客户端上面对一个 Actor 中的 RPC 事件调用失败,可能原因是什么?
(1)该 Actor 不可被复制 (2)其他的客户端上,未拥有可以调用 RPC 的 Actor 。 (3)在 Pawn 派生类的蓝图收到 Possessed 事件时,Connection->ViesTarget 还未被赋值。
9、UE4 中的 RPC 事件有哪些?
RPC 主要包括 Multicast(广播)、Run On Server(在服务端执行)和 Run On Owning Client (在客户端执行)三种 类型。其中
- 广播类型,在服务器上调用执行,然后自动转发给客户端;
- 在服务端执行的函数,由客户端调用,然后仅在服务器执行。
- 在客户端执行的函数,由服务器调用,然后仅在自己的客户端上执行。
10、如何设置 Actor 的同步间隔?
更改 Actor 中的:NetUpdateFrequency
网络更新频率属性。
11、若需要实现一个多播事件,如何操作?
不是很理解这个问题问的是网络的多播,还是多播委托。
网络的多播:
- 先使用 "Switch Has Authority" 判断是否在服务器端。然后在事件的 Detials 中将Replacates 设置为
Multicast
。 - 先创建一个只在服务端运行的事件,然后由该事件去执行播放方法。
多播委托:
- 构建动态代理
- 在类内部声明动态代理对象
- 在蓝图中绑定
- 在 C++ 中执行多播委托。
12、连接服务器的命令是什么,如何传递参数?
连接服务器的命令是 Socket->Connect(*addr); 其中的 *addr
是 InternetAddr
指针,用于传递 IP 和 Port 。
13、为什么需要 TWeakPtr
?
TWeakPtr
不会参与应用技术,当 TWeakPtr
指向的对象不存在共享指针指向时,TWeakPtr
将 自动失效,所以使用该指针的时候需要 有效性判断 。用于非 UObject 类,想要引用它又不想因为引用它而 影响 引用计数时。
【UE4】共享(智能)指针用法
TWeakptr,TWeakObjectPtr和TSoftPtr的概念,为什么要引入这几个概念?