게임 씬에 MultiplayerSpawner 를 추가하고, Spawn Path를 지정 후, Auto Spawn List 에 생성할 노드를 등록한다.
게임 씬의 스크립트에 아래와 같이 스포너의 경로를 등록해 놓으면 자식 노드의 스크립트에서 사용하기에 편리하다. 
@export var _building_spawner_node: MultiplayerSpawner

#빌딩의 MultiplayerSapwner의 커스텀 함수를 연결하기
get_tree().current_scene._building_spawner_node.spawn_function = _custom_spawn_building

#빌딩의 MultiplayerSapwner의 커스텀 함수
func _custom_spawn_building(data):
    var spawnObject = objects[data.index].instantiate()
     spawnObject.position = data.pos
     spawnObject.rotation = data.rot
     spawnObject.set_collision_layer_value(1, true)
     spawnObject.isSpawned = true
     #노드 내부 변수의 초기화가 안되었기에 spawnObject.place()와 같이 내부 함수로 queue_free()를 호출하면 에러가 난다. 
     #spawnObject.get_node("ClippingHitbox")와 같이 접근하면 작동한다.
     spawnObject.get_node("ClippingHitbox").queue_free()
     spawnObject.get_node("FloatingHitbox").queue_free()
     spawnObject.get_node("Model").material_override = null
     spawnObject.get_node("Model").transparency = 0.0
     spawnObject.get_node("CollisionShape3D").disabled = false

return spawnObject

#건물을 건설처리는 서버에서만 하기위해 RPC호출로 MultiplayerSapwner.spawn으로 노드 생성을 한다.
@rpc("any_peer","call_local","reliable")
func buildingRPC(index:int, pos:Vector3, rot:Vector3):
    if multiplayer.is_server():  #MultiplayerSpawner.spawn은 서버만 사용할 수 있음.
#spawn의 인수는 딕셔너리 형태로 작성해서 보낸다.
get_tree().current_scene._building_spawner_node.spawn({"index":index, "pos":pos, "rot":rot})

#실제 RPC 호출하는 예
buildingRPC.rpc(current_object_index, block_instance.global_position, block_instance.global_rotation)

#시그널 커넥트 + 람다식 예
get_tree().current_scene._building_spawner_node.spawned.connect(func(node):
    pass
    )

get_tree().current_scene  #현재 활성화되어 실행 중인 메인 씬의 루트를 가리킨다.
get_tree().root     # 게임의 모든 노드가 매달려 있는 최상위 창 (Viewport)

+ Recent posts