UE5 RPC调用示例详解

打印 上一主题 下一主题

主题 1674|帖子 1674|积分 5022

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


  

媒介

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

一、示例场景



  • 目标:玩家按下空格键时,所有客户端同步播放跳跃动画。
  • 逻辑流程

    • 客户端检测输入,调用Server RPC哀求跳跃。
    • 服务器验证哀求,执行现实跳跃逻辑,并通过Multicast RPC关照所有客户端。
    • 所有客户端收到Multicast后播放跳跃动画。

二、代码实现

步骤1:界说RPC函数(角色头文件)
  1. // MyCharacter.h
  2. #pragma once
  3. #include "CoreMinimal.h"
  4. #include "GameFramework/Character.h"
  5. #include "MyCharacter.generated.h"
  6. UCLASS()
  7. class MYPROJECT_API AMyCharacter : public ACharacter
  8. {
  9.     GENERATED_BODY()
  10. public:
  11.     // 输入绑定
  12.     virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override;
  13.     // 客户端调用:向服务器发送跳跃请求
  14.     UFUNCTION(BlueprintCallable, Category = "Jump")
  15.     void RequestJump();
  16.     // Server RPC:仅在服务器执行跳跃逻辑
  17.     UFUNCTION(Server, Reliable, WithValidation, Category = "Jump")
  18.     void Server_Jump();
  19.     // Multicast RPC:所有客户端播放动画
  20.     UFUNCTION(NetMulticast, Reliable, Category = "Jump")
  21.     void Multicast_Jump();
  22. private:
  23.     void OnJumpInput(); // 本地跳跃输入处理
  24. };
复制代码
步骤2:实现RPC函数(角色源文件)
  1. // MyCharacter.cpp
  2. #include "MyCharacter.h"
  3. #include "Net/UnrealNetwork.h"
  4. void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
  5. {
  6.     Super::SetupPlayerInputComponent(PlayerInputComponent);
  7.     // 绑定跳跃输入到本地函数
  8.     PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::OnJumpInput);
  9. }
  10. void AMyCharacter::OnJumpInput()
  11. {
  12.     // 仅在客户端调用Server RPC
  13.     if (GetLocalRole() < ROLE_Authority && IsLocallyControlled())
  14.     {
  15.         RequestJump();
  16.     }
  17. }
  18. void AMyCharacter::RequestJump()
  19. {
  20.     // 客户端调用Server RPC
  21.     Server_Jump();
  22. }
  23. // Server RPC实现(_Implementation为UE自动生成的后缀)
  24. void AMyCharacter::Server_Jump_Implementation()
  25. {
  26.     // 服务器验证跳跃合法性(例如是否冷却、是否死亡等)
  27.     if (CanJump())
  28.     {
  29.         // 执行跳跃逻辑
  30.         Jump();
  31.         // 通知所有客户端播放动画
  32.         Multicast_Jump();
  33.     }
  34. }
  35. // 验证函数(可选,防止作弊)
  36. bool AMyCharacter::Server_Jump_Validate()
  37. {
  38.     return true; // 在此处添加逻辑验证
  39. }
  40. // Multicast RPC实现
  41. void AMyCharacter::Multicast_Jump_Implementation()
  42. {
  43.     // 所有客户端(包括调用者)播放动画
  44.     PlayJumpAnimation();
  45. }
  46. void AMyCharacter::PlayJumpAnimation()
  47. {
  48.     // 播放跳跃动画Montage
  49.     if (JumpAnimMontage)
  50.     {
  51.         PlayAnimMontage(JumpAnimMontage);
  52.     }
  53. }
复制代码
三、关键点剖析

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。
四、测试与验证


  • 启动多玩家测试


  • 在编辑器中开启两个PIE窗口,一个作为服务器(Number of Players = 1),另一个作为客户端。

  • 观察活动


  • 客户端按下空格键时,服务器角色执行跳跃,所有客户端同步播放动画。

总结



  • Server RPC:客户端发起哀求,服务器处置惩罚核心逻辑。
  • Multicast RPC:服务器向全体客户端广播同步。
  • 验证函数:防止客户端发送非法哀求(如作弊)。
  • 权限控制:确保逻辑在正确的端执行。
通过合理使用RPC,可以高效实现多人游戏的交互同步,同时保障游戏的安全性与流畅性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表