同步从 Unet/Unity 5 中的另一个可交互对象更改的非玩家对象转换?
Sync non-player object transform that is changed from another interactable object in Unet/Unity 5?
我的游戏中有一个立方体,它在观察另一个物体时在其初始状态和更大的状态之间切换。这在单人游戏中运行良好,但是当我将它带到多人游戏时,我找不到正确的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍然可以激活自己的立方体,但不会出现在另一台机器上。该脚本位于具有网络标识的按钮上,它访问也具有网络标识和网络转换的多维数据集。
单人代码参考:
void Update () {
if (Camera.main != null) {
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
if (hit.collider.gameObject == gameObject && hit.distance < 5) {
PlatformScale();
} else {
PlatformReset();
}
}
}
}
void PlatformScale () {
platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformScale, 3f * Time.deltaTime);
}
void PlatformReset () {
platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformStartingScale, 3f * Time.deltaTime);
}
如果您还没有通读,我强烈建议您通读 Unity Networking Manual
我建议使用 [Command] 或 [ClientRpc](取决于哪些对象在服务器上,哪些是本地的)函数来 lerp 尺度。
不过,您可能不需要它们,因为您有网络转换。确保您在网络上正确地 spawned/instantiated 多维数据集。
编辑:在网络上生成立方体...
using UnityEngine;
using UnityEngine.Networking;
public class CubeStuff : NetworkBehaviour {
public GameObject cubePrefab;
public GameObject cube;
public override void OnStartServer() {
GameObject cubeSpawn = (GameObject)Instantiate(cubePrefab, transform.position, transform.rotation);
NetworkServer.Spawn(cubePrefab);
}
}
但是:根据文档,您不需要通过网络生成对象,只要它是 in the scene 因为这是为您处理的 - 所以您的问题出在其他地方。
我没有足够的信息来真正了解您的设置。您的按钮和 UI 可以是场景中的一个对象,只需确保它们已选中本地玩家权限并且它们的 OnClick()
引用正在调用 [Command]
函数。
所以经过多方查找,我发现在 Unet 中无法同步 localScale,这是一个突出的错误。我更改了我的代码以使用位置而不是本地比例。感谢大家的帮助。
我的游戏中有一个立方体,它在观察另一个物体时在其初始状态和更大的状态之间切换。这在单人游戏中运行良好,但是当我将它带到多人游戏时,我找不到正确的选项组合来让它在两个客户端(一个是主机)上更新。每个玩家仍然可以激活自己的立方体,但不会出现在另一台机器上。该脚本位于具有网络标识的按钮上,它访问也具有网络标识和网络转换的多维数据集。
单人代码参考:
void Update () {
if (Camera.main != null) {
RaycastHit hit;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit)) {
if (hit.collider.gameObject == gameObject && hit.distance < 5) {
PlatformScale();
} else {
PlatformReset();
}
}
}
}
void PlatformScale () {
platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformScale, 3f * Time.deltaTime);
}
void PlatformReset () {
platform.transform.localScale = Vector3.Lerp (platform.transform.localScale, platformStartingScale, 3f * Time.deltaTime);
}
如果您还没有通读,我强烈建议您通读 Unity Networking Manual
我建议使用 [Command] 或 [ClientRpc](取决于哪些对象在服务器上,哪些是本地的)函数来 lerp 尺度。
不过,您可能不需要它们,因为您有网络转换。确保您在网络上正确地 spawned/instantiated 多维数据集。
编辑:在网络上生成立方体...
using UnityEngine;
using UnityEngine.Networking;
public class CubeStuff : NetworkBehaviour {
public GameObject cubePrefab;
public GameObject cube;
public override void OnStartServer() {
GameObject cubeSpawn = (GameObject)Instantiate(cubePrefab, transform.position, transform.rotation);
NetworkServer.Spawn(cubePrefab);
}
}
但是:根据文档,您不需要通过网络生成对象,只要它是 in the scene 因为这是为您处理的 - 所以您的问题出在其他地方。
我没有足够的信息来真正了解您的设置。您的按钮和 UI 可以是场景中的一个对象,只需确保它们已选中本地玩家权限并且它们的 OnClick()
引用正在调用 [Command]
函数。
所以经过多方查找,我发现在 Unet 中无法同步 localScale,这是一个突出的错误。我更改了我的代码以使用位置而不是本地比例。感谢大家的帮助。