Как изменять серверную переменную от имени клиента 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);