Мультиплеер на UNET

Общие вопросы о Unity3D

Мультиплеер на UNET

Сообщение TruEnot 11 май 2020, 01:44

Хочу сделать 3д мультиплеер на Unet(да, я знаю что он устарел). Суть проблемы в чем, посмотрел пару видосов, сделал само подключение, NetworkManager, префабы игрока, в общем все работает. НО когда я атакую игрока, его хп меняется локально, только у меня, а клиенту вообще все равно. Вопрос следующий: Как сделать нормальный мультиплеер, чтобы клиенты могли влиять на публичные переменные других клиентов?
TruEnot
UNец
 
Сообщения: 1
Зарегистрирован: 11 май 2020, 01:39

Re: Мультиплеер на UNET

Сообщение Summersay415 13 май 2020, 07:29

Ты можешь использовать [SyncVar], но его данные передаются только клиент -> клиент, сервер -> клиент, но так не передаётся: клиент -> сервер.
Лучше использовать ClientRpc и Command. Прикреплю скрипт который я использую в своей игре:
Синтаксис:
Используется csharp
#pragma warning disable
using UnityEngine.Networking;
using UnityEngine.UI;
using UnityEngine;
using System.Collections;

public class valuesControlNet : NetworkBehaviour
{
    public Image bar;
    public Text name;
    public string nameStr;
    public GameObject canvas;
    public float health;
    public float max;
    public int strikePower;
    public menuOfButtons ok;

    void Start()
    {
        ok = GameObject.FindObjectOfType<menuOfButtons>();
        if (isLocalPlayer)
            canvas.SetActive(false);
        else
            canvas.SetActive(true);
    }

    [Command]
    void CmdSendHealth(string _playerName, float _health, string _nameFORsend, float _maxH, int _power)
    {
        StartCoroutine(Sended(_playerName, _health, _nameFORsend, _maxH, _power));
    }

    [ClientRpc]
    void RpcSENDhealth(string _playerName, float _health, string _nameFORsend, float _maxH, int _power)
    {
        StartCoroutine(Sended(_playerName, _health, _nameFORsend, _maxH, _power));
    }

    IEnumerator Sended(string _playerName, float _health, string _nameFORsend, float _maxH, int _power)
    {
        yield return new WaitForSeconds(0.15f);
        valuesControlNet main = GameObject.Find(_playerName).GetComponent<valuesControlNet>();
        main.nameStr = _nameFORsend;
        main.health = _health;
        main.max = _maxH;
        main.strikePower = _power;
    }

    void Update()
    {
        if (isLocalPlayer)
        {
            if (ok.isHost && !ok.isClient && GetComponent<setup>().playerConnected)
                RpcSENDhealth(transform.name, health, nameStr, max, strikePower);
            if (ok.isClient && !ok.isHost)
                CmdSendHealth(transform.name, health, nameStr, max, strikePower);
            return;
        }
        float convertHealth = health / max;
        bar.fillAmount = convertHealth;
        name.text = nameStr;
    }
}
 

Ссылка на Doc: https://docs.unity3d.com/Manual/UNetActions.html .
Summersay415
UNец
 
Сообщения: 19
Зарегистрирован: 01 янв 2020, 13:39
Откуда: Бийск


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22