RemoveClientAuthority() 在 5.4.0 F3 中似乎仍然被破坏。这是BUG吗? ...或者我做错了什么
RemoveClientAuthority() still seems to be broken in 5.4.0 F3. Is this a BUG? ...or what do I do wrong
这与 http://forum.unity3d.com/threads/re...ms-to-be-broken-in-5-2-1.359149/#post-2785856
中的问题相同
我的问题如下:
1) 为对象分配客户端权限:AssignClientAuthority
2) 移动对象,有效
3) 应用 RemoveClientAuthority,对象快速回到客户端的原始位置。 "TEST" 调用只是为了查看它是否适用于最后一个对象。
这是bug还是我做错了?
这是我所做测试的代码示例:
foreach (string tagName in MP_Singleton.Instance.master_Object_List) {
temp_GameObject = GameObject.FindWithTag(tagName);
Cmd_LocalAuthority (true, temp_GameObject);
temp_GameObject.GetComponent<Renderer>().sortingOrder = z;
randomX = UnityEngine.Random.Range (-0.055f, 0.055f);
randomY = UnityEngine.Random.Range (-0.055f, 0.055f);
randomX = randomX + deckStartPosX;
randomY = randomY + deckStartPosY;
Rpc_Position (temp_GameObject, randomX, randomY, z, twistAngle);
// Add to depth
z++;
}
Cmd_LocalAuthority (false, temp_GameObject); //<< TEST
RPC:
[ClientRpc]
void Rpc_Position(GameObject myGO, float ranX, float ranY, int zDepth, float twist) {
myGO.transform.position = new Vector3 (ranX, ranY, zDepth);
myGO.transform.localEulerAngles = new Vector3(0f, 0f, twist);
}
Cmd_LocalAuthority:
[Command]
void Cmd_LocalAuthority(bool getAuthority, GameObject obj) {
objNetId = obj.GetComponent<NetworkIdentity> (); // get the object's network ID
if (getAuthority) {
objNetId.AssignClientAuthority (connectionToClient); // assign authority to the player
} else {
objNetId.RemoveClientAuthority (connectionToClient); // remove the authority from the player
}
}
Unity 的大神帮我解决了这个问题,是我自己的错误。
我至少花了 2 - 3 个月的时间来尝试修复,他们立即修复了。
我错过的是我在导致问题的 pos-sync-script 中检查了权限。它在 "Cmd_ProvidePositionToServer".
代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Object_SyncPosition : NetworkBehaviour {
private Transform myTransform;
[SerializeField] float lerpRate = 5;
[SyncVar] private Vector3 syncPos;
private NetworkIdentity theNetID;
private Vector3 lastPos;
private float threshold = 0.5f;
void Start () {
myTransform = GetComponent<Transform> ();
syncPos = GetComponent<Transform>().position;
}
void FixedUpdate () {
TransmitPosition ();
LerpPosition ();
}
void LerpPosition () {
if (!hasAuthority) {
myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime * lerpRate);
}
}
[Command]
void Cmd_ProvidePositionToServer (Vector3 pos) {
syncPos = pos;
}
[ClientCallback]
void TransmitPosition () {
if (hasAuthority && Vector3.Distance(myTransform.position, lastPos) > threshold) {
Cmd_ProvidePositionToServer (myTransform.position);
lastPos = myTransform.position;
}
}
}
这与 http://forum.unity3d.com/threads/re...ms-to-be-broken-in-5-2-1.359149/#post-2785856
中的问题相同我的问题如下:
1) 为对象分配客户端权限:AssignClientAuthority
2) 移动对象,有效
3) 应用 RemoveClientAuthority,对象快速回到客户端的原始位置。 "TEST" 调用只是为了查看它是否适用于最后一个对象。
这是bug还是我做错了?
这是我所做测试的代码示例:
foreach (string tagName in MP_Singleton.Instance.master_Object_List) {
temp_GameObject = GameObject.FindWithTag(tagName);
Cmd_LocalAuthority (true, temp_GameObject);
temp_GameObject.GetComponent<Renderer>().sortingOrder = z;
randomX = UnityEngine.Random.Range (-0.055f, 0.055f);
randomY = UnityEngine.Random.Range (-0.055f, 0.055f);
randomX = randomX + deckStartPosX;
randomY = randomY + deckStartPosY;
Rpc_Position (temp_GameObject, randomX, randomY, z, twistAngle);
// Add to depth
z++;
}
Cmd_LocalAuthority (false, temp_GameObject); //<< TEST
RPC:
[ClientRpc]
void Rpc_Position(GameObject myGO, float ranX, float ranY, int zDepth, float twist) {
myGO.transform.position = new Vector3 (ranX, ranY, zDepth);
myGO.transform.localEulerAngles = new Vector3(0f, 0f, twist);
}
Cmd_LocalAuthority:
[Command]
void Cmd_LocalAuthority(bool getAuthority, GameObject obj) {
objNetId = obj.GetComponent<NetworkIdentity> (); // get the object's network ID
if (getAuthority) {
objNetId.AssignClientAuthority (connectionToClient); // assign authority to the player
} else {
objNetId.RemoveClientAuthority (connectionToClient); // remove the authority from the player
}
}
Unity 的大神帮我解决了这个问题,是我自己的错误。
我至少花了 2 - 3 个月的时间来尝试修复,他们立即修复了。
我错过的是我在导致问题的 pos-sync-script 中检查了权限。它在 "Cmd_ProvidePositionToServer".
代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Object_SyncPosition : NetworkBehaviour {
private Transform myTransform;
[SerializeField] float lerpRate = 5;
[SyncVar] private Vector3 syncPos;
private NetworkIdentity theNetID;
private Vector3 lastPos;
private float threshold = 0.5f;
void Start () {
myTransform = GetComponent<Transform> ();
syncPos = GetComponent<Transform>().position;
}
void FixedUpdate () {
TransmitPosition ();
LerpPosition ();
}
void LerpPosition () {
if (!hasAuthority) {
myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime * lerpRate);
}
}
[Command]
void Cmd_ProvidePositionToServer (Vector3 pos) {
syncPos = pos;
}
[ClientCallback]
void TransmitPosition () {
if (hasAuthority && Vector3.Distance(myTransform.position, lastPos) > threshold) {
Cmd_ProvidePositionToServer (myTransform.position);
lastPos = myTransform.position;
}
}
}