/ / मैं OnPhotonSerializeView का उपयोग कैसे कर सकता हूं? - सी #, यूनिटी 3 डी, फोटॉन

मैं OnPhotonSerializeView का उपयोग कैसे कर सकता हूं? - सी #, एकता 3 डी, फोटॉन

मैं वर्तमान में एक बॉक्स को इंस्टेंट करने के लिए हूंखिलाड़ी इसे छोड़ देता है ("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 के रूप में तात्कालिक वस्तु को डालने की आवश्यकता नहीं है, क्योंकि फोटॉन पहले से ही आपके लिए ऐसा करता है, यह सामान्य तात्कालिकता की तरह नहीं है।

इसके अलावा, यदि आपको प्रति गेम एक बॉक्स की आवश्यकता है,जब आप किसी खिलाड़ी के साथ टकराते हैं तो बॉक्स को नष्ट करने के लिए कुछ लॉजिक्स नहीं बनाते हैं, तो आप एक बेहतर प्रदर्शन तक पहुंचने में सक्षम होंगे। इसे नष्ट करने के बजाय किसी तरह इसे सक्षम करने का प्रयास करें और इसे हर बार रोकें। एक विचार घटकों के सक्षम = झूठ को चालू करने के लिए है: एनिमेटर, स्प्राइटरेंडर, कोलाइडर आदि। फिर, जब कोई खिलाड़ी इसे छोड़ता है, तो उसे फिर से शुरू करने के बजाय, बस उन घटकों को फिर से चालू करें, लेकिन "बॉक्स को बदलने के लिए मत भूलना" जैसा कि आप पहले से कर रहे हैं।

;)


जवाब के लिए 0 № 2

यहाँ है एक काम करने वाला उदाहरण तुम्हारे लिए।

मैं ग्राहकों के लिए x, y, z को cube.cs से एक्सेस करना चाहता हूं। cube.cs एक प्रीफ़ैब से जुड़ा होता है जो सर्वर द्वारा कई बार पैदा होता है जब कमरे को मास्टर द्वारा जोड़ा जाता है।

प्रीफैब पर मैं ए बनाता हूं PhotoView और फिर फोटोव्यू "s" के लिए cube.cs स्क्रिप्ट (जो एक ही प्रीफ़ैब से भी जुड़ी हुई है) खींचें।देखे गए घटक"।

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