快速解释:我正在制作一个 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