Willkommen zu dieser umfassenden Anleitung, die Ihnen zeigt, wie Sie in Unreal Engine 4 (UE4) den Charakter wechseln können, wenn ein Spieler ein neues Level betritt. Dies ist eine gängige Anforderung in vielen Spielen, insbesondere in solchen, die unterschiedliche Gameplay-Stile oder Charaktere mit spezifischen Fähigkeiten in verschiedenen Umgebungen bieten. Wir werden verschiedene Methoden untersuchen, von einfachen Blueprint-Lösungen bis hin zu fortgeschritteneren C++-Implementierungen, um Ihnen die Flexibilität zu geben, die für Ihr Projekt am besten geeignete Option zu wählen.
Warum sollte man den Charakter per Level wechseln?
Es gibt viele Gründe, warum Sie den Charakter per Level wechseln möchten. Hier sind einige der häufigsten:
- Spielmechanik-Anpassung: In verschiedenen Levels kann es erforderlich sein, dass der Spieler einen Charakter mit bestimmten Fähigkeiten verwendet, um Herausforderungen zu meistern.
- Storytelling: Der Charakterwechsel kann die Geschichte vorantreiben und dem Spieler die Perspektive verschiedener Charaktere ermöglichen.
- Progression: Der Spieler kann zu Beginn eines Levels einen neuen Charakter freischalten, der im vorherigen Level noch nicht verfügbar war.
- Abwechslung: Das Wechseln des Charakters hält das Gameplay frisch und verhindert Monotonie.
Grundlagen: Level-Blueprint und Game Mode
Bevor wir uns den spezifischen Methoden zum Charakterwechsel zuwenden, sollten wir uns kurz mit den Grundlagen der Level-Blueprints und des Game Modes in UE4 beschäftigen. Der Level-Blueprint ist ein visueller Scripting-Bereich, der mit einem bestimmten Level verknüpft ist. Er eignet sich hervorragend für Level-spezifische Logik. Der Game Mode hingegen definiert die Spielregeln und Standard-Klassen, die für ein bestimmtes Spiel verwendet werden, einschließlich des Standard-Pawn-Klassen. Wir werden diese beiden Komponenten in unseren Lösungen nutzen.
Methode 1: Verwenden des Level-Blueprints und „Open Level”
Diese Methode ist relativ einfach und eignet sich gut für Spiele mit wenigen Levels oder wenn die Logik einfach gehalten werden soll.
- Erstellen Sie Ihre Charaktere: Stellen Sie sicher, dass Sie die Charakter-Blueprints (z.B.
BP_CharacterA
undBP_CharacterB
) erstellt haben, die Sie verwenden möchten. - Öffnen Sie den Level-Blueprint: Gehen Sie zum Level, in dem Sie den Charakter wechseln möchten. Öffnen Sie den Level-Blueprint (Fenster -> Blueprints -> Level Blueprint).
- Fügen Sie Logik zum Level-Übergang hinzu: Verwenden Sie einen Trigger (z.B. eine Box Collision) oder ein anderes Ereignis, um den Level-Übergang auszulösen. Fügen Sie im Level-Blueprint ein „OnComponentBeginOverlap” Event für Ihren Trigger hinzu.
- Speichern Sie die aktuellen Player-Daten (optional): Wenn Sie Daten vom vorherigen Charakter übernehmen möchten (z.B. Inventar, Gesundheit), müssen Sie diese vor dem Wechsel speichern. Verwenden Sie Variablen im Game Instance oder in einem SaveGame Object.
- „Open Level” Node: Ziehen Sie vom Output-Pin des „OnComponentBeginOverlap” Events einen Knoten und suchen Sie nach „Open Level”. Verbinden Sie den Namen des Levels, zu dem Sie wechseln möchten, mit dem „LevelName”-Eingabepin.
- Charakter-Wechsel im neuen Level:
- Öffnen Sie den Level-Blueprint des neuen Levels.
- Fügen Sie ein „Event BeginPlay” hinzu.
- Erstellen Sie eine „Get Player Character” Node, um auf den aktuellen Charakter zuzugreifen.
- Zerstören Sie den aktuellen Charakter („Destroy Actor” Node).
- Spawnen Sie den neuen Charakter: Erstellen Sie eine „Spawn Actor from Class” Node und wählen Sie den neuen Charakter Blueprint aus. Die Spawn-Location sollte idealerweise die gleiche sein wie der vorherige Charakter. Verwenden Sie „Get Actor Location” vom vorherigen Charakter, bevor Sie ihn zerstören, und verbinden Sie die Location mit dem Spawn-Transform des neuen Charakters.
- Besitzen Sie den neuen Charakter: Erstellen Sie eine „Possess” Node und verbinden Sie den Output des „Spawn Actor from Class” Nodes mit dem „Pawn” Input. Verbinden Sie „Get Player Controller” mit dem „Controller” Input.
- Laden Sie die gespeicherten Daten (optional): Laden Sie die gespeicherten Daten aus dem Game Instance oder SaveGame Object und wenden Sie sie auf den neuen Charakter an.
Vorteile: Einfach zu implementieren, besonders für einfache Projekte.
Nachteile: Kann bei vielen Levels unübersichtlich werden, da die Logik in jedem Level-Blueprint dupliziert wird. Schwieriger, Daten zwischen Charakteren zu übertragen.
Methode 2: Anpassen des Game Modes
Diese Methode bietet eine zentralere und organisiertere Lösung, insbesondere für größere Projekte. Wir verwenden den Game Mode, um das Spawnen des Charakters zu steuern.
- Erstellen Sie Ihren eigenen Game Mode: Erstellen Sie eine neue Blueprint-Klasse, die von „GameModeBase” oder „GameMode” abgeleitet ist (z.B.
MyGameMode
). - Erstellen Sie Ihre Charaktere: Stellen Sie sicher, dass Sie die Charakter-Blueprints (z.B.
BP_CharacterA
undBP_CharacterB
) erstellt haben. - Erstellen Sie eine Variable für die Standard-Pawn-Klasse im Game Mode: Im Blueprint Ihres Game Modes erstellen Sie eine Variable vom Typ „Class Reference” und setzen Sie den Basistyp auf „Pawn”. Nennen Sie die Variable z.B. „DefaultCharacterClass”.
- Ändern Sie die Default Pawn Class: In Ihrem Game Mode-Blueprint können Sie die „DefaultCharacterClass”-Variable auf den gewünschten Charakter für jedes Level setzen. Sie können dies entweder statisch im Konstruktor des Game Mode Blueprints tun (weniger flexibel) oder dynamisch über eine Blueprint-Funktion, die von Level-Übergängen aufgerufen wird.
- Überschreiben Sie die „Choose Player Start” Funktion (optional): Wenn Sie die Spawn-Position des Charakters steuern möchten, können Sie die „Choose Player Start” Funktion in Ihrem Game Mode Blueprint überschreiben. Dies ist nützlich, wenn Sie sicherstellen möchten, dass der Charakter an einem bestimmten Ort im Level spawnt.
- Setzen Sie den Game Mode für jedes Level: Im World Settings Panel (Fenster -> World Settings) für jedes Level setzen Sie den „Game Mode Override” auf Ihren benutzerdefinierten Game Mode (
MyGameMode
). - Logik für den Level-Übergang:
- Verwenden Sie wie in Methode 1 einen Trigger oder ein anderes Ereignis, um den Level-Übergang auszulösen.
- Im Level-Blueprint (oder besser noch, in einer zentralen Game Instance), speichern Sie, welcher Charakter für das nächste Level verwendet werden soll. Sie können eine einfache Enumeration für die verschiedenen Charaktere verwenden.
- Im Game Mode des neuen Levels rufen Sie diese gespeicherte Information ab.
- Setzen Sie die „DefaultCharacterClass” Variable des Game Mode auf den entsprechenden Charakter-Blueprint basierend auf den abgerufenen Informationen.
Vorteile: Bessere Organisation und Wiederverwendbarkeit. Zentralisierte Logik für den Charakterwechsel.
Nachteile: Etwas komplexer als Methode 1.
Methode 3: Verwenden von C++ (für fortgeschrittene Entwickler)
Für komplexere Projekte oder wenn Sie mehr Kontrolle über den Charakterwechsel-Prozess benötigen, ist die Verwendung von C++ eine gute Option. Dies ermöglicht Ihnen auch eine bessere Performance.
- Erstellen Sie Ihren eigenen Game Mode in C++: Erstellen Sie eine neue C++-Klasse, die von
AGameModeBase
oderAGameMode
abgeleitet ist (z.B.AMyGameMode
). - Erstellen Sie Ihre Charakterklassen in C++ (oder verwenden Sie bestehende Blueprints): Sie können Ihre Charakterklassen entweder in C++ oder als Blueprints erstellen.
- Fügen Sie eine Variable für die Standard-Pawn-Klasse hinzu: Fügen Sie in Ihrer Game Mode-Klasse eine Variable hinzu, um die Standard-Pawn-Klasse zu speichern:
„`c++
UCLASS()
class MYPROJECT_API AMyGameMode : public AGameModeBase
{
GENERATED_BODY()public:
AMyGameMode();protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = „Character”, meta = (AllowPrivateAccess = „true”))
TSubclassOfDefaultCharacterClass; public:
virtual APawn* SpawnDefaultPawnFor(AController* NewPlayer, FName StartSpotName) override;void SetDefaultCharacterClass(TSubclassOf
NewCharacterClass); UFUNCTION(BlueprintCallable, Category = „Character”)
void SetNextCharacterClass(TSubclassOfCharacterClass); private:
TSubclassOfNextCharacterToSpawn; };
„` - Implementieren Sie die Logik zum Spawnen des Charakters: Überschreiben Sie die
SpawnDefaultPawnFor
Funktion in Ihrer Game Mode-Klasse, um den Charakter zu spawnen, der in derDefaultCharacterClass
-Variable gespeichert ist.„`c++
APawn* AMyGameMode::SpawnDefaultPawnFor(AController* NewPlayer, FName StartSpotName)
{
if (NextCharacterToSpawn != nullptr)
{
FActorSpawnParameters SpawnInfo;
SpawnInfo.Instigator = GetInstigator();
SpawnInfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;APlayerStart* StartSpot = FindPlayerStart(NewPlayer, StartSpotName);
FTransform SpawnTransform = StartSpot ? StartSpot->GetActorTransform() : FTransform::Identity;APawn* NewPawn = GetWorld()->SpawnActor
(NextCharacterToSpawn, SpawnTransform, SpawnInfo);
NextCharacterToSpawn = nullptr; //Wichtig: Setze NextCharacterToSpawn zurückif (NewPawn == nullptr)
{
UE_LOG(LogTemp, Error, TEXT(„Failed to spawn pawn of type %s”), *NextCharacterToSpawn->GetName());
}return NewPawn;
}return Super::SpawnDefaultPawnFor(NewPlayer, StartSpotName);
}void AMyGameMode::SetNextCharacterClass(TSubclassOf
CharacterClass)
{
NextCharacterToSpawn = CharacterClass;
}„`
- Implementieren Sie die SetDefaultCharacterClass Funktion: Diese Funktion setzt die
DefaultCharacterClass
Variable, die verwendet wird, um den Charakter zu spawnen. - Verwenden Sie die C++-Funktionen in Blueprints: Sie können nun die C++-Funktionen in Ihren Blueprints verwenden, um den Charakter zu wechseln, wenn ein Level geladen wird.
- Setzen Sie den Game Mode für jedes Level: Wie in Methode 2 setzen Sie den „Game Mode Override” in den World Settings auf Ihren C++ Game Mode.
Vorteile: Maximale Kontrolle und Performance. Bessere Integration mit anderen C++-basierten Systemen.
Nachteile: Erfordert C++-Kenntnisse. Komplexere Implementierung.
Tipps und Tricks
- Datenübertragung: Verwenden Sie das Game Instance, um Daten zwischen den Levels zu speichern und abzurufen.
- Animationen: Stellen Sie sicher, dass Ihre Animationen korrekt auf die verschiedenen Charaktere angewendet werden.
- Input-Mapping: Überprüfen Sie, ob die Input-Mappings für die verschiedenen Charaktere korrekt konfiguriert sind.
- Debugging: Verwenden Sie die UE4-Debugging-Tools, um Probleme beim Charakterwechsel zu identifizieren und zu beheben.
Fazit
Das Wechseln von Charakteren per Level in UE4 ist ein vielseitiger Aspekt der Spielentwicklung, der mit verschiedenen Methoden erreicht werden kann. Die Wahl der Methode hängt von der Komplexität Ihres Projekts und Ihren persönlichen Vorlieben ab. Egal, ob Sie sich für eine einfache Blueprint-Lösung oder eine fortgeschrittene C++-Implementierung entscheiden, diese Anleitung sollte Ihnen einen guten Ausgangspunkt bieten. Experimentieren Sie, lernen Sie und passen Sie die Techniken an Ihre spezifischen Bedürfnisse an. Viel Erfolg bei der Entwicklung Ihres Spiels!