快速解释:我正在制作一个 fps 多人游戏,我正在尝试使用代码添加一些程序动画,我已经从 youtube 视频设置了多人游戏,并且我已经按照它来了解事情应该如何工作,但这我遇到了问题,所以当我按下射击按钮时,向量 3 会收到一些反冲,我有一个名为“handle_kickback”的函数,该函数只是将其位置从本地窗口调整到反冲向量,它可以工作,但是当我尝试看到其他玩家播放动画时它什么也没做,我不知道为什么我只能猜测,我的猜测可能是回扣的值太小(0.2)并且godot将其优化为无用的数据来发送我现在真的不知道......
其他注意事项,我正在使用 MultiplayerSynchronizer 节点,并且我确实添加了容器(如果这有什么区别)。
这是我制作的 YouTube 视频,以便更轻松地解决我的问题,链接:https://www.youtube.com/watch? v=RTIFavboxHY
代码:
class_name WeaponManager extends Node3D
@export var container : Node3D
@onready var weapon_cooldown : Timer = get_node("Weapon_Cooldown")
@export var kickback_start_position : Vector3
@export var kickback_end_position : Vector3
@export var kickback_speed : float = 2.0
@export var kickback_return_speed : float = 4.0
@export var not_shooting_return_speed : float = 1.5
var kickback_compensation : float = 0
func _process(delta):
if not is_multiplayer_authority(): return
if Input.is_action_pressed("Action_Attack") and weapon_cooldown.is_stopped():
weapon_cooldown.start()
kickback_end_position.z = 0.2
handle_kickback.rpc(delta)
@rpc("call_local")
func handle_kickback(delta : float) -> void:
if container.position == Vector3.ZERO and kickback_end_position == Vector3.ZERO:
return
# if kickback end pos is vector3.zero we use return speed
var speed : float = kickback_return_speed if kickback_end_position == Vector3.ZERO else kickback_speed
if not Input.is_action_pressed("Action_Attack") and kickback_end_position == Vector3.ZERO:
speed = not_shooting_return_speed
kickback_compensation += speed * delta
container.position = lerp(kickback_start_position,kickback_end_position,kickback_compensation)
if kickback_compensation > 1.0:
kickback_compensation = 0.0
kickback_start_position = container.position
kickback_end_position = Vector3.ZERO
免责声明:我对 Godot 多人游戏的了解非常有限。
我看到你使用
rpc
withhandle_kickback
。然而,我没有看到你传递kickback_end_position
到handle_kickback
。如果我理解正确的话,您正在将与
position
同步。这让我认为基于零覆盖它。container
MultiplayerSynchronizer
handle_kickback
kickback_end_position
我可以想到三种方法来解决这个问题:
按照戈多的方法,我会说添加
kickback_end_position
到MultiplayerSynchronizer
. 如果kickback_end_position
是同步的,您可能handle_kickback
会纯粹本地化(无rpc)并使用同步的kickback_end_position
。或者,您可以将向量偏移传递给
handle_kickback
,因此handle_kickback
并且仅handle_kickback
更新kickback_end_position
。或者你可以让它
handle_kickback
纯粹是本地的(没有rpc),也不同步kickback_end_position
......而是有一个额外的方法,当按下输入时通过rpc调用,它会更新kickback_end_position
。这意味着该值kickback_end_position
不会保持同步,但由于这纯粹是装饰性的,所以可能没问题。使用任何这些方法,您都必须
position
从 中container
删除MultiplayerSynchronizer
。