Photon PUN 2 实例化对象超出了我的预期

问题描述 投票:0回答:1

我对制作多人游戏和使用 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 方法中。

再说一次,我对此很陌生,所以如果需要更多信息,请告诉我。

c# unity-game-engine photon
1个回答
0
投票

你正在呼唤

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);
© www.soinside.com 2019 - 2024. All rights reserved.