godot multiplayer tutorial
https://www.youtube.com/watch?v=V4a_J38XdHk&ab_channel=BatteryAcidDev
game_managerからmultiplayer_managerのbecom_host,join_as_player_2を呼び出せる
multiplayer_+mangerはauto load
game_managerはUI発火からmultiplayer_manager becom_host, join_as_player_2を呼び出す
multiplayer_modeの時は何かをする際にmultiplayer_managerを参照、呼び出している
multiplayer_manager
EnetMultiplayerPeer.をserver_peerとしてnew()
code:gdscript
func become_host():
_players_spawn_node = get_tree().get_current_scene().get_node("Players")
multiplayer_mode_enabled = true
host_mode_enabled = true
var server_peer = ENetMultiplayerPeer.new()
# Nat越え対応してないね。
server_peer.create_server(SERVER_PORT)
multiplayer.multiplayer_peer = server_peer
# peer_connected,peer_disconnected signalとメソッドを接続
# クライアントが接続したら_add_player_to_gameを実行する。
multiplayer.peer_connected.connect(_add_player_to_game)
multiplayer.peer_disconnected.connect(_del_player)
# マルチプレイしない場合はシングルローカルプレイ用のplayer nodeを削除
_remove_single_player()
# dedicated serverでなければ、先ほど作成したhost中のserverに自身を追加
if not OS.has_feature("dedicated_server"):
_add_player_to_game(1)
func _add_player_to_game(id: int):
print("Player %s joined the game!" % id)
var player_to_add = multiplayer_scene.instantiate()
player_to_add.player_id = id
player_to_add.name = str(id)
_players_spawn_node.add_child(player_to_add, true)
multiplayer_controller
chraacterBody2Dの継承クラス
multiplayer.is_server():のカード節でserverの場合のみ、clinetの場合のみの実装
code:gdscript
func _apply_movement_from_input(delta):
# Add the gravity.
if not is_on_floor():
velocity.y += gravity * delta
# Handle jump.
if do_jump and is_on_floor():
velocity.y = JUMP_VELOCITY
do_jump = false
# Get the input direction: -1, 0, 1
# 肝の部分 InputSynchronizerのinput_directionから値を取得している点
# Synchronizerから同期される入力情報をみてキャラクターを動かしている
#
direction = %InputSynchronizer.input_direction
# Apply movement
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
move_and_slide()
InputSynchronizer
code:gdscript
extends MultiplayerSynchronizer
@onready var player = $".."
var input_direction
# Called when the node enters the scene tree for the first time.
func _ready():
if get_multiplayer_authority() != multiplayer.get_unique_id():
set_process(false)
set_physics_process(false)
input_direction = Input.get_axis("move_left", "move_right")
func _physics_process(delta):
input_direction = Input.get_axis("move_left", "move_right")
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Input.is_action_just_pressed("jump"):
jump.rpc()
@rpc("call_local")
func jump():
if multiplayer.is_server():
player.do_jump = true
#godot_multiplayer
#godot