Jump to content
Unity Insider Forum

Photon Network / PUN2 Item in Chest synchronisation PROBLEM!


erotec

Recommended Posts

Hallo, ich arbeite gerade an meinen Multiplayer Inventar, mein Problem liegt darin, dass ich eine Chest instanziiere sowie die benötigten Slots, ich kann auch Items in diese Slots droppen, allerdings sieht der andere Spieler die Items nicht. Ich muss dazu sagen, dass ich, was Photon angeht, ein Neuling bin, besitze somit nur Grundkenntnisse, daher meine Frage, wie kann ich es möglich machen, dass der andere Spieler die Items in der Chest sieht und nutzen kann?

Das Inventar, also das Grundgerüst wird „gemeinsam“ verwendet, da es nicht auf dem Player liegt, sondern jeder Player die Instanz dazu aus der Hierarchie(Serverseitig) erhält, das Chest-Inventar wird von jedem Player nach dem Placement selber Instanziiert(gleiche Hierarchie wie das Haupt-Inventar in Canvas-Transform) die Slots werden dann in dem Haupt-Inventar jeweils hinterlegt und können belegt werden, bis dahin funktioniert alles super (war ein harter Kampf ;)) das Inventar, Items etc. sind keine Scriptable-Objects, arbeite auch nicht mit Containern etc. obwohl die Chests welche sein sollten. 

Gibt es überhaupt eine Möglichkeit, bei diesem Aufbau, das Item nur in der Chest dem anderen Spieler zugänglich zu machen, eventuell über eine RPC Methode und AddItem oder per Transform Sync... ?

 

Wäre für jede Hilfe DANKBAR!!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Schon etwas her mit Photon, dass ich mal benutzt habe, aber in PUN2 soweit ich weiß, gibt es keine serverseitigen Sachen, weil ja Cloudbasiert ist, allerdings gibt es ein MasterClient (der diesen Lobby/Raum erstellt hat). Kannst mich gerne besseres belehren, weil ist schon auch lange her.

Wenn es nicht automatisch synchronisiert wird, bist du dafür zuständig. Man kann RPC Methoden verwenden oder die Serializationsysteme mal anschauen, ob auch andere Wege gibt. Dein Grundgedanke muss so sein, dass, wenn ein Spieler etwas SELBER tut, dass auch bei anderen, die wichtigen Sachen genauso passieren muss.

Beispiel, wenn du z.B. ein Item zu einem Slot bewegst, dann könntest du sowas wie SetItemSlot(slotId, item) als RPC machen. Die Bewegung des Items ist ja egal, aber das Setzen des Slots ist ist wichtig. Ab da sollte meist für jeden Spieler gleich sein. Spieler weiß über den SlotId bescheid, weiß um welches Item es geht. Kann also bei sich im Spiel im SetSlot den Slot mit Item versehen. Und schon sollte bei jedem synchron ablaufen.

Sollte es so sein, dass auch Spieler nachträglich dazu kommen, müssen nur einfach die aktuelle Liste mit den Informationen gesendet werden. Ich weiß jetzt nicht, ob bei Photon sowas automatisch gibt. Aber dies auf jeden Fall über den Masterclient tun.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Antwort, das Problem ist, es gibt mit Sicherheit verschiedene Wege dies zu ermöglichen, leider fällt mir keiner dazu ein und nach stundenlanger suche im Net, war kein Code-Ansatz zu finden, den ich auch verstehe ;) 

Mein Gedanke war, dass, wenn der Lokale-Player ein Item aufhebt, dass der andere Spieler dies ebenfalls erhält, nur dass dieses nicht zusehen ist in seinem Inventar und, dass es dann, sobald der Lokale-Player das Item in seine Chest packt, die transform des inaktiven Items geändert wird und das Sprite etc. wieder aktiviert wird. Ich denke aber diese Vorgehensweise ist wohl eine der schlechtesten, wenn es um Datenspeicher etc. geht.

Die Möglichkeit mit der SlotId ist natürlich eine viel bessere Variante, nur müsste ich dazu, das ganze Inventar neu anpassen, aber nur allein die Slotid zu kennen wird natürlich nicht ausreichen, denn es würde das Item fehlen, welches der andere Player nicht besitzt, das würde bedeuten, der Lokale-Player müsste, sobald er sein Item in die Chest packt, dem anderen Player genauso zuweisen, und genau daran hapert es !! Leider...... ;) 

Ich denke ich könnte es in meinen DragandDrop-Script ermöglichen, leider bleibt die frage wie?

Hier ein Auszug des Scriptes, eventuell hast du eine Idee:

public class DragAndDrop : MonoBehaviour
{
   
    public Inventory inv;

    GameObject curSlot;
    
    Item curSlotsItem;

    public Image followMouseImage;

   
    private void Update()
    {


        DragAndDropM();
    }

    
    public void DragAndDropM()
    {
        followMouseImage.transform.position = Input.mousePosition;


        if (Input.GetKeyDown(KeyCode.G))
        {

            GameObject obj = GetObjectUnderMouse();
            if (obj)
                obj.GetComponent<Slot>().DropItem();


        }

        if (Input.GetMouseButtonDown(0))
        {
            curSlot = GetObjectUnderMouse();

        }


        else if (Input.GetMouseButton(0))
        {
            if (curSlot)
            {
                followMouseImage.color = new Color(255, 255, 255, 255);
                followMouseImage.sprite = curSlot.GetComponent<Image>().sprite;
            }

        }


        else if (Input.GetMouseButtonUp(0))
        {

            if (curSlot)
            {
                curSlotsItem = curSlot.GetComponent<Slot>().slotsItem;

                GameObject newObj = GetObjectUnderMouse();
                if (newObj && newObj != curSlot)
                {

                    if (newObj.GetComponent<EquipmentSlot>() && newObj.GetComponent<EquipmentSlot>().equipmenType != curSlotsItem.equipmentType)
                        return;

                    if (curSlot.GetComponent<Slot>().transform != curSlot.GetComponent<Slot>().transform)

                      

                    
                    if (newObj.GetComponent<Slot>().slotsItem)
                    {

                        Item objectsItem = newObj.GetComponent<Slot>().slotsItem;


                        if (objectsItem.itemID == curSlotsItem.itemID && objectsItem.amountInStack != objectsItem.maxStackSize && !newObj.GetComponent<EquipmentSlot>())
                        {
                            inv.AddItem(curSlotsItem, objectsItem);
                        }


                        else
                        {
                            objectsItem.transform.parent = curSlot.transform;
                            curSlotsItem.transform.parent = newObj.transform;
                        }
                    }
                    else
                    {

                        curSlotsItem.transform.parent = newObj.transform;
                        
                    

                    }
                    GameObject newObj2 = GetObjectUnderMouse();
                    if (newObj2 && newObj2 == curSlot)

                    {
                        print("am arsch");
                    }


                }

            }


            foreach (Slot i in inv.equipSlots)
            {
                i.GetComponent<EquipmentSlot>().Equip();
            }


        }
        else
        {
            followMouseImage.sprite = null;
            followMouseImage.color = new Color(0, 0, 0, 0);
        }

    }

   
  

    GameObject GetObjectUnderMouse()
    {
        GraphicRaycaster raycaster = GetComponent<GraphicRaycaster>();
        PointerEventData eventData = new PointerEventData(EventSystem.current);

        eventData.position = Input.mousePosition;

        List<RaycastResult> results = new List<RaycastResult>();

        raycaster.Raycast(eventData, results);

        foreach (RaycastResult i in results)
        {
            if (i.gameObject.GetComponent<Slot>())
            {
                return i.gameObject;
            }

        }
        return null;
    }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...