UNET, изменение цвета одного игрока у всех на экране
Добавлено:
04 июл 2018, 17:44
ToxWill
Решил поэкспериментировать в 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;
}
}
Re: UNET, изменение цвета одного игрока у всех на экране
Добавлено:
05 июл 2018, 03:10
BFZ
Я хоть в юнете не особо силен, и последний раз возился с ним несколько лет назад, и готовый скрипт тебе не напишу, но т.к. тебе никто не отвечает, попробую хотя бы подсказать в какую сторону копать.
Метод апдейт в твоем случае будет работать только у хозяина скрипта, соответственно нажатие клавиш и смена цвета материала тоже будет отрабатывать только у него, исключительно у него. Даже поворот в этом случае работает только у хозяина, и по сути остальные игроки не видели бы и этого. Однако поворот виден у других игроков из-за того, что ты, вероятно, повесил на этот куб компонент НетворкВью(кажется он, но точно не помню), и именно он передает позицию и поворот объекта всем остальным, а не твой скрипт.
Вывод такой, т.к. НетворкВью(или что там за это отвечает) умеет передавать только позицию и поворот(возможно что-то еще), то для передачи других переменных и вызовов необходимых методов нужно использовать что-то помимо этого, например вызывать методы можно с помощью RPC, а синхронизировать переменные с помощью атрибута СинкВар.
Это может выглядеть примерно так, мы(господин скрипта) в апдейте проверяем нажата ли кнопка, если нажата то меняем цвет, так же как и сейчас у тебя, но дополнительно к этому нам нужно вызвать РПЦ метод в которой мы передаем необходимый цвет, в котором он должен будет применить этот цвет к кубу, а этот РПЦ метод уже в свою очередь вызовется у всех остальных клиентов. Ну и там нюансы еще с тем, кто и что должен выполнять и посылать(сам клиент или сервер), но это про другое уже.
Повторюсь я не силен в юнет, и реализации могут/должны быть и другие, да и столько времени прошло уже, но суть примерно в том, что клиент что-то нажимая и меняя у себя, должен как минимум об этом сообщить остальным(или серверу), и сказать чтобы они проделали эту операцию и у себя(или это должен сказать сервер).
Re: UNET, изменение цвета одного игрока у всех на экране
Добавлено:
05 июл 2018, 12:40
ToxWill
Полазил, еще в мануалках и туториалах, вроде чтот понял, но все равно проблемка осталась. На клиентском приложении вижу что меняет цвет куба у хоста, но на хосте не вижу чтоб клиент менял цвет своего куба.
Используется 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);
}
}
}
Re: UNET, изменение цвета одного игрока у всех на экране
Добавлено:
05 июл 2018, 15:01
Friend123
Я имел дело с UNET года 2 назад, полностью его изучил - в вашем случае всё просто, нужно использовать три вещи SyncVar, Command и ClientRpc. Могу поискать свои примеры как я делал подобное.
Приложите побольше кода, что на чем висит.
Re: UNET, изменение цвета одного игрока у всех на экране
Добавлено:
05 июл 2018, 15:45
ToxWill
Я разобрался! УРА! Мне помог метод AssignClientAuthority! Спасибо Всем, кто хоть как то помог
Используется 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 КЛИЕНТА ДЛЯ РАССКРАСКИ ОБЪЕКТА НА ВСЕХ КЛИЕНТАХ
}
}