我已经尝试解决这个问题好几个星期了,但没有成功,我真的需要帮助。
当我在实际播放器对象上启动颜色同步时,我能够在我的非播放器对象上同步颜色。
但是,我遇到的问题是我想将脚本附加到管理颜色同步的非播放器对象。我对位置和旋转同步也有同样的效果。
当我拖动非玩家对象时,我将其着色为红色,当我放下拖动时,我将其重新着色为白色。但是,我在拖动远程客户端时遇到授权问题,这就是我认为我无法解决的原因。
这是顺序:
- On-DragStart a) AssignNetworkAuthority b) 将颜色更改为红色
- 拖
- On_DragEnd a) 重绘为白色 b) 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;
}
}
同步。脚本用于测试,所以当我启动 Cmd_DoColor 时并没有真正优化。最后,我将添加一个 if 语句并检查颜色是否已更改。