Я пытался исправить это уже несколько недель, но безуспешно, и ДЕЙСТВИТЕЛЬНО нуждаюсь в помощи.
Я могу синхронизировать цвет на моих объектах, не относящихся к игроку, когда я инициирую синхронизацию цвета на фактическом объекте игрока.
Однако проблема в том, что я хочу прикрепить скрипт к объекту, не связанному с игроком, который управляет синхронизацией цвета. У меня то же самое для синхронизации положения и вращения, которое работает.
Когда я перетаскиваю объект, не являющийся игроком, я окрашиваю его в красный цвет, а когда я бросаю перетаскивание, я перекрашиваю его обратно в белый цвет. Однако у меня возникают проблемы с авторизацией при перетаскивании удаленного клиента, и поэтому я думаю, что не могу решить.
Вот последовательность:
- On-DragStart a) AssignNetworkAuthority b) Измените цвет на красный
- Тащить, тянуть
- 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 и проверю, был ли изменен цвет.