Как изменять серверную переменную от имени клиента unity mirror

Я сделал такой код стрельбы через raycast

void Shoot()
{
    if (isServer)
    {
        s_Shoot();
    }
    else
    {
        c_Shoot();
    }
}

[Server]
void s_Shoot()
{
    RaycastHit hit;
    Physics.Raycast(FPScam.transform.position, FPScam.transform.forward, out hit);

    if (hit.transform.name.Contains("Player"))
    {
        Debug.Log("Hit");
        Debug.Log(hit.transform.gameObject.GetComponent<Health>().HP);
        hit.transform.gameObject.GetComponent<Health>().HP -= damage;
        Debug.Log(hit.transform.gameObject.GetComponent<Health>().HP);
    }
}

[Command]
void c_Shoot()
{
    s_Shoot();
}

по логике мы со стороны клиента просим сервер выстрелить из камеры которая синхронизируется у клиента и сервера и если попадаем в объект у которого в названии будет слово Player мы пишем в консоль hit, начальное значение здоровья, потом в скрипте health который у игрока в переменной HP снимаем здоровье на значение damage и пишем новое значение здоровья, у HP стоит syncvar, но при этом только хост может снимать здоровье (хотя по дебагу можно понять что все кроме как раз таки изменения переменной работает), и ни клиент хосту, ни клиент другому клиенту не могут нанести урон

P.S. вот код здоровья (death это функция которая будет срабатывать если hp меньше 100, пока что там просто пишет в консоль "death")

[SyncVar]
public int HP = 100;

void Update()
{
    if (HP <= 0)
    {
        death();
    }
}

Ответы (1 шт):

Автор решения: Дядя Прога

Советую почитать документацию Mirror(https://mirror-networking.gitbook.io/docs/)

Скорее всего(вопрос задан для меня не понятно) Вам нужно создать метод с атрибутом [Command] для того, чтобы клиенты и сервер могли изменять [SyncVar] переменную.

[Command(requiresAuthority = false)]
public void CmdTakeDamage(int damage)
{
    HP -= damage;
}

И изменять так, пример: hit.transform.gameObject.GetComponent().CmdTakeDamage(damage);

→ Ссылка