Синхронизация UNet смерти всех клиентов в Unity3D - PullRequest
0 голосов
/ 20 октября 2019

Я учил UNet создавать многопользовательскую игру для локальной сети, и все идет хорошо, кроме урона игрока. Цель здесь состоит в том, чтобы синхронизировать смерть достаточно, чтобы оба клиента поняли, что смерть произошла, и она должна перезагрузить сцену, используя NetworkManager.singleton.ServerChangeScene("SampleScene"); Однако смерть обновляется только на одном клиенте, но появилась новая ошибка. Когда я получаю и вызываю один из методов из моего сценария PlayerDamage, он возвращает сообщение об ошибке, говорящее, что в методе нет аргумента, соответствующего моему конструктору количества с плавающей запятой. Вот код из моего сценария Gun и PlayerDamage. Пистолет:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;

public class Gun : NetworkBehaviour {

    public float damage = 10f;
    public float range = 100f;
    public Camera fpsCam;
    public AudioSource pistol;
    //public ParticleSystem muzzleFlash;
    //[SerializeField] private ParticleSystem part;
    //public float shotTime = .25f;

    private void Update()
    {
        if (Input.GetButton("Fire1"))
        {
            Shoot();
            pistol.Play();
        }
    }

    void Shoot()
    {
        RaycastHit hit;
        if (Physics.Raycast(fpsCam.transform.position, fpsCam.transform.forward, out hit, range))
        {
            PlayerDamage target = hit.transform.GetComponent<PlayerDamage>();
            target.takeDamage();
        }
    }
}

Урон игрока:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;

public class PlayerDamage : NetworkBehaviour {
    [SyncVar]
    public float health = 50f;

    [ClientRpc]
    public void CmdTakeDamage(float amount)
    {
        Debug.Log("took damage" + amount);
    }

    public void takeDamage(float amount)
    {
        health -= amount;

        CmdTakeDamage(amount);
    }

    public void Die()
    {
        NetworkManager.singleton.ServerChangeScene("SampleScene");
    }
}

Заранее спасибо, FerretCode

1 Ответ

0 голосов
/ 21 октября 2019

Вам нужно будет отправить сообщение всем другим клиентам, чтобы они могли быть обновлены на определенном игроке. Для этого вам понадобится какая-то шина игровых событий, которая обрабатывает получение и рассылку игровых событий по всей сети.

Скажите, если в вашу игру играют три игрока и один изони умирают, он посылает сетевое сообщение хосту (независимо от того, сервер это или игрок), что игрок X умер. Хост теперь будет отправлять сообщение другим игрокам Y и Z, за исключением X, что игрок X умер, и тем самым уведомлять их, чтобы клиенты Y и Z могли убить игрока X на своей стороне.

Многопользовательские игрысложнее, чем кажется, и вам нужно спроектировать систему, в которой каждый клиент может синхронизироваться одновременно, прежде чем делать какие-либо вещи, связанные с игровым процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...