Кто нажал кнопку в unity mirror? Нажал кнопку - isAttack = true

Рейтинг: 2Ответов: 0Опубликовано: 03.08.2023

Я хочу сделать мультиплеерную игру на 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!

Ответы

Ответов пока нет.