In der letzten Woche habe ich mit Unity3D an einem Inventarsystem gearbeitet. Zuerst bekam ich Hilfe von den Jungs von Design3, aber es dauerte nicht lange, bis wir uns trennten, weil mir die Art und Weise, wie sie ihren Code machten, wirklich nicht gefiel, es roch überhaupt nicht nach OOP.
Ich habe weitere Schritte voraus gemacht - Gegenstände belegen mehr als einen Steckplatz, ein erweitertes Platzierungssystem (Gegenstände versuchen ihr Bestes, um die beste Passform zu finden), ein lokales Maussystem (die Maus bleibt im aktiven Taschenbereich gefangen) usw.
Hier ist eine Demo meiner Arbeit.
Was wir in unserem Spiel haben möchten, ist eine automatische Organisationsfunktion - keine automatische Sortierung. Wir möchten diese Funktion, da unser Inventar in Echtzeit angezeigt wird - nicht wie in Resident Evil 1,2,3 usw., wo Sie das Spiel pausieren und Dinge in Ihrem Inventar erledigen würden. Stellen Sie sich jetzt vor, Sie befinden sich in einer schwierigen Situation, umgeben von Zombies, und Sie haben keine Kugeln. Sie sehen sich um. Sie sehen, dass sich Kugeln in der Nähe auf dem Boden befinden. Gehen Sie also zu ihnen und versuchen Sie, sie aufzuheben, aber sie ziehen nicht an passt nicht! Sie sehen sich Ihr Inventar an und stellen fest, dass es passt, wenn Sie einige der Artikel neu organisieren! - Jetzt hat der Spieler - in dieser Situation keine Zeit, sich neu zu organisieren, weil er von Zombies umgeben ist und stirbt, wenn er anhält und das Inventar organisiert, um Platz zu schaffen (Inventar in Echtzeit speichern, keine Pause) - würde nicht. Ist es nicht schön, dass das automatisch passiert? - Ja!
(Ich glaube, dies wurde in einigen Spielen wie Dungeon Belagerung oder so implementiert, also sicher, dass es machbar ist.)
Schauen Sie sich dieses Bild zum Beispiel an:
Ja, wenn Sie das Problem automatisch sortieren, erhalten Sie Ihre Leerzeichen, aber es ist schlecht, weil: 1- Teuer: Es ist kein ganzer Sortiervorgang erforderlich, um diese Leerzeichen freizugeben. Schieben Sie im ersten Bild einfach das rote Element an die ganz unten ganz links, und Sie erhalten die gleichen Leerzeichen, die Sie durch die automatische Sortierung erhalten haben. 2- Es ist ärgerlich für den Spieler: "Wer hat dir gesagt, dass du meine Sachen nachbestellen sollst?"
Ich frage nicht nach "Wie schreibe ich den Code?", Sondern frage nur nach einer Anleitung, wo ich suchen soll, welche Algorithmen beteiligt sind. Hat das etwas mit Grafiken und Sachen mit dem kürzesten Weg zu tun? Ich hoffe nicht, weil ich es nicht geschafft habe, mein College-Studium fortzusetzen: / Aber selbst wenn es so ist, sag es mir einfach und ich werde die damit verbundenen Dinge lernen.
Beachten Sie, dass es mehr als nur eine Lösung geben kann. Ich denke, das erste, was ich tun muss, ist herauszufinden, ob die Situation "lösbar" ist. Wenn ich weiß, wie ich feststellen kann, ob eine Situation lösbar ist oder nicht, kann ich sie "lösen". Ich muss nur die Bedingungen kennen, die es "lösbar" machen. Und ich glaube, dafür muss es einen Algorithmus / eine Datenstruktur geben.
Hier ist ein Bild für mehr als eine Lösung für den Versuch, ein 1x3-Objekt zu montieren:
Die Pfeile zeigen nur eine der Lösungen, aber wenn Sie schauen, werden Sie mehr als eine finden. Dies ist, was ich letztendlich nicht automatisch sortiere, sondern eine Lösung finde und anwende.
Beachten Sie, dass ich, wenn ich Zeit damit verbringe, einen Weg finden werde, es zu lösen, aber es wäre nicht der beste Weg, ein Autorad mit den Füßen statt mit den Händen zu halten! XD Oder einfach nur versuchen, ein Problem zu lösen, für das Arrays erforderlich sind, dessen Existenz Sie jedoch noch nicht kennen! Was ist der richtige Ansatz dafür?
Aktualisierungen aus dem Kommentar
@Stephen Ich bin wirklich kein Guru in Alogs, du hast 'Rucksack' erwähnt und @BlueRaja - Danny Pflughoeft hat ein 2D-Bin-Pack-Algo erwähnt. Sind sie irgendwie verwandt / gleich? - Ich bin immer noch verwirrt, wie ich das angehen soll.
Und ja, ich verwende bereits eine "Heuristik", aber ich wusste nicht wirklich, dass ich es bin: D Sie findet den ersten verfügbaren Steckplatz und prüft, ob der Artikel dort passt.
Ich weiß nicht, ob das Bestellen von Artikeln aufgrund ihrer "Sperrigkeit" (die ich nSlotsRequired = nRowsReq * nColsRec nenne) funktionieren würde, da Sie beispielsweise 2x2- und 1x4-Artikel haben, sie haben die gleiche Sperrigkeit, aber unterschiedliche Formen und haben ein anderer Effekt darauf, wie der Rest der Elemente als nächstes gehen wird. SO... :/
Ich habe dieses Video gesehen, die Idee mit der vollständigen Verpackung hat mir sehr gut gefallen, aber ich frage mich, wie ich vorgehen soll, da das Inventar 2D ist. Ich bin mir nicht mal sicher, ob das Verpacken von Behältern hier der Schlüssel ist, denn es stimmt, dass ich mehr als eine Tasche haben kann, aber in unserem Spiel wird es nur eine Tasche sein. Es geht also darum, Gegenstände in eine Tasche zu packen und nicht mehr. Die Beispiele in diesem Video (die Rohre und Busse) passen also nicht wirklich zu meinem Problem. Ich habe auch ein paar Sachen über diese Rucksack-Sache gesehen. Ich habe nicht gesehen, wie der 'Wert' mit meinen Gegenständen / meinem Inventar zusammenhängt, aber ich denke, 'Gewicht' ist dasselbe wie Sperrigkeit, nicht sicher.
Antworten:
Dies ist eine Variation des Rucksackproblems. Wie Danny Pflughoeft erwähnt, ist es NP-Complete. Das heißt, es kann nicht in linearer Zeit gelöst werden, wenn ich mich richtig erinnere.
Sie können jedoch versuchen, dies in mehreren Schritten zu lösen. Es ist im Grunde ein Sortierproblem.
Ich würde damit beginnen, die "Sperrigkeit" jedes Artikels zu berechnen: Dies kann auf verschiedene Arten berechnet werden:
Sperrigkeit = max (Länge, Breite);
Sperrigkeit = Länge * Breite
Sperrigkeit = sqrt (Länge * Breite)
Beginnen Sie dann damit, Gegenstände mit der höchsten Punktzahl zuerst in das Inventar aufzunehmen. Da sie höchstwahrscheinlich später nicht in den verbleibenden Raum passen. Kleine Gegenstände passen immer.
Sie benötigen eine Heuristik (ein ausgefallener Name für fundiertes Raten ;-)) für Ihre Platzierungsstrategie. So etwas wie der Versuch, Gegenstände in den ersten freien Steckplatz von oben links einzupassen oder so.
Die Inventarsortierungsstrategie von Diablo II funktionierte meiner Meinung nach ähnlich. Sachen wie Schwerter und Speere landeten oben links, dann Kleidung und Rüstungen, dann Buckler und so weiter.
Ich denke, Sie müssen dies wirklich ausprobieren und den Algorithmus optimieren (unterschiedliche Bulkiness-Berechnung, unterschiedliche Heuristik), bis er vernünftig genug funktioniert.
quelle
Haha, @Jeder, der geholfen hat, danke. Ich habe es endlich geschafft, es zu lösen. Folgendes habe ich im Grunde getan:
AKTUALISIEREN:
Ich habe ein Array erstellt, in dem die Indizes aller hinzugefügten Elemente gespeichert sind. Auf diese Weise muss ich nicht nach den belegten Slots suchen, um sie freizugeben - ein großer Schub.
Keine Notwendigkeit, am letzten Steckplatz hinzuzufügen, in der Tat funktioniert es manchmal nicht so. Ich habe das gewünschte Element zu den anderen Elementen hinzugefügt und es mit ihnen sortiert.
Wie Sie dem Video entnehmen können, muss es ein wenig optimiert werden. Die Sortierung ist nicht perfekt. Ich würde gerne eine vollständige Behälterverpackung verwenden, aber sie ist bereits leistungsgierig. Ich bin offen für Optimierungsvorschläge, nochmals vielen Dank :)
quelle