Кто нажал кнопку в unity mirror? Нажал кнопку - isAttack = true
Я хочу сделать мультиплеерную игру на unity с помощью mirror. Функцию атаки я реализовываю так - Мне нужно, чтобы при нажатии на кнопку "Damage" у того игрока, который нажал bool isAttak = true на 0,5 сек, которая и наносит урон, то есть включалась зона, которая наносит урон(сейчас нужно, чтобы хотя бы isAttack = true). Вот скрипт ButtonManager(обрабатывает нажатие нужного игрока):
using Mirror;
using UnityEngine;
using UnityEngine.UI;
public class ButtonManager : NetworkBehaviour
{
[SerializeField] private Button attackButton;
[SerializeField] private Player player;
private void Start()
{
attackButton.onClick.AddListener(OnAttackButtonClick);
player = NetworkClient.localPlayer.GetComponent<Player>();
}
private void OnAttackButtonClick()
{
if (player != null)
{
player.CmdSetAttack();
}
}
}
Вот скрипт, который висит на Empty GameObject и является зоной, которая наносит урон другим игрокам.
using Mirror;
using UnityEngine;
public class Sword : NetworkBehaviour
{
public virtual int damageAmount { get; set; }
[ServerCallback]
private void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
other.GetComponent<PlayerHealth>().Damage(damageAmount);
}
}
}
(висит не именно этот, а его наследник, который имеет damageAmount = 10) Вот скрипт PlayerHealth, который висит на игроке который принимает урон, содержит и синхронизирует HP:
using Mirror;
using UnityEngine;
using UnityEngine.UI;
public class PlayerHealth : NetworkBehaviour
{
public int Health;
public Slider Slider;
public Text HpText;
[SyncVar(hook = nameof(SyncHealth))]
int _SyncHealth;
private void FixedUpdate()
{
Slider.value = Health;
HpText.text = Health.ToString();
}
void SyncHealth(int oldValue, int newValue)
{
Health = newValue;
}
[Server]
public void ChangeHealthValue(int newValue)
{
_SyncHealth = newValue;
}
[Command]
public void CmdChangeHealth(int newValue)метода
{
ChangeHealthValue(newValue);
}
public void Damage(int d)
{
if (isServer)
ChangeHealthValue(Health - d);
else
CmdChangeHealth(Health - d);
}
}
И сам скрипт игрока(оставил в нем только нужное):
using UnityEngine;
using UnityEngine.UI;
using Mirror;
public class Player : NetworkBehaviour
{
[SerializeField] GameObject AttackedZone;
[SyncVar] public bool isAttack;
private void FixedUpdate()
{
if (isOwned)
{
if (isLocalPlayer)
{
if (isAttack)
{
AttackedZone.SetActive(true);
}
else
{
AttackedZone.SetActive(false);
}
}
}
}
[Command]
public void CmdSetAttack()
{
if (isLocalPlayer)
{
isAttack = true;
}
}
}
Также вот префаб игрока:
Вроде все должно работать, но нет! Урон может наносить только игрок, который первый подключается! Почему? 3 дня с этим мучаюсь, спрашивал у ChatGPT результат - 0. Помогите, пожалуйста, не нашел гайды не на youtube не в интернете. В документации mirror тоже! Help!