UNET, изменение цвета одного игрока у всех на экране

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

UNET, изменение цвета одного игрока у всех на экране

Сообщение ToxWill 04 июл 2018, 17:44

Решил поэкспериментировать в Unet. Есть куб, при нажатии клавиш "r", "g", и "b" меняет но соответственный цвет. Когда я запускаю приложение через хост, я меняю цвет своего куба только у себя, на другом клиенте этого не вижу.
И наоборот, цвет другого куба игрока не вижу чтоб менялся у меня на экране.
Создал движение, чтоб определить что работает всё нормально, и работает, если я кручу свой куб, я вижу что у клиента тоже он крутится, но цвет не меняет всё равно!
Как это можно реализовать??
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayQwerty : NetworkBehaviour
{  
        public float move;
        public Color altColor = Color.black;
        public Color redColor = Color.red;
        public Color greenColor = Color.green;
        public Color blueColor = Color.blue;
        public Renderer rend;

    void Start ()
        {      
                rend = GetComponent<Renderer>();
        }    

        void Update()
        {
                if (!isLocalPlayer)
                        return;
                move = Input.GetAxis ("Vertical") * Time.deltaTime * 105.0f;
                transform.Rotate (0, move, 0);
                if (Input.GetKeyDown (KeyCode.G)){  
                        rend.material.color = greenColor;
                }
                if (Input.GetKeyDown (KeyCode.R)){  
                        rend.material.color = redColor;
                }
                if (Input.GetKeyDown (KeyCode.B)){  
                        rend.material.color = blueColor;
                }
                if (Input.GetKeyDown (KeyCode.A)) {
                        rend.material.color = altColor;
                }
        }    

        public override void OnStartLocalPlayer()
        {
                rend.material.color = altColor;
        }
}
 
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: UNET, изменение цвета одного игрока у всех на экране

Сообщение BFZ 05 июл 2018, 03:10

Я хоть в юнете не особо силен, и последний раз возился с ним несколько лет назад, и готовый скрипт тебе не напишу, но т.к. тебе никто не отвечает, попробую хотя бы подсказать в какую сторону копать.

Метод апдейт в твоем случае будет работать только у хозяина скрипта, соответственно нажатие клавиш и смена цвета материала тоже будет отрабатывать только у него, исключительно у него. Даже поворот в этом случае работает только у хозяина, и по сути остальные игроки не видели бы и этого. Однако поворот виден у других игроков из-за того, что ты, вероятно, повесил на этот куб компонент НетворкВью(кажется он, но точно не помню), и именно он передает позицию и поворот объекта всем остальным, а не твой скрипт.

Вывод такой, т.к. НетворкВью(или что там за это отвечает) умеет передавать только позицию и поворот(возможно что-то еще), то для передачи других переменных и вызовов необходимых методов нужно использовать что-то помимо этого, например вызывать методы можно с помощью RPC, а синхронизировать переменные с помощью атрибута СинкВар.

Это может выглядеть примерно так, мы(господин скрипта) в апдейте проверяем нажата ли кнопка, если нажата то меняем цвет, так же как и сейчас у тебя, но дополнительно к этому нам нужно вызвать РПЦ метод в которой мы передаем необходимый цвет, в котором он должен будет применить этот цвет к кубу, а этот РПЦ метод уже в свою очередь вызовется у всех остальных клиентов. Ну и там нюансы еще с тем, кто и что должен выполнять и посылать(сам клиент или сервер), но это про другое уже.

Повторюсь я не силен в юнет, и реализации могут/должны быть и другие, да и столько времени прошло уже, но суть примерно в том, что клиент что-то нажимая и меняя у себя, должен как минимум об этом сообщить остальным(или серверу), и сказать чтобы они проделали эту операцию и у себя(или это должен сказать сервер).
BFZ
UNITрон
 
Сообщения: 252
Зарегистрирован: 28 июн 2017, 02:16

Re: UNET, изменение цвета одного игрока у всех на экране

Сообщение ToxWill 05 июл 2018, 12:40

Полазил, еще в мануалках и туториалах, вроде чтот понял, но все равно проблемка осталась. На клиентском приложении вижу что меняет цвет куба у хоста, но на хосте не вижу чтоб клиент менял цвет своего куба.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayColor : NetworkBehaviour
{
        [SyncVar (hook = "OnChangeColor")] public Color myColor;

        void Update()
        {
                if (!isServer)
                        return;
                RpcPaint ();
        }

        void OnChangeColor(Color value)
        {
                myColor = value;
                GetComponent<MeshRenderer>().material.color = myColor;
        }

        [ClientRpc] void RpcPaint()
        {
                if (isLocalPlayer) {
                        if (Input.GetKeyDown (KeyCode.R))
                                OnChangeColor (Color.red);
                        if (Input.GetKeyDown (KeyCode.G))
                                OnChangeColor (Color.green);
                        if (Input.GetKeyDown (KeyCode.B))
                                OnChangeColor (Color.blue);    
                }
        }
}

 
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21

Re: UNET, изменение цвета одного игрока у всех на экране

Сообщение Friend123 05 июл 2018, 15:01

Я имел дело с UNET года 2 назад, полностью его изучил - в вашем случае всё просто, нужно использовать три вещи SyncVar, Command и ClientRpc. Могу поискать свои примеры как я делал подобное.
Приложите побольше кода, что на чем висит.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: UNET, изменение цвета одного игрока у всех на экране

Сообщение ToxWill 05 июл 2018, 15:45

Я разобрался! УРА! Мне помог метод AssignClientAuthority! Спасибо Всем, кто хоть как то помог :ymhug:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayColor : NetworkBehaviour
{
        [SyncVar] public Color myColor;
        [SyncVar] public GameObject objectID;
        private NetworkIdentity objNetId;

        void Update()
        {
                //ДЕЛАЕТ ТОЛЬКО ЧТО-ТО, ЕСЛИ ЭТО ДЕЛАЕТ ЛОКАЛЬНЫЙ ИГРОК
                //ПОЭТОМУ, ЕСЛИ 1 ИГРОК ЧТО-ТО ДЕЛАЕТ, ЭТО БУДЕТ СДЕЛАНО ТОЛЬКО НА КОМПЬЮТЕРЕ ИГРОКА 1
                //НО СЕТЕВЫЕ СКРИПТЫ БУДУТ СЛЕДИТЬ ЗА ТЕМБ ЧТОБЫ ВСЕ ЭТО ВИДЕЛИ
                if (isLocalPlayer) {
                        Check ();
                }
        }

        void Check()
        {
                if (isLocalPlayer) {
                        if (Input.GetKeyDown (KeyCode.R)) {
                                myColor = new Color (Random.value, Random.value, Random.value, Random.value);
                        }
                        CmdPaint (objectID, myColor);
                }
        }

        [ClientRpc] void RpcPaint(GameObject obj, Color col)
        {
                obj.GetComponent<Renderer> ().material.color = col;
                //ЭТО ЛИНИЯ, КОТОРАЯ ФАКТИЧЕСКМ ПРИВОДИТ К ИЗМЕНЕНИЮ ЦВЕТА
        }

        [Command] void CmdPaint (GameObject obj, Color col)
        {
                objNetId = obj.GetComponent<NetworkIdentity> (); //ПОЛУЧАЕТ ИНДИФИКАТОР ОБЪЕКТА
                objNetId.AssignClientAuthority (connectionToClient); //НАЗНАЧИТЬ ПОЛНОМОЧИЯ ИГРОКУ, КОТОРЫЙ МЕНЯЕТ ЦВЕТ
                RpcPaint (obj, col); //ИСПОЛЬЗУЕТСЯ ФУНКЦИЯ RPC КЛИЕНТА ДЛЯ РАССКРАСКИ ОБЪЕКТА НА ВСЕХ КЛИЕНТАХ
        }
}
 
ToxWill
UNец
 
Сообщения: 20
Зарегистрирован: 04 фев 2016, 15:21


Вернуться в Почемучка

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

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