Unity Coin Collect Photon Pun 2

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

我正在尝试为玩家创建一个收集硬币的系统,如果收集了硬币,那么钥匙就会产生,但是当玩家收集硬币时我遇到了一个问题,即当第一枚硬币被销毁时,然后光子视图硬币被销毁,当玩家想要收集第二个硬币时,光子视图已被销毁。怎么,我把硬币弄坏了,但光子视图没有被破坏? 这是错误:非法视图 ID:0 方法:CollectCoin GO:Coin (2) UnityEngine.Debug:LogError(对象)

using UnityEngine;
using Photon.Pun;

public class Coin : MonoBehaviourPun
{

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            Debug.Log("Player collided with coin");
            if (PhotonNetwork.IsMasterClient)
            {
                photonView.RPC("CollectCoin", RpcTarget.All, other.gameObject.GetComponent<PhotonView>().ViewID);
            }
        }
    }

    [PunRPC]
    public void CollectCoin(int playerViewID)
    {
        CoinCollect playerCoinCollection = PhotonView.Find(playerViewID).gameObject.GetComponent<CoinCollect>();

        string playerName = PhotonView.Find(playerViewID).gameObject.name;

        // playerCoinCollection.CollectCoin(playerName);
        photonView.RPC("DeactivateCoin", RpcTarget.All);
    }

    [PunRPC]
    void DeactivateCoin()
    {
         PhotonNetwork.Destroy(gameObject);
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class CoinCollect : MonoBehaviourPunCallbacks, IPunObservable
{
    public GameObject keyPrefab;
    private int coinCount;
    private int playerCount;
    private int coinsNeeded;

    void Start()
    {
        playerCount = PhotonNetwork.PlayerList.Length; 

        switch (playerCount)
    {
        case 1:
            coinsNeeded = 1;
            break;
        case 2:
            coinsNeeded = 2;
            break;
        case 3:
            coinsNeeded = 15;
            break;
        case 4:
            coinsNeeded = 20;
            break;
        default:
            Debug.LogError("Unsupported player count: " + playerCount);
            break;
    }
    }

    // Trigger when player collects coin
    public void CollectCoin()
    {
        coinCount++;
        CheckCoinCount();
    }

    private void CheckCoinCount()
    {
        if (coinCount >= coinsNeeded)
        {
            SpawnKey();
        }
    }

    private void SpawnKey()
    {
        PhotonNetwork.Instantiate(keyPrefab.name, new Vector3(0, 0, 0), Quaternion.identity);
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            stream.SendNext(coinCount);
        }
        else
        {
            this.coinCount = (int)stream.ReceiveNext();
        }
    }
}

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

我认为问题出在

DeactivateCoin()
方法,它正在调用
PhotonNetwork.Destroy
.
PhotonNetwork.Destroy
接到所有客户的电话。但是,您还通过 RPC 从每个客户端调用它。
最终客户会调用它并且视图已经被破坏,我相信这是异常的来源。

相反,让一个客户(主客户或收集代币的客户)打电话给

PhotonNetwork.Destroy

这里不需要 RPC 来进行销毁。

© www.soinside.com 2019 - 2024. All rights reserved.