我如何使用OnPhotonSerializeView

本文关键字:OnPhotonSerializeView 何使用 | 更新日期: 2023-09-27 17:56:29

我目前要在玩家放下盒子时实例化它(使用"PhotonNetwork.Instantiate")。现在这个盒子,当玩家放下它时,会以枚举的形式获得有关该盒子的数据,然后将值分配给盒子。但是,当其他客户端选取它时,该框没有值。

当用户客户端放置框时:

当其他客户端丢弃它时:

法典:

    [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;

}

如您所见,丢弃框的客户端具有这些值。 但它们不会传递给网络上的其他客户端。 我该如何解决这个问题?

我如何使用OnPhotonSerializeView

这是一个适合您的工作示例

我希望从立方体访问 x,y,z.cs 对于客户端。Cube.cs 附加到一个预制件,当主文件室加入房间时,服务器会多次生成该预制件。

在预制件上,我创建了一个 PhotoView,然后将立方体.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();
        }
    }
}

如果您需要关卡中的对象,请尝试将其实例化为场景对象,而不是正常的实例化:PhotonNetwork.InstantiateSceneObject。另一件事是,您不需要将实例化的对象转换为游戏对象,因为光子已经为您执行此操作,它不像正常的实例化。

另外,如果你每个游戏室只需要一个盒子,如果你创建一些逻辑来在盒子与玩家碰撞时不会破坏盒子,你将能够达到更好的性能。尝试以某种方式禁用它,而不是每次都破坏和恢复它。一个想法是将启用 = false 的组件,例如:动画器、精灵渲染器、碰撞体等。然后,当玩家放下它时,不要再次实例化它,只需再次打开这些组件,但不要忘记像您已经做的那样更改盒子的位置。

;)

相关文章:
  • 没有找到相关文章