vault backup: 2024-10-12 17:19:45
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
# WithValidation
|
||||
|
||||
- **功能描述:** 指定一个RPC函数在执行前需要验证,只有验证通过才可以执行。
|
||||
- **元数据类型:** bool
|
||||
- **引擎模块:** Network
|
||||
- **作用机制:** 在FunctionFlags中加入[FUNC_NetValidate](../../../Flags/EFunctionFlags/FUNC_NetValidate.md)
|
||||
- **常用程度:★★★★★**
|
||||
|
||||
指定一个RPC函数在执行前需要验证,只有验证通过才可以执行。
|
||||
|
||||
WithValidation实际上可以用于Client,Server,NetMulticast的RPC函数,但一般来说还是用在Server的最多,因为一般是Server的数据最权威可以进行数据合法性校验。
|
||||
|
||||
## 测试代码:
|
||||
|
||||
```cpp
|
||||
UCLASS(Blueprintable, BlueprintType)
|
||||
class INSIDER_API AMyFunction_PlayerController :public APlayerController
|
||||
{
|
||||
GENERATED_BODY()
|
||||
public:
|
||||
UFUNCTION(BlueprintCallable, Client, Reliable,WithValidation)
|
||||
void MyFunc2_RunOnClient();
|
||||
|
||||
UFUNCTION(BlueprintCallable, Server, Reliable,WithValidation)
|
||||
void MyFunc2_RunOnServer();
|
||||
};
|
||||
|
||||
UCLASS(Blueprintable, BlueprintType)
|
||||
class INSIDER_API AMyFunction_Network :public AActor
|
||||
{
|
||||
public:
|
||||
GENERATED_BODY()
|
||||
UFUNCTION(BlueprintCallable, NetMulticast, Reliable,WithValidation)
|
||||
void MyFunc2_NetMulticast();
|
||||
};
|
||||
|
||||
void AMyFunction_PlayerController::MyFunc2_RunOnServer_Implementation()
|
||||
{
|
||||
UInsiderLibrary::PrintFuncStatus(this, TEXT("MyFunc2_RunOnServer_Implementation"));
|
||||
}
|
||||
|
||||
bool AMyFunction_PlayerController::MyFunc2_RunOnServer_Validate()
|
||||
{
|
||||
UInsiderLibrary::PrintFuncStatus(this, TEXT("MyFunc2_RunOnServer_Validate"));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AMyFunction_Network::MyFunc2_NetMulticast_Validate()
|
||||
{
|
||||
UInsiderLibrary::PrintFuncStatus(this, TEXT("MyFunc2_NetMulticast_Validate"));
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
## 测试结果:
|
||||
|
||||
```cpp
|
||||
RunOnClient:
|
||||
LogInsider: Display: 815f7800 MyFunc2_RunOnClient_Validate BP_NetworkPC_C_0 NM_Client Local:ROLE_AutonomousProxy Remote:ROLE_Authority
|
||||
LogInsider: Display: 815f7800 MyFunc2_RunOnClient_Implementation BP_NetworkPC_C_0 NM_Client Local:ROLE_AutonomousProxy Remote:ROLE_Authority
|
||||
|
||||
RunOnServer:
|
||||
LogInsider: Display: 7fd11800 MyFunc2_RunOnServer_Validate BP_NetworkPC_C_1 NM_ListenServer Local:ROLE_Authority Remote:ROLE_AutonomousProxy
|
||||
LogInsider: Display: 7fd11800 MyFunc2_RunOnServer_Implementation BP_NetworkPC_C_1 NM_ListenServer Local:ROLE_Authority Remote:ROLE_AutonomousProxy
|
||||
|
||||
Multicast: ServerOwned
|
||||
LogInsider: Display: 947e6400 MyFunc2_NetMulticast_Validate BP_Network_C_1 NM_ListenServer Local:ROLE_Authority Remote:ROLE_SimulatedProxy
|
||||
LogInsider: Display: 947e6400 MyFunc2_NetMulticast_Implementation BP_Network_C_1 NM_ListenServer Local:ROLE_Authority Remote:ROLE_SimulatedProxy
|
||||
LogInsider: Display: 8795eb00 MyFunc2_NetMulticast_Validate BP_Network_C_1 NM_Client Local:ROLE_SimulatedProxy Remote:ROLE_Authority
|
||||
LogInsider: Display: 8795eb00 MyFunc2_NetMulticast_Implementation BP_Network_C_1 NM_Client Local:ROLE_SimulatedProxy Remote:ROLE_Authority
|
||||
LogInsider: Display: 8f6a3700 MyFunc2_NetMulticast_Validate BP_Network_C_1 NM_Client Local:ROLE_SimulatedProxy Remote:ROLE_Authority
|
||||
LogInsider: Display: 8f6a3700 MyFunc2_NetMulticast_Implementation BP_Network_C_1 NM_Client Local:ROLE_SimulatedProxy Remote:ROLE_Authority
|
||||
|
||||
```
|
||||
|
||||
## 原理:
|
||||
|
||||
如果加上WithValidation标记,在UHT生成代码的时候就会:
|
||||
|
||||
```cpp
|
||||
DEFINE_FUNCTION(AMyFunction_PlayerController::execMyFunc2_RunOnServer)
|
||||
{
|
||||
P_FINISH;
|
||||
P_NATIVE_BEGIN;
|
||||
if (!P_THIS->MyFunc2_RunOnServer_Validate())
|
||||
{
|
||||
RPC_ValidateFailed(TEXT("MyFunc2_RunOnServer_Validate"));
|
||||
return;
|
||||
}
|
||||
P_THIS->MyFunc2_RunOnServer_Implementation();
|
||||
P_NATIVE_END;
|
||||
}
|
||||
DEFINE_FUNCTION(AMyFunction_PlayerController::execMyFunc2_RunOnClient)
|
||||
{
|
||||
P_FINISH;
|
||||
P_NATIVE_BEGIN;
|
||||
if (!P_THIS->MyFunc2_RunOnClient_Validate())
|
||||
{
|
||||
RPC_ValidateFailed(TEXT("MyFunc2_RunOnClient_Validate"));
|
||||
return;
|
||||
}
|
||||
P_THIS->MyFunc2_RunOnClient_Implementation();
|
||||
P_NATIVE_END;
|
||||
}
|
||||
|
||||
DEFINE_FUNCTION(AMyFunction_Network::execMyFunc2_NetMulticast)
|
||||
{
|
||||
P_FINISH;
|
||||
P_NATIVE_BEGIN;
|
||||
if (!P_THIS->MyFunc2_NetMulticast_Validate())
|
||||
{
|
||||
RPC_ValidateFailed(TEXT("MyFunc2_NetMulticast_Validate"));
|
||||
return;
|
||||
}
|
||||
P_THIS->MyFunc2_NetMulticast_Implementation();
|
||||
P_NATIVE_END;
|
||||
}
|
||||
```
|
Reference in New Issue
Block a user