[Godot] 多人联机小游戏基础导读

参考项目:

【蘩】[Godot教程]局域网联机小游戏制作教程 ep6 - 基本联机功能的制作_哔哩哔哩_bilibili

基础知识:

远程调用RPC (remote procedure call)

RPC的修饰属性(不常用的未列举)

1. remote函数

调用远程的函数或者设置变量

2. remotesync函数

同事调用远程和本地的函数或者设置变量

调用函数

1. 远程端(函数调用)

rpc("remote_func",args)

rpc_id(peer_id,"remote_func",args)

2. 执行端(函数执行)

定义函数 remote func remote_func(args)

最终,从远程端调用的rpc会在执行端执行对应的remote函数

 

设置变量

1. 远程端

rset("a1",args)

rset_id(peer_id, "a1", args)

2.执行端

remote var a1

 

场景树的获取

get_tree() #调用当前的场景树

场景树信号

server

network_peer_connected #客户端连接出发的signal

network_peer_disconnected #客户端断开连接触发的signal

 

client

connected_to_server #client连接到server成功触发的signal

connection_failed #client连接到server失败触发的signal

server_disconnected #server 断开连接触发的signal

 

开启联机

创建对等点(开启联机)

var peer = NetworkedMultiplayerENet.new()  #基于udp协议的底层库

服务器

peer.create_server(port) #在localhost创建一个port端口号

客户端

peer.create_client(server_address,port) #传入服务器地址和端口号, 会开始创建客户端,并且会触发对应的信号

在创建完client和server后,需要吧对应的peer赋值给场景树的network_peer属性方便后续调用

get_tree().network_peer = peer

 

Peer ID

用于识别唯一的客户端(服务器固定为1)

 

NetWork Master

其实就是peer id,默认为1,那么就是服务器,一般用于判断是否是本地操作的玩家

判断是否为本地操作

get_network_master() == get_tree().get_network_unique_id() OR is_network_master()

 

 

游戏架构:

GameSystem (单例,游戏系统, 可以在全局访问)

  -- GameManager(UI管理)

    -- 各种UI界面,UI音效

      -- ChatDisply(聊天框)

    -- 游戏世界

      -- 静态物体

        --场景地图

      -- 网络物体(NetworkIdentifier)

        -- PlayerManager (玩家管理器)

        -- Cat (NetworkTransform,用于同步坐标)

        -- Mouse (NetworkTransform)

        -- Ball

  -- GameConsole (游戏控制台,发送游戏信息,游戏指令)

  -- NetworkManager(网络管理器,游戏的核心,用来管理网络方面)

  -- ClientProxy(客户端代理,在服务器负责管理对应的客户端)

  -- LinkingContext (链接表,分配,记录网络物体ID)

  -- CompetitionManager (竞赛管理器)

 

posted @ 2023-01-03 15:03  冷小男  阅读(845)  评论(0)    收藏  举报