You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免Godot多人FPS游戏中渲染额外枪支?

多人FPS游戏枪支渲染与穿墙问题(Godot 4)

我正在开发一款普通的多人FPS游戏,为解决玩家枪支穿墙的问题,我采用了第二个Camera3D加SubViewport的方案。两台相机的剔除掩码配置在没有其他玩家连接时完全正常,但一旦有玩家连入主机,所有玩家的屏幕上都会渲染出额外的枪支——显然是因为新玩家实例化后场景里多了视口,导致渲染内容叠加。如果移除整个SubViewportContainer,枪支不会再错误渲染,但会出现在其他玩家手中,同时穿墙问题又回来了。

世界连接逻辑脚本

extends Node

@onready var main_menu = $CanvasLayer/Menu
@onready var address_entry = $CanvasLayer/Menu/MarginContainer/VBoxContainer/AddressEntry

const Player = preload("res://scenes/Player.tscn")
const PORT = 8899
var enet_peer = ENetMultiplayerPeer.new()

func _unhandled_input(event):
    if Input.is_action_just_pressed("exit"):
        get_tree().quit()


func _on_host_pressed():
    main_menu.hide()
    
    enet_peer.create_server(PORT)
    multiplayer.multiplayer_peer = enet_peer
    multiplayer.peer_connected.connect(add_player)
    
    add_player(multiplayer.get_unique_id())


func _on_join_pressed():
    main_menu.hide()
    
    enet_peer.create_client(address_entry.text, PORT)
    multiplayer.multiplayer_peer = enet_peer


func add_player(peer_id):
    var player = Player.instantiate()
    player.name = str(peer_id)
    add_child(player)

我试过在新玩家实例化时修改手枪模型网格的VisualInstance3D图层,但完全没用——所有玩家枪支的VisualInstance3D图层都是相同的,而且这个模型拆分了多个网格,代码写得特别繁琐:

func add_player(peer_id):
    var player = Player.instantiate()
    var glock_body = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_body")
    var glock_slide = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_slide")
    var glock_barrel = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_barrel")
    var glock_trigger = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_trigger")
    var glock_magazine = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_magazine")
    var glock_ammo_shell = player.get_node("Camera/Camera3D/toy_glock_lowpoly_w_bevel/glock_ammo_shell")
    glock_body.set_layer_mask(3)
    glock_slide.set_layer_mask(3) 
    glock_barrel.set_layer_mask(3)
    glock_trigger.set_layer_mask(3)
    glock_magazine.set_layer_mask(3)
    glock_ammo_shell.set_layer_mask(3)
    
    player.name = str(peer_id)
    add_child(player)

这应该是个常见问题,但我找了一圈没找到Godot 4的解决方案。

内容的提问来源于stack exchange,提问作者heywannafunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:57:47