UE5 RPC调用示例详解


文章目录


前言

在UE5中,RPC(远程过程调用)是实现多人游戏逻辑同步的核心机制。以下通过一个玩家跳跃的示例,详细说明如何使用三种RPC类型(Server、Client、Multicast)。


一、示例场景

  • 目标:玩家按下空格键时,所有客户端同步播放跳跃动画。
  • 逻辑流程
    1. 客户端 检测输入,调用Server RPC请求跳跃。
    2. 服务器 验证请求,执行实际跳跃逻辑,并通过Multicast RPC通知所有客户端。
    3. 所有客户端 收到Multicast后播放跳跃动画。

二、代码实现

步骤1:定义RPC函数(角色头文件)

cpp 复制代码
// MyCharacter.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class MYPROJECT_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    // 输入绑定
    virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;

    // 客户端调用:向服务器发送跳跃请求
    UFUNCTION(BlueprintCallable, Category = "Jump")
    void RequestJump();

    // Server RPC:仅在服务器执行跳跃逻辑
    UFUNCTION(Server, Reliable, WithValidation, Category = "Jump")
    void Server_Jump();

    // Multicast RPC:所有客户端播放动画
    UFUNCTION(NetMulticast, Reliable, Category = "Jump")
    void Multicast_Jump();

private:
    void OnJumpInput(); // 本地跳跃输入处理
};

步骤2:实现RPC函数(角色源文件)

cpp 复制代码
// MyCharacter.cpp
#include "MyCharacter.h"
#include "Net/UnrealNetwork.h"

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    // 绑定跳跃输入到本地函数
    PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::OnJumpInput);
}

void AMyCharacter::OnJumpInput()
{
    // 仅在客户端调用Server RPC
    if (GetLocalRole() < ROLE_Authority && IsLocallyControlled())
    {
        RequestJump();
    }
}

void AMyCharacter::RequestJump()
{
    // 客户端调用Server RPC
    Server_Jump();
}

// Server RPC实现(_Implementation为UE自动生成的后缀)
void AMyCharacter::Server_Jump_Implementation()
{
    // 服务器验证跳跃合法性(例如是否冷却、是否死亡等)
    if (CanJump()) 
    {
        // 执行跳跃逻辑
        Jump();

        // 通知所有客户端播放动画
        Multicast_Jump();
    }
}

// 验证函数(可选,防止作弊)
bool AMyCharacter::Server_Jump_Validate()
{
    return true; // 在此处添加逻辑验证
}

// Multicast RPC实现
void AMyCharacter::Multicast_Jump_Implementation()
{
    // 所有客户端(包括调用者)播放动画
    PlayJumpAnimation();
}

void AMyCharacter::PlayJumpAnimation()
{
    // 播放跳跃动画Montage
    if (JumpAnimMontage)
    {
        PlayAnimMontage(JumpAnimMontage);
    }
}

三、关键点解析

3.1 RPC类型选择

  • Server RPC (UFUNCTION(Server)):

    • 客户端调用,服务器执行。
    • 函数名需以Server_前缀开头,自动生成Server_Jump_Implementation
  • Multicast RPC (UFUNCTION(NetMulticast)):

    • 服务器调用,所有客户端(包括服务器自身)执行。
    • 函数名需以**Multicast_**前缀开头。

3.2 可靠性设置

  • Reliable:保证RPC必达,适合关键动作(如跳跃)。
  • Unreliable:不保证顺序和必达,适合频繁更新(如位置同步)。

3.3 权限控制

  • 通过**GetLocalRole()**检查角色权限:
    • ROLE_Authority:服务器端。
    • ROLE_AutonomousProxy:控制客户端的角色。
    • ROLE_SimulatedProxy:其他客户端角色。

3.4 输入处理

  • 输入绑定在客户端本地执行,仅拥有客户端(IsLocallyControlled())触发Server RPC。

四、测试与验证

  1. 启动多玩家测试
  • 在编辑器中开启两个PIE窗口,一个作为服务器(Number of Players = 1),另一个作为客户端。
  1. 观察行为
  • 客户端按下空格键时,服务器角色执行跳跃,所有客户端同步播放动画。

总结

  • Server RPC:客户端发起请求,服务器处理核心逻辑。
  • Multicast RPC:服务器向全体客户端广播同步。
  • 验证函数:防止客户端发送非法请求(如作弊)。
  • 权限控制:确保逻辑在正确的端执行。

通过合理使用RPC,可以高效实现多人游戏的交互同步,同时保障游戏的安全性与流畅性。

相关推荐
AA陈超13 小时前
虚幻引擎UE5专用服务器游戏开发-33 在上半身播放组合蒙太奇
c++·游戏·ue5·游戏引擎·虚幻
zhangzhangkeji15 小时前
cesium126,230130,Editing Tileset Materials - 0,编辑瓦片集材质,官方教程:
ue5
zhangzhangkeji15 小时前
cesium126,230131,区域局部染色:赋值材质实例,建立“材质图层混合”文件,建立裁剪多边形,并应用自己的材质实例
ue5
AA陈超15 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-05 游戏效果委托
c++·游戏·ue5·游戏引擎·虚幻
m0_5522008216 小时前
《UE5_C++多人TPS完整教程》学习笔记62 ——《P63 多人游戏中的开火特效(Fire Effects in Multiplayer)》
c++·游戏·ue5
CandyU21 天前
UE5 小知识点 —— 11 - 下坠
ue5
AA陈超1 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P04-12 可缩放浮点数的曲线表
c++·游戏·ue5·游戏引擎·虚幻
咖啡咖_CoffCa3 天前
【UE5】新建Editor Standalone Window插件,之前(或当前)创建插件的按钮消失(被顶掉/占用)的问题
ue5·虚幻引擎·插件开发
maki0773 天前
VR大空间资料 01 —— 常用VR框架对比
android·ue5·游戏引擎·vr·虚幻·pico
maki0775 天前
虚幻版Pico大空间VR入门教程 01 ——UE5 Android打包环境4.26~5.6
android·ue5·vr·虚幻·pico·大空间