Willkommen zu diesem umfassenden Tutorial, in dem wir Ihnen zeigen, wie Sie einen Splitscreen-Multiplayer in Unity erstellen, der es Spielern ermöglicht, ihre Charaktere vor dem Spiel zu wählen. Dies ist eine fantastische Möglichkeit, das Spielerlebnis zu verbessern und Ihren Spielen mehr Wiederspielwert zu verleihen. Wir werden Schritt für Schritt vorgehen, sodass Sie auch als Anfänger keine Probleme haben sollten.
Warum Splitscreen Multiplayer?
Splitscreen-Multiplayer bietet eine großartige Möglichkeit, mit Freunden und Familie auf einem einzigen Bildschirm zu spielen. Es ist ein Klassiker der Spielegeschichte und bringt ein nostalgisches Gefühl und direkten Wettbewerb mit sich. Außerdem ist es eine kostengünstige Möglichkeit, Multiplayer zu ermöglichen, da keine zusätzlichen Geräte erforderlich sind.
Voraussetzungen
Bevor wir beginnen, stellen Sie sicher, dass Sie Folgendes haben:
- Unity (Version 2020 oder höher wird empfohlen)
- Grundlegendes Verständnis der Unity-Oberfläche und C#-Skripte
- Einige 3D-Modelle für Ihre Charaktere (oder Unity Assets)
Schritt 1: Projekt einrichten
Erstellen Sie zunächst ein neues Unity-Projekt. Wählen Sie die 3D-Vorlage. Geben Sie Ihrem Projekt einen Namen, z.B. „SplitscreenMultiplayer” und klicken Sie auf „Erstellen”.
Schritt 2: Charaktermodelle importieren und konfigurieren
Importieren Sie Ihre Charaktermodelle in das Projekt. Stellen Sie sicher, dass die Modelle richtig skaliert und ausgerichtet sind. Erstellen Sie für jeden Charakter einen Prefab. Ein Prefab ist im Grunde ein Vorlage-Objekt, das Sie später wiederverwenden können.
Jeder Charakter benötigt einen CharacterController. Fügen Sie diesen zu jedem Charakter-Prefab hinzu. Der CharacterController vereinfacht die Bewegung und Kollisionserkennung.
Erstellen Sie ein neues C#-Skript namens „PlayerMovement” und fügen Sie es jedem Charakter-Prefab hinzu. Hier ist ein einfaches Beispiel für ein PlayerMovement-Skript:
„`csharp
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float rotationSpeed = 500f;
private CharacterController characterController;
void Start()
{
characterController = GetComponent();
}
void Update()
{
float horizontal = Input.GetAxis(„Horizontal”);
float vertical = Input.GetAxis(„Vertical”);
Vector3 moveDirection = new Vector3(horizontal, 0, vertical).normalized;
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= moveSpeed;
characterController.Move(moveDirection * Time.deltaTime);
//Rotation
if(horizontal != 0 || vertical != 0){
Quaternion targetRotation = Quaternion.LookRotation(moveDirection);
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
}
}
}
„`
Dieses Skript ermöglicht die Bewegung mit den Pfeiltasten oder WASD und verwendet den CharacterController, um Kollisionen zu behandeln. Beachten Sie, dass die Eingaben (Horizontal, Vertical) global sind. Wir werden das später für jeden Spieler anpassen.
Schritt 3: Splitscreen-Kameras erstellen
Erstellen Sie zwei Kameras im Hierarchy-Fenster. Nennen Sie sie „Player1Camera” und „Player2Camera”. Passen Sie die „Viewport Rect” jeder Kamera an, um den Splitscreen-Effekt zu erzeugen.
- Player1Camera: X = 0, Y = 0, Width = 0.5, Height = 1
- Player2Camera: X = 0.5, Y = 0, Width = 0.5, Height = 1
Diese Einstellungen teilen den Bildschirm vertikal in zwei Hälften.
Schritt 4: Spielerzuordnung und Eingabeanpassung
Jetzt müssen wir sicherstellen, dass jeder Spieler seinen eigenen Charakter steuert. Dazu erstellen wir ein Skript namens „PlayerManager”.
„`csharp
using UnityEngine;
public class PlayerManager : MonoBehaviour
{
public GameObject player1Prefab;
public GameObject player2Prefab;
public Transform player1SpawnPoint;
public Transform player2SpawnPoint;
public Camera player1Camera;
public Camera player2Camera;
void Start()
{
SpawnPlayers();
}
void SpawnPlayers()
{
//Spieler 1
GameObject player1 = Instantiate(player1Prefab, player1SpawnPoint.position, player1SpawnPoint.rotation);
player1Camera.transform.SetParent(player1.transform);
player1Camera.transform.localPosition = new Vector3(0,2,-5);
player1Camera.transform.localRotation = Quaternion.identity;
PlayerMovement player1Movement = player1.GetComponent();
if (player1Movement != null)
{
// Spieler 1 spezifische Eingaben. Wir werden die Standardeingaben im InputManager ändern.
// Hier muss man die Eingabe anpassen, je nachdem welche Methode man wählt
}
//Spieler 2
GameObject player2 = Instantiate(player2Prefab, player2SpawnPoint.position, player2SpawnPoint.rotation);
player2Camera.transform.SetParent(player2.transform);
player2Camera.transform.localPosition = new Vector3(0,2,-5);
player2Camera.transform.localRotation = Quaternion.identity;
PlayerMovement player2Movement = player2.GetComponent();
if (player2Movement != null)
{
// Spieler 2 spezifische Eingaben. Wir werden die Standardeingaben im InputManager ändern.
// Hier muss man die Eingabe anpassen, je nachdem welche Methode man wählt
}
}
}
„`
Erstellen Sie ein leeres GameObject namens „GameManager” und fügen Sie das PlayerManager-Skript hinzu. Erstellen Sie zwei leere GameObjects namens „Player1SpawnPoint” und „Player2SpawnPoint” und positionieren Sie sie dort, wo die Spieler spawnen sollen. Weisen Sie die Prefabs, Kameras und Spawn-Points im PlayerManager-Inspektor zu.
Der kritische Punkt hier ist die Anpassung der Eingaben. Es gibt verschiedene Ansätze:
- Input Manager: Der klassische Ansatz ist, im Unity Input Manager (Edit > Project Settings > Input Manager) neue Eingabeachsen zu definieren, z.B. „Horizontal_P1”, „Vertical_P1”, „Horizontal_P2”, „Vertical_P2”. Passen Sie die Namen der Eingabeachsen im PlayerMovement-Skript entsprechend an.
- Input System Package: Unitys neues Input System Package bietet flexiblere Optionen für Eingabezuordnungen. Die Implementierung ist komplexer, aber sie ist leistungsstärker und unterstützt Geräte besser.
Für die Einfachheit nehmen wir an, dass Sie den Input Manager verwenden. Sie müssten die `GetAxis` Aufrufe im `PlayerMovement`-Skript anpassen:
„`csharp
//Innerhalb der Update-Methode im PlayerMovement Skript
float horizontal = Input.GetAxis(„Horizontal_P1”); //Für Spieler 1
float vertical = Input.GetAxis(„Vertical_P1”); //Für Spieler 1
// Für Spieler 2 (separate PlayerMovement Instanz, daher kein Problem)
float horizontal = Input.GetAxis(„Horizontal_P2”);
float vertical = Input.GetAxis(„Vertical_P2”);
„`
Wichtiger Hinweis: Vergessen Sie nicht, die neuen Eingabeachsen im Input Manager zu definieren. Duplizieren Sie die „Horizontal” und „Vertical” Achsen und passen Sie die Namen und Tastenbelegungen an (z.B. WASD für Spieler 1, Pfeiltasten für Spieler 2).
Schritt 5: Charakterauswahl
Um eine Charakterauswahl zu implementieren, erstellen Sie eine neue Szene namens „CharacterSelect”. Erstellen Sie eine einfache UI (z.B. mit Buttons), die es den Spielern ermöglicht, ihren Charakter auszuwählen. Speichern Sie die Auswahl jedes Spielers (z.B. als Integer, der den Index des ausgewählten Charakters im Array der Charakter-Prefabs repräsentiert) in einem statischen Skript oder mit PlayerPrefs.
Hier ist ein Beispiel für ein CharacterSelection-Skript:
„`csharp
using UnityEngine;
using UnityEngine.SceneManagement;
public class CharacterSelection : MonoBehaviour
{
public GameObject[] characters; // Array der Charakter-Prefabs
private int selectedCharacterP1 = 0;
private int selectedCharacterP2 = 1; //Default Auswahl
public void SelectCharacterP1(int index)
{
selectedCharacterP1 = index;
}
public void SelectCharacterP2(int index)
{
selectedCharacterP2 = index;
}
public void StartGame()
{
//Speichere die Auswahl
PlayerPrefs.SetInt(„SelectedCharacterP1”, selectedCharacterP1);
PlayerPrefs.SetInt(„SelectedCharacterP2”, selectedCharacterP2);
PlayerPrefs.Save(); // Wichtig!
SceneManager.LoadScene(„GameScene”); // Ersetze „GameScene” mit dem Namen deiner Spielszene
}
}
„`
Passen Sie das PlayerManager-Skript an, um die ausgewählten Charaktere aus PlayerPrefs zu laden:
„`csharp
//Im PlayerManager Skript, innerhalb der Start() oder Awake() Methode:
int selectedCharacterIndexP1 = PlayerPrefs.GetInt(„SelectedCharacterP1”, 0); // 0 ist der Standardwert, falls nichts gespeichert ist
int selectedCharacterIndexP2 = PlayerPrefs.GetInt(„SelectedCharacterP2”, 1); // 1 ist der Standardwert
player1Prefab = characters[selectedCharacterIndexP1];
player2Prefab = characters[selectedCharacterIndexP2];
„`
Denken Sie daran, die Charakterauswahl aus der Liste auch im PlayerManager zuzuweisen. Sie können das Array `characters` im Inspector zuweisen, sodass das Skript weiß, welche Charaktere zur Auswahl stehen.
Schritt 6: Testen und Debuggen
Testen Sie Ihr Spiel gründlich! Achten Sie auf Probleme mit der Kamera, der Bewegung und den Eingaben. Verwenden Sie den Unity-Debugger, um Fehler zu finden und zu beheben.
Zusammenfassung
In diesem Tutorial haben Sie gelernt, wie Sie einen Splitscreen-Multiplayer in Unity mit Charakterauswahl erstellen. Dies ist ein grundlegendes Setup, das Sie erweitern können, indem Sie weitere Funktionen wie Waffen, Power-Ups, Spielmodi und eine anspruchsvollere Charakteranpassung hinzufügen. Viel Spaß beim Entwickeln!