• Unreal NetMode&NetRole 解析


    Version: Unreal 4.26

    问题

    • 为啥UE编辑器会有EPlayNetMode有三种让你选择。
    • 为啥描述World 的ENetMode 会有4种,而不只是(Client/Server 2种)。
    • 为何Actor 会有Role的概念。

    EPlayNetMode

    UENUM()
    enum EPlayNetMode
    {
    	/** A non-networked game will be started. This can be used in combination with bLaunchSeparateServer to test menu -> server flow in your game. */
    	PIE_Standalone UMETA(DisplayName="Play Offline"),
    	/** The editor will act as both a Server and a Client. Additional instances may be opened beyond that depending on the number of clients. */
    	PIE_ListenServer UMETA(DisplayName="Play As Listen Server"),
    	/** The editor will act as a Client. A server will be started for you behind the scenes to connect to. */
    	PIE_Client UMETA(DisplayName="Play As Client"),
    };
    
    • PIE_Standalone

      单机玩法,本地直接有一个所谓的服务器和一个或多个玩家。因此尤其注意相关网络请求rpc,值复制等都是同步执行的

      应用:一般游戏的训练场啊,游戏大厅,新手引导关卡。不需要跟其他玩家交互的场景。

    • PIE_Client

      一般用于多人在线联网战斗局内,比如吃鸡游戏那种开房间成功后进入局内战斗,就是所谓的战斗局内,用这个比较多。

      应用:比如吃鸡游戏的战斗场景(与其他联网玩家战斗交互)。

    • PIE_ListenServer

      一般用于开发局域网游戏。

      应用:无(我没用过,现在好像没有开发局域网游戏的了吧)。


    综上:就是方便为了给UE 编辑器用户开发测试使用。
    

    ENetMode

    
     //* The network mode the game is currently running.*/
    enum ENetMode
    {
    	/** Standalone: a game without networking, with one or more local players. Still considered a server because it has all server functionality. */
    	NM_Standalone,
    
    	/** Dedicated server: server with no local players. */
    	NM_DedicatedServer,
    
    	/** Listen server: a server that also has a local player who is hosting the game, available to other players on the network. */
    	NM_ListenServer,
    
    	/**
    	 * Network client: client connected to a remote server.
    	 * Note that every mode less than this value is a kind of server, so checking NetMode < NM_Client is always some variety of server.
    	 */
    	NM_Client,
    };
    
    • NM_Standalone

      如果你开启的是PIE_Standalone,所谓的客户端和服务器的World()->GetNetMode()都会只是NM_Standalone.

    • NM_DedicatedServer

      如果你开启的是PIE_Client,服务器上的World()->GetNetMode()才会是NM_DedicatedServer.

    • NM_Client

      如果你开启的是PIE_Client,客户端上的World()->GetNetMode()才会是NM_Client.

    • NM_ListenServer

      如果你开启的是PIE_Standalone,所谓的客户端和服务器的World()->NetMode 都会只是PIE_Standalone.

    ENetRole

    class ENGINE_API AActor : public UObject
    {
    	/** Describes how much control the local machine has over the actor. */
    	UPROPERTY(Replicated)
    	TEnumAsByte<enum ENetRole> Role;
    
    	/** Returns how much control the remote machine has over this actor. */
    	UPROPERTY(Replicated, Transient)
    	TEnumAsByte<enum ENetRole> RemoteRole;	
    }
    
    /** The network role of an actor on a local/remote network context */
    enum ENetRole
    {
    	/** No role at all. */
    	ROLE_None,
    	/** Locally simulated proxy of this actor. */
    	ROLE_SimulatedProxy,
    	/** Locally autonomous proxy of this actor. */
    	ROLE_AutonomousProxy,
    	/** Authoritative control over the actor. */
    	ROLE_Authority,
    };
    
    

    前面的ENetMode针对的是世界才能调用的,这个ENetRole是Actor才能调用的。你需要了解Actor是作为UE 可以同步的最小单元。
    主要是Actor的Role和RemoteRole,大概描述的是这个Actor本地的控制性和远端的控制性。还有一点需要申明,只能是服务器复制Actor到客户端,客户端不会复制Actor到服务器。

    服务器创建Actor

    • 不复制到客户端
    • Role:ROLE_Authority
    • RemoteRole:ROLE_None
    • 复制到客户端
    • Role:ROLE_Authority
    • RemoteRole:ROLE_SimulatedProxy 或 ROLE_AutonomousProxy

    客户端创建Actor

    • Role:ROLE_Authority
    • RemoteRole:ROLE_None

    应用:
    从服务器复制一个Actor到ABCD四个客户端,那么我可以在这个Actor 的BeginPlay里判断打印log。

    this->GetLocalRole() == ROLE_AutonomousProxy 就是A客户端,只打印一次。
    this->GetLocalRole() == ROLE_Authority 就是服务器,只打印一次。
    this->GetLocalRole() == ROLE_SimulatedProxy 就是BCD客户端,打印三次。
    

    通俗的说:目的是为了描述这个Actor是服务器生成的;还是客户端生成的;还是服务器生成复制到客户端的;还是服务器复制到客户端,这个客户端是本地玩家还是非本地玩家。
    本地玩家的,还是非本地玩家的,这是个相对的概念,客户端是我,就是本地玩家,专业术语是主控端(是我),还是模拟端。

    参考


    __EOF__

  • 本文作者: 不三周助
  • 本文链接: https://www.cnblogs.com/u3ddjw/p/16859825.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    【线性代数】知识点总结(上)
    缓存技术(缓存穿透,缓存雪崩,缓存击穿)
    极限多标签之-PfastreXML
    实时WebRTC网页播放器进入快速功能迭代
    首选C++,彻底麻了!
    python标准库之itertools
    Python用yield from 实现异步协程爬虫
    Java学习笔记 --- Java绘图技术
    【数据分析入门】Seaborn[散点图、条形图、计数图、热力图、箱型图、小提琴图]
    AI创作系统ChatGPT源码+AI绘画系统+支持OpenAI DALL-E3文生图,可直接对话文生图
  • 原文地址:https://www.cnblogs.com/u3ddjw/p/16859825.html