游戏对象旋转不会发生在客户端
GameObject Rotation does not happen on Client Side
翻转一个 2d 游戏对象并将其放置在完全相同的位置,这对双方都适用。
旋转 2d 游戏对象在两侧都很好
但是,如果我通过执行 Cmd_DoTheSpawn 翻转游戏对象,旋转不会反映在 "other" 客户端上。
我需要帮助才能完成这项工作。
这是我使用的代码:
[Command]
void Cmd_DoTheSpawn(GameObject myGameObject) {
// Check if front or back?
char lastChar = myGameObject.tag[myGameObject.tag.Length - 1];
if (lastChar == 'B') {
convertedObjectTag = unet_Back2Front [myGameObject.tag];
} else {
convertedObjectTag = unet_Front2Back [myGameObject.tag];
}
GameObject my1 = Resources.Load (convertedObjectTag) as GameObject;
float z = myGameObject.transform.localEulerAngles.z;
//var go = (GameObject)Instantiate (my1, myGameObject.transform.position, myGameObject.transform.localRotation);
var go = (GameObject)Instantiate(my1, myGameObject.transform.position, Quaternion.Euler(0f, 0f, z));
go.name = go.name.Remove(go.name.Length - 7); // Remove the '(Clone)' in name
NetworkServer.SpawnWithClientAuthority(go, base.connectionToClient);
print ("myGameObject: " + myGameObject.transform.position);
if (myGameObject == null)
print ("myGameObject NULL" + myGameObject.transform.position);
Rpc_DoTheRot (go, myGameObject);
myNetID = myGameObject.GetComponent<NetworkIdentity> ();
Cmd_DestroyGameObject (myNetID.netId);
}
感谢@LumbusterTick,我确实让它工作了,这意味着旋转没问题。但是,我确实遇到了另一个我不完全理解的问题。
我添加了以下代码:
[ClientRpc]
public void Rpc_DoTheRot(GameObject newGO, GameObject oldGO) {
print ("Rpc_DoTheRot");
if (newGO == null)
print ("newGO NULL");
if (oldGO == null)
print ("oldGO NULL");
newGO.transform.rotation = oldGO.transform.rotation;
}
...我在生成之后但在销毁之前调用它,请参阅上面更新的代码。
它确实将翻转的预制件置于正确的旋转位置,但我确实收到以下消息:
oldGO NULL
以及:
NullReferenceException: Object reference not set to an instance of an object
我非常清楚这意味着什么,但不知道为什么会这样,因为当我发送它们时,myGameObject 的所有值都为空。 ...我在销毁之前就这样做了。
我不明白为什么它为空但仍然影响新对象的旋转。
在网络生成后从命令函数调用 clientrpc 函数并将实例化的游戏对象传递给它并在那里更改其旋转。
翻转一个 2d 游戏对象并将其放置在完全相同的位置,这对双方都适用。 旋转 2d 游戏对象在两侧都很好
但是,如果我通过执行 Cmd_DoTheSpawn 翻转游戏对象,旋转不会反映在 "other" 客户端上。
我需要帮助才能完成这项工作。
这是我使用的代码:
[Command]
void Cmd_DoTheSpawn(GameObject myGameObject) {
// Check if front or back?
char lastChar = myGameObject.tag[myGameObject.tag.Length - 1];
if (lastChar == 'B') {
convertedObjectTag = unet_Back2Front [myGameObject.tag];
} else {
convertedObjectTag = unet_Front2Back [myGameObject.tag];
}
GameObject my1 = Resources.Load (convertedObjectTag) as GameObject;
float z = myGameObject.transform.localEulerAngles.z;
//var go = (GameObject)Instantiate (my1, myGameObject.transform.position, myGameObject.transform.localRotation);
var go = (GameObject)Instantiate(my1, myGameObject.transform.position, Quaternion.Euler(0f, 0f, z));
go.name = go.name.Remove(go.name.Length - 7); // Remove the '(Clone)' in name
NetworkServer.SpawnWithClientAuthority(go, base.connectionToClient);
print ("myGameObject: " + myGameObject.transform.position);
if (myGameObject == null)
print ("myGameObject NULL" + myGameObject.transform.position);
Rpc_DoTheRot (go, myGameObject);
myNetID = myGameObject.GetComponent<NetworkIdentity> ();
Cmd_DestroyGameObject (myNetID.netId);
}
感谢@LumbusterTick,我确实让它工作了,这意味着旋转没问题。但是,我确实遇到了另一个我不完全理解的问题。
我添加了以下代码:
[ClientRpc]
public void Rpc_DoTheRot(GameObject newGO, GameObject oldGO) {
print ("Rpc_DoTheRot");
if (newGO == null)
print ("newGO NULL");
if (oldGO == null)
print ("oldGO NULL");
newGO.transform.rotation = oldGO.transform.rotation;
}
...我在生成之后但在销毁之前调用它,请参阅上面更新的代码。
它确实将翻转的预制件置于正确的旋转位置,但我确实收到以下消息:
oldGO NULL
以及:
NullReferenceException: Object reference not set to an instance of an object
我非常清楚这意味着什么,但不知道为什么会这样,因为当我发送它们时,myGameObject 的所有值都为空。 ...我在销毁之前就这样做了。
我不明白为什么它为空但仍然影响新对象的旋转。
在网络生成后从命令函数调用 clientrpc 函数并将实例化的游戏对象传递给它并在那里更改其旋转。