/ / Как мога да използвам OnPhotonSerializeView? - c #, unity3d, фотон

Как мога да използвам OnPhotonSerializeView? - c #, unity3d, фотон

Аз съм в момента да инстанциира кутия, когатоиграчът го пуска (използвайки "PhotonNetwork.Instantiate"). Сега тази кутия, когато играчът падне, получава данни за това поле, под формата на Enum и след това разпределя стойността в полето. Но когато другият клиент го вземе, кутията няма никакви стойности.

Когато клиентът на потребителя намали полето:

Когато друг клиент го прекъсне:

код:

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



}

Както можете да видите, клиентът, който пуска кутията, има стойностите. но те не се предават на другите клиенти в мрежата. Как мога да поправя това?

Отговори:

0 за отговор № 1

Ако имате нужда от обекта в рамките на нивото, опитайтесъздаването на инстанция като обект на сцена вместо нормалното подреждане: PhotonNetwork.InstantiateSceneObject. Друго нещо е, че не се налага да хвърляте обекта под формата на обект като GameObject, защото фотонът вече го прави за вас, не е като нормална инстанция.

Също така, ако имате нужда само от една кутия на стая за игри,ще можете да постигнете по-добра производителност, ако създадете някаква логика, за да не унищожите полето, когато се сблъска с играч. Опитайте да го дезактивирате по някакъв начин, вместо да го унищожавате и рестантирате всеки път. Идеята е да се превърнат тласък = невалидни за компоненти като: Аниматор, SpriteRenderer, Colliders и др. След това, вместо да го инстанцирате отново, когато играчът го падне, просто включете отново тези компоненти, но не забравяйте да промените позицията на кутията, както вече правите.

)


0 за отговор № 2

Ето го работен пример за теб.

Искам да получа достъп до x, y, z от cube.cs за клиентите. cube.cs е прикрепен към prefab, който се зареди много пъти от сървъра, когато стаята се присъедини към капитана.

на сглобяемата аз създавам a PhotoView и след това плъзнете скрипта cube.cs (който също е прикрепен към същата префаб) на PhotonView "s"Наблюдавани компоненти".

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();
}
}
}