我对制作多人游戏和使用 PUN 2 相当陌生。我正在尝试制作一个工具系统,其中您正在使用的当前工具在所有玩家之间同步,以便每个人都可以看到您正在使用的内容。
该脚本在大部分情况下都有效,但由于某种原因,这些工具被实例化两次。即使脚本将实例化对象作为 toolSlot 转换的父对象,额外的对象也不会成为任何对象的父对象。
public class ToolManager : MonoBehaviour, IPunObservable
{
public SA_Tool[] Tools;
public Transform toolSlot;
private GameObject currentToolInstance;
private PhotonView photonView;
private void Start()
{
photonView = GetComponent<PhotonView>();
}
private void Update()
{
if (photonView.IsMine && Input.GetMouseButtonDown(0))
{
SwitchTool(0);
}
}
private void SwitchTool(int newIndex)
{
DestroyCurrentTool();
currentToolInstance = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs/Tool Models", Tools[newIndex].model.name), transform.position, transform.rotation);
SetToolTransform(currentToolInstance);
photonView.RPC("RPCSyncToolChange", RpcTarget.Others, newIndex);
}
private void SetToolTransform(GameObject tool)
{
tool.transform.SetParent(toolSlot, false);
tool.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity);
}
private void DestroyCurrentTool()
{
if (currentToolInstance != null)
{
Debug.Log("Destroying current tool instance...");
PhotonNetwork.Destroy(currentToolInstance);
}
}
[PunRPC]
private void RPCSyncToolChange(int newIndex)
{
DestroyCurrentTool();
currentToolInstance = PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs/Tool Models", Tools[newIndex].model.name), transform.position, transform.rotation);
SetToolTransform(currentToolInstance);
}
}
我放入了一些 Debug.Logs 来检查它是否在 DestroyCurrentTool() 方法中销毁了额外的对象,但这从未显示在控制台中。我也尝试过在不同的方法中调用 SetTool() ,它做了同样的事情,所以我不认为这是因为它在 update 方法中。
再说一次,我对此很陌生,所以如果需要更多信息,请告诉我。
你正在呼唤
PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs/Tool Models", Tools[newIndex].model.name), transform.position, transform.rotation);
两次,一次在
SwitchTool
中,然后再次在 RPC 中。
每个调用都会为所有客户端实例化网络范围内的对象!
在您的情况下,您根本不应该使用网络生成,因为您的 RPC 无论如何都是以在远程客户端上完成销毁和实例化的方式构建的。
=> 也许应该是这样
currentToolInstance = Instantiate(Tools[newIndex].model), transform.position, transform.rotation);
SetToolTransform(currentToolInstance);
因此也使用正常
Destroy(currentToolInstance);