简易联机实现
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
extends Node3D
|
||||
## 世界根节点。
|
||||
##
|
||||
## 只做一件事:把玩家场景注册给 MultiplayerSpawner,并把 spawner 托管给 Net 单例。
|
||||
## 玩家的生成/回收时机完全由 Net 决定,本文件不主动调用 spawn。
|
||||
|
||||
const PLAYER_SCENE: PackedScene = preload("res://player/player.tscn")
|
||||
const PLAYER_GROUP: String = "net_player"
|
||||
## 用节点路径而不是全局标识符访问单例:
|
||||
## autoload 的全局名只在引擎启动时注册,这样写不依赖注册时机。
|
||||
const NET_PATH: String = "/root/Net"
|
||||
|
||||
@onready var spawner: MultiplayerSpawner = $MultiplayerSpawner
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
spawner.spawn_function = _create_player
|
||||
var net := get_node_or_null(NET_PATH)
|
||||
if net != null:
|
||||
net.bind_spawner(spawner)
|
||||
else:
|
||||
push_error("Net 单例未注册,联机不可用。请确认 project.godot 的 [autoload] 里有 Net")
|
||||
|
||||
|
||||
## MultiplayerSpawner 会在**每一端**都调用这个函数,因此 authority 必须在这里设置:
|
||||
## 这样「谁是本地玩家」在各端结论一致,玩家脚本里的 is_multiplayer_authority() 才可靠。
|
||||
## recursive=true 很关键 —— 节点 authority 不自动继承,Sync 子节点必须一起设。
|
||||
func _create_player(peer_id: int) -> Node:
|
||||
var player := PLAYER_SCENE.instantiate()
|
||||
player.name = str(peer_id)
|
||||
player.add_to_group(PLAYER_GROUP)
|
||||
player.set_multiplayer_authority(peer_id, true)
|
||||
var here := multiplayer.get_unique_id()
|
||||
print("[Net] 本端 %d 生成玩家 %d%s" % [here, peer_id, "(本地操控)" if peer_id == here else "(远端回放)"])
|
||||
return player
|
||||
@@ -0,0 +1 @@
|
||||
uid://11rbhffe5dhv
|
||||
+6
-5
@@ -1,7 +1,7 @@
|
||||
[gd_scene format=3 uid="uid://bp8l1uwgshc86"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://bekuuw153mv03" path="res://player/player.tscn" id="1_gjxf3"]
|
||||
[ext_resource type="Sky" path="res://world/sky/cartoon_sky.tres" id="2_cartoon"]
|
||||
[ext_resource type="Script" uid="uid://11rbhffe5dhv" path="res://world/main.gd" id="1_hyim0"]
|
||||
[ext_resource type="Sky" uid="uid://bi632suyifms5" path="res://world/sky/cartoon_sky.tres" id="2_cartoon"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_hyim0"]
|
||||
size = Vector3(40, 0.5, 40)
|
||||
@@ -22,6 +22,7 @@ ambient_light_source = 3
|
||||
reflected_light_source = 2
|
||||
|
||||
[node name="Main" type="Node3D" unique_id=58155864]
|
||||
script = ExtResource("1_hyim0")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="." unique_id=305091665]
|
||||
|
||||
@@ -40,8 +41,8 @@ shadow_enabled = true
|
||||
directional_shadow_blend_splits = true
|
||||
directional_shadow_max_distance = 40.0
|
||||
|
||||
[node name="Player" parent="." unique_id=869687860 instance=ExtResource("1_gjxf3")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.3, 0)
|
||||
|
||||
[node name="Environment" type="WorldEnvironment" parent="." unique_id=794103784]
|
||||
environment = SubResource("Environment_gu74f")
|
||||
|
||||
[node name="MultiplayerSpawner" type="MultiplayerSpawner" parent="." unique_id=1410622657]
|
||||
spawn_path = NodePath("..")
|
||||
|
||||
@@ -4,6 +4,45 @@
|
||||
|
||||
[sub_resource type="ShaderMaterial" id="ShaderMaterial_cartoon"]
|
||||
shader = ExtResource("1_cartoon")
|
||||
shader_parameter/zenith_color = Color(0.09, 0.3, 0.78, 1)
|
||||
shader_parameter/mid_color = Color(0.28, 0.6, 0.95, 1)
|
||||
shader_parameter/horizon_color = Color(0.78, 0.88, 1, 1)
|
||||
shader_parameter/ground_color = Color(0.29, 0.329, 0.384, 1)
|
||||
shader_parameter/gradient_bias = 1.4
|
||||
shader_parameter/band_count = 0.0
|
||||
shader_parameter/band_sharpness = 0.9
|
||||
shader_parameter/follow_scene_light = 1.0
|
||||
shader_parameter/sun_direction = Vector3(0.35, 0.55, 0.35)
|
||||
shader_parameter/sun_core_color = Color(1, 0.976, 0.878, 1)
|
||||
shader_parameter/sun_halo_color = Color(1, 0.827, 0.478, 1)
|
||||
shader_parameter/sun_disk_size = 0.035
|
||||
shader_parameter/sun_disk_softness = 0.2
|
||||
shader_parameter/sun_halo_size = 0.55
|
||||
shader_parameter/sun_halo_strength = 0.65
|
||||
shader_parameter/sun_bloom_strength = 0.35
|
||||
shader_parameter/sun_intensity = 1.7
|
||||
shader_parameter/star_amount = 0.0
|
||||
shader_parameter/star_density = 60.0
|
||||
shader_parameter/star_size = 0.05
|
||||
shader_parameter/star_twinkle = 0.65
|
||||
shader_parameter/star_color = Color(0.85, 0.9, 1, 1)
|
||||
shader_parameter/cloud_color = Color(1, 1, 1, 1)
|
||||
shader_parameter/cloud_shadow_color = Color(0.45, 0.62, 0.88, 1)
|
||||
shader_parameter/cloud_rim_color = Color(1, 0.93, 0.76, 1)
|
||||
shader_parameter/cloud_coverage = 0.55
|
||||
shader_parameter/cloud_scale = 4.0
|
||||
shader_parameter/cloud_plane_offset = 0.6
|
||||
shader_parameter/cloud_horizon_fade = 0.08
|
||||
shader_parameter/cloud_edge = 0.16
|
||||
shader_parameter/cloud_warp = 0.3
|
||||
shader_parameter/cloud_speed = 0.01
|
||||
shader_parameter/cloud_direction = Vector2(1, 0.25)
|
||||
shader_parameter/cloud_shading = 0.55
|
||||
shader_parameter/cloud_rim = 0.4
|
||||
shader_parameter/cloud_opacity = 1.0
|
||||
shader_parameter/haze_color = Color(0.8, 0.89, 1, 1)
|
||||
shader_parameter/haze_strength = 0.35
|
||||
shader_parameter/haze_height = 0.09
|
||||
|
||||
[resource]
|
||||
sky_material = SubResource("ShaderMaterial_cartoon")
|
||||
|
||||
Reference in New Issue
Block a user