我怎么能使用OnPhotonSerializeView?

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

我现在要在播放器放下它时实例化一个盒子(使用“PhotonNetwork.Instantiate”)。现在这个盒子,当玩家放下它时,以Enum的形式给出关于该盒子的数据,然后将值分配给盒子。但是,当另一个客户端拿起它时,该框没有值。

When user client drops box:

When other client drops it:

码:

    [RPC] void dropItem(Item item){

    Vector3 playerPos = this.transform.position;
    Vector3 playerDirection = this.transform.forward;
    Quaternion playerRotation = this.transform.rotation;
    float spawnDistance = 1;

    Vector3 spawnPos = playerPos + playerDirection*spawnDistance;
    string itemname = item.itemName;


    GameObject itemAsGameObject = (GameObject)PhotonNetwork.Instantiate("DroppedItem", spawnPos, playerRotation, 0);

    itemAsGameObject.GetComponent<DroppedItem> ().item = item;



}

正如您所看到的那样,丢弃该框的客户端具有值。但它们并没有被传递给网络上的其他客户端。我怎样才能解决这个问题?

c# unity3d photon
2个回答
0
投票

如果您需要级别中的对象,请尝试将其实例化为场景对象而不是正常的实例化:PhotonNetwork.InstantiateSceneObject。另一件事是你不需要将实例化的对象强制转换为GameObject,因为光子已经为你做了,它不像普通的实例化。

此外,如果你只需要每个游戏室一个盒子,如果你创造了一些逻辑,当它与玩家发生碰撞时不会破坏盒子,你将能够达到更好的性能。尝试以某种方式取消它,而不是每次都破坏它并重新进行它。一个想法是将组件的enable = false变为:Animator,SpriteRenderer,Colliders等。然后,当玩家放弃它时,不要再次实例化它,只需再次打开这些组件,但不要忘记将框的位置更改为你已经在做了。

;)


0
投票

这是一个适合你的工作示例。

我希望从cube.cs访问客户端的x,y,z。 cube.cs附加到预制件上,当主人加入房间时,服务器会多次生成预制件。

在预制件上我创建了一个PhotoView,然后将cube.cs脚本(也连接到同一个预制件)拖到PhotonView的“观察到的组件”上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(PhotonView))]
public class cube : Photon.MonoBehaviour
{
    [SerializeField]
    public int x;
    [SerializeField]
    public int y;
    [SerializeField]
    public int z;
    [SerializeField]
    public int value;

    void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.SendNext(x);
            stream.SendNext(y);
            stream.SendNext(z);
        }
        else
        {
            x = (int)stream.ReceiveNext();
            y = (int)stream.ReceiveNext();
            z = (int)stream.ReceiveNext();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.