UNET - Синхронизация. скрипт для цвета на неигровом объекте

Я пытался исправить это уже несколько недель, но безуспешно, и ДЕЙСТВИТЕЛЬНО нуждаюсь в помощи.

Я могу синхронизировать цвет на моих объектах, не относящихся к игроку, когда я инициирую синхронизацию цвета на фактическом объекте игрока.

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

Когда я перетаскиваю объект, не являющийся игроком, я окрашиваю его в красный цвет, а когда я бросаю перетаскивание, я перекрашиваю его обратно в белый цвет. Однако у меня возникают проблемы с авторизацией при перетаскивании удаленного клиента, и поэтому я думаю, что не могу решить.

Вот последовательность:

  1. On-DragStart a) AssignNetworkAuthority b) Измените цвет на красный
  2. Тащить, тянуть
  3. On_DragEnd а) Перекрасить в белый б) ReleaseNetworkAuthority

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

Вот код, который я использую (childGameObject назначен ранее):

public void On_DragStart (Gesture gesture) {

    if (!isLocalPlayer) 
        return;

    // Assign Network Authority
    myNetID = childGameObject.GetComponent<NetworkIdentity> ();

    // >>>> HERE I ASSIGN AUTHORITY
    Cmd_AssignNetworkAuthority (myNetID.netId, childGameObject);

    // >>>> HERE I CHANGE THE COLOR TO RED
    childGameObject.GetComponent<Renderer> ().material.color = Color.red;

}

public void On_Drag(Gesture gesture) {

    if (!hasAuthority)
        return;

    if (firstRun) {
        firstRun = false;
    }

    myTransform.transform.position = Camera.main.ScreenToWorldPoint (new Vector3 (gesture.position.x, gesture.position.y, 1f));

}

public void On_DragEnd (Gesture gesture) {

    if (!isLocalPlayer) 
        return;

    // >>>> HERE I CHANGE THE COLOR BACK TO WHITE
    //      gesture.pickedObject.GetComponent<Renderer> ().material.color = Color.white;
    childGameObject.GetComponent<Renderer> ().material.color = Color.white;

    // >>>> HERE I RELEASE AUTHORITY
    Cmd_ReleaseNetworkAuthority ();

}

Вот фактический сценарий sync.script, который прикреплен к объекту, не являющемуся игроком:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Object_ColorSync : NetworkBehaviour {

[SyncVar] private Color syncColor;
public GameObject myGO;

void Start () {
    syncColor = myGO.GetComponent<Renderer> ().material.color;
}

void Update () {
    DoColor ();
}

void DoColor() {
    Cmd_DoColor (myGO.GetComponent<Renderer> ().material.color);
}

[Command]
void Cmd_DoColor(Color _myColor) {

    syncColor = _myColor;
    Rpc_DoColor (_myColor);
}

[ClientRpc]
void Rpc_DoColor(Color _syncColor) {
    myGO.GetComponent<Renderer> ().material.color = _syncColor;
}
}

Синхронизация. script предназначен для тестирования, поэтому не очень оптимизирован в отношении того, когда я запускаю Cmd_DoColor. В конце я добавлю оператор if и проверю, был ли изменен цвет.


person PeterK    schedule 04.10.2016    source источник


Ответы (1)


Проблема решена :-) Я переосмыслил свой подход к этой проблеме после того, как опубликовал эту ветку и вместо этого применил ловушку SyncVar, и проблема была решена!

Вот новый код синхронизации:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Object_ColorSync : NetworkBehaviour {

[SyncVar (hook = "OnColorChange")] Color newColor;
private Color currentColor;


void OnColorChange(Color _myColor) {

    gameObject.GetComponent<Renderer> ().material.color = _myColor;
    currentColor = _myColor;

}

void Update () {

    if (!hasAuthority)
        return;

    if (currentColor != gameObject.GetComponent<Renderer> ().material.color) {
        Cmd_DoColor (gameObject.GetComponent<Renderer> ().material.color);
    }
}

[Command]
void Cmd_DoColor(Color _theColor) {
    newColor = _theColor;
}

}
person PeterK    schedule 04.10.2016