Wie gehe ich mit fehlenden Ressourcen um?

13

Ihr Spiel erwartet, dass ein bestimmtes Asset geladen wird, aber es wird nicht gefunden. Wie soll mit der Situation umgegangen werden? Beispielsweise:

Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found
Mesh* car             = LoadMesh("Car.obj");      // returns NULL; 3D mesh not found

Es wurde möglicherweise versehentlich vom Benutzer gelöscht, beschädigt oder während der Entwicklung falsch geschrieben.

Einige mögliche Antworten:

  • Behauptungen (idealerweise nur während der Entwicklung)
  • Beende das Spiel mit Anmut
  • Wirf eine Ausnahme und versuche damit umzugehen.

Welcher Weg ist der beste?

concept3d
quelle
Eine Möglichkeit besteht darin, zu überprüfen, ob die Spieldaten noch intakt sind. Wenn nicht, laden Sie die fehlenden Daten automatisch erneut herunter. Fehler> Benutzer auffordern, Daten zu überprüfen> Herunterladen. Dazu müssen Sie natürlich ein kleines Tool erstellen.
Sidar
@Sidar Ich mag, was Sie gesagt haben, mehr als die am häufigsten gewählte Antwort. Vielleicht können Sie besser erklären, was Sie sagen wollen
concept3d
Die Hässlichkeit von Fehlern ist, dass es manchmal das Spiel bricht und die Leute es nicht spielen / starten können. Wenn Ihr Spiel beispielsweise in Steam nicht ordnungsgemäß funktioniert, können Sie die Spieldaten überprüfen. Wenn etwas korrupt zu sein scheint / fehlt / sich geändert hat, lädt Steam diese Dateien automatisch erneut herunter. Ich weiß nicht genau, wie sie das machen. Aber sie prüfen es offensichtlich anhand einiger Daten. Vielleicht Hash-Codes? Ich weiß es wirklich nicht. Aber Sie sollten immer ein Standard-Ersatz-Asset haben (einfach Textur, die "Fehler" drauf oder so sagt)
Sidar
@Sidar warum nicht schön in eine Antwort formatieren?
concept3d
Weil ich nicht genau weiß, wie es funktioniert und nicht falsch informiert werden möchte. Also konnte ich dir keine richtige Antwort geben.
Sidar

Antworten:

19

Viele Spiele haben ein allgemeines "Fehlermaterial" und ein "Fehlermesh", das wirklich offensichtlich ist. Koppeln Sie dies natürlich mit einer Warnung in den Protokollen.

Robert Fraser
quelle
Stimmen Sie diesem Beitrag voll und ganz zu. Möglicherweise möchten Sie jedoch in einem Release / Distributed Build andere Aktionen ausführen.
Jonkel
Für Release-Builds könnte man sich eine Möglichkeit überlegen, die verfügbaren Dateien mithilfe von Hashing zu validieren, um fehlende oder ungültige Dateien herunterzuladen. Während der Entwicklung ist es jedoch definitiv die beste Möglichkeit, eine schwarz-magentafarbene Schachbrettstruktur anzuzeigen, um Ihre Aufmerksamkeit auf sich zu ziehen. Für Modelle könnte man ein riesiges ERROR-Modell verwenden, was offensichtlich sein sollte.
Christian Ivicevic
Dies ist für Texturen sinnvoll. Nicht so sehr für 3D-Modelle. Was ist, wenn die meisten 3D-Modelle fehlen? Das Spiel wird lustig aussehen, während es in erster Linie spielbar sein sollte. Was passiert, wenn Sie Ihre räumliche Datenstruktur basierend auf den geometrischen Eigenschaften der 3D-Modelle berechnen, was passieren soll? Ich bin damit nur unter einfachen Umständen wie fehlende Textur. Ich denke jedoch, dass die Vollständigkeitsprüfung von Daten für kommerzielle Spiele nur ein besserer Ansatz ist.
concept3d
1
@ concept3d - Ich weiß, dass zumindest die Source-Engine ein großes, offensichtliches Fehler-Mesh hat (ich habe es gelegentlich im Dota 2-Testclient gesehen, als sie Helden hinzufügten). Ich bin damit einverstanden, dass es wahrscheinlich am besten ist, wenn große Mengen von Level-Daten fehlen, Fehler zu beseitigen, insbesondere in einem Release-Build, aber für Debugging-Zwecke ist es nicht so schlimm, ein großes Fragezeichen herumzutanzen.
Robert Fraser
6

Wenn Sie verschiedene Auflösungselemente mit derselben Textur haben , können Sie versuchen, die Situation mit einer anderen Auflösung zu beheben.

Texture* grassTexture;
try {
    grassTexture = LoadTexture("Grass.png");
} catch (WhateverExcaption e) {
    grassTexture = LoadTexture("Grass_512.png");
}

Wenn auch das fehlschlägt, könnte es Zeit zu retten sein.

Daniel
quelle
2
Sie können dem Fang einen Umschalter hinzufügen, so dass Sie in Dev immer das fehlende Mesh / Tex anzeigen, aber wenn es veröffentlicht wird, würde es versuchen, sich zuerst zu erholen und möglicherweise eine weniger offensichtliche fehlende Textur zu haben.
DampeS8N