FINALE PRÄSENTATION
Florian Eder • Andreas Fuchs • Philip Schimmelpfennig • Dominik Schnell
Inhalt
1.
Level / Aufbau
Allgemeines: Visuelle Darstellung
Allgemeines: Interaktionsmöglichkeiten
Der Aufzug
Der Aufzug
Der Aufzug
Startraum
Startraum
Level 1: Würfelstapeln
Level 1: Würfelstapeln
Level 1: Würfelstapeln
Level 2: Dosenwerfen
Level 2: Dosenwerfen
Level 3: Der heiße Draht
Level 3: Der heiße Draht
Level 4: Torwart-Maschine
Teleporter-Flur
Level 5.1: Minigolf
Level 5.1: Minigolf
Level 5.2: Weltraum
Level 5.3: Minigolf
Ziel
Spielewelt
2.
Technik
Hände, Prozedurale Generierung und Animatoren
Hände
Farbkombinationen Würfelstapeln
Position / Ausrichtung der Kegel
Position der Kegel
Torwart-Maschine
Animatoren
3.
Visuals & Optimierung
Realistische Beleuchtung
Realistische Beleuchtung
Realistische Beleuchtung
Individuelle 3D-Modelle
4.
Wichtige Skripte
Interaktionen mit dem Controller
GameManager
GameManager (Skripts/GameManager/GameManager.cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
private int UpdateGameState(ElevatorTarget elevatorTarget,
int valueToIncrement) {
if (!roomGameStates.ContainsKey(elevatorTarget))
roomGameStates.Add(elevatorTarget, valueToIncrement);
int newValue;
int currentCount;
roomGameStates.TryGetValue(elevatorTarget, out currentCount);
if (currentCount + valueToIncrement <= 0) {
roomGameStates[elevatorTarget] = 0;
newValue = 0;
} else {
roomGameStates[elevatorTarget] = currentCount + valueToIncrement;
newValue = currentCount + valueToIncrement;
}
return newValue;
}
AudioManager
AudioManager (Skripts/Audio/AudioManager.cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
IEnumerator fadeAudio(string clipToPlay)
{
if (MusicSource.isPlaying)
{
while (MusicSource.volume > 0)
{
MusicSource.volume -= fadeSpeed * Time.deltaTime;
yield return null;
}
MusicSource.Stop();
}
MusicSource.volume = initalVolume;
foreach (AudioClip clip in musicFiles)
{
if (clip.name == clipToPlay)
{
MusicSource.clip = clip;
MusicSource.Play();
}
}
}
BucketChallengeManager
BucketChallengeManager (Skripts/BucketChallenge/BucketChallengeManager.cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
public void Reset()
{
for (int i = 0; i < buckets.Count; i++)
{
buckets[i].transform.position = vecsBuckets[i];
buckets[i].transform.rotation = rotsBuckets[i];
buckets[i].GetComponent<Rigidbody>().velocity = Vector3.zero;
}
for (int i = 0; i < balls.Count; i++)
{
// just reset ball if its fallen down
if(balls[i].transform.position.y < vecsBalls[i].y - 0.2F)
{
balls[i].transform.position = vecsBalls[i];
balls[i].transform.rotation = rotsBalls[i];
balls[i].GetComponent<Rigidbody>().velocity = Vector3.zero;
}
}
}
CubeStackManager
CubeStackManager (Skripts/CubeStack/CubeStackManager.cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
public void Solved()
{
audioManager.playEffect("elevatorUnlock");
gameManager.ChangeGameStateForRoom(ElevatorTarget.CubeStack, 1);
}
public void Wrong()
{
audioManager.playEffect("goalkeeperError", 0.5f);
}
public void GenerateStack()
{
cubeStackHandler.GenerateStack();
}
internal void SpawnNewCubes()
{
cubeStackHandler.spawnCubesInBox();
}
CubeStackHandler
CubeStackHandler (Skripts/CubeStack/CubeStackHandler.cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
public void ResetCubeStack()
{
cubesToCreate.Clear();
foreach (GameObject go in usedColliderGameObjectsByParent.Keys)
{
go.SetActive(false);
Destroy(usedColliderGameObjectsByParent[go]);
}
usedColliderGameObjectsByParent.Clear();
foreach (GameObject sl in successLights) {
sl.SetActive(false);
Destroy(sl);
}
successLights.Clear();
foreach (GameObject go in examplesOnWall) {
go.SetActive(false);
Destroy(go);
}
examplesOnWall.Clear();
cubeSpawner.ResetElements();
}
ElevatorHandler
ElevatorHandler (Skripts/Elevator/ElevatorHandler .cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
public void UpElevator()
{
if (actRoom == roomTargetPositions.Count) return;
if (!GameManager.DebugMode)
anim.SetBool("up_button_active", false);
elevatorState = ElevatorState.upMoving;
if (actRoom < roomTargetPositions.Count - 1)
actRoom++;
targetPostion = roomTargetPositions[actRoom];
engineSound.Play();
playerHandsVisible(false);
StartCoroutine(MoveElevatorToPosition(
movingPart.transform,
targetPostion, speed));
StartCoroutine(
MovePlayerToPosition(
player.transform,
targetPostion, speed));
}
GoalkeeperManager
GoalkeeperManager (Skripts/Goalkeeper/GoalkeeperManager .cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
private void StartRoom()
{
Debug.Log("StartRoom");
rotate = true;
ScoreRight.SetText("{0}/{1}", rightCount, winAmount);
ScoreWrong.SetText("{0}/{1}", wrongCount, looseAmount);
colorChangingCoroutine = StartCoroutine(ColorChangingCoroutine());
targetMovingCoroutine = StartCoroutine(TargetMovingCoroutine());
shootingCoroutine = StartCoroutine(ShootingCoroutine());
}
HotwireManager
HotwireManager (Skripts/Hotwire/HotwireManager .cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
public HotwireGenerator hotwireGenerator;
public void ResetAll()
{
hotwireGenerator.ResetAll();
}
HotwireGenerator
HotwireGenerator (Skripts/Hotwire/HotwireGenerator .cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
internal void ResetAll()
{
interactable.transform.position = interactableInitialPosition;
interactable.transform.rotation = interactableInitialRotation;
interactable.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
interactable.GetComponent<Rigidbody>().velocity = Vector3.zero;
CreateHotwire();
}
MinigolfHoleCollider
MinigolfHoleCollider (Skripts/Minigolf/MinigolfHoleCollider .cs) |
Verantwortungsgebiet
|
Zusammenarbeit mit
|
private void OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Minigolfball"))
return;
GameManager.GetInstance().ChangeGameStateForRoom(
ElevatorTarget.MiniGolf, 1);
}
private void OnTriggerExit(Collider other)
{
if (!other.CompareTag("Minigolfball"))
return;
GameManager.GetInstance().ChangeGameStateForRoom(
ElevatorTarget.MiniGolf, -1);
}
5.
Projektverlauf
Projektablauf
Aufgabenverteilung (geplant)
Wochen | Dominik | Florian | Philip | Andreas |
11.06.2020 | Discover Unity | Unity einrichten | Programmierung + Scripting lernen | Tests / Entscheidung Render Pipeline |
18.06.2020 | Transfer first samples to Oculus Quest. | Transfer first samples to Oculus Quest. | Shader-Programmierung ansehen | Avatar Einbinden |
25.06.2020 | M1: Techdemo - Erste Tech-Demo, Aufsetzen des Entwicklungs-Stacks | |||
02.07.2020 | Rudimentäres Raumkonzept für 2 Räume | Rudimentäres Raumkonzept für 2 Räume | Rudimentäres Raumkonzept für für 2 Räume | Rudimentäres Raumkonzept für 2 Räume |
09.07.2020 | Implementierung Greifen (Demo-Raum) | Implementierung Werfen (Demo-Raum) | Implementierung Kamera Kollision (Demo-Raum) | Implementierung Fortbewegung (Demo-Raum) |
16.07.2020 | Rudimentäres Design für 2 Räume | Rudimentäres Design für 2 Räume | Rudimentäres Design für 2 Räume | Design für 2 Räume |
23.07.2020 | Klausurphase | |||
Aufgabenverteilung (geplant)
30.07.2020 | M2: Alpha - Implementierung aller Basisfunktionen | |||
Wochen | Dominik | Florian | Philip | Andreas |
06.08.2020 | Design Raum für 2 Räume verbessern | Design Raum für 2 Räume verbessern | Urlaub 06.08. bis 13.08. | Urlaub 08.08. bis 15.08. |
13.08.2020 | Funktionen in 2 Räume verbessern | Funktionen in 2 Räume verbessern | Design Raum für 2 Räume verbessern | Funktionen für 2 Räume verbessern |
20.08.2020 | Verbindung zwischen Räumen herstellen Verbindungsanimation, Background-Loading, Objekt-Instanzierung | Storytelling / User Interface Tutorial System (Schrift evtl. Gesprochen), Menüs (Start, Pause, Fortschritt) | ||
27.08.2020 | M3: Beta - Spielbare Demo mit Look-And-Feel der finalen Version | |||
03.09.2020 | Feinschliff Refactor, Code-Cleanup, Debugging | Feinschliff Sound-Design, Visuelle Präsentation, Postprocessing | ||
10.09.2020 | Klausurphase | Feinschliff allgemein | Klausurphase | |
17.09.2020 | Vorbereitung Präsentation: Power-Point Dokumentation / Videopräsentation (Spieletrailer) | |||
24.09.2020 | M4: Finale Abgabe - Präsentation / Videoabgabe der finalen Version | |||
30.09.2020 | Deadline | |||
Ablauf (tatsächlich)
Wochen | Dominik | Florian | Philip | Andreas |
11.06.2020 | Konzepte für Raumideen entwickeln (8h) | Unity einrichten (5h) | Unity und Oculus Software installieren (4h) | Oculus Quest, Unity Setup Tests: Versionen, Plugins, Einstellungen (15 h) |
18.06.2020 | Unity einrichten (5h) | Oculus Link Einrichtung (3h) | Unity einrichten & Plugins installieren (2h) | Oculus Quest, Render-Pipeline-Tests (15h) |
25.06.2020 | M1: Techdemo - Erste Tech-Demo, Aufsetzen des Entwicklungs-Stacks | |||
02.07.2020 | Greifen und Werfen mit der Oculus Quest (im Hinblick auf Becherwurf-Raum) (12h) | Rudimentäres Raumkonzept für Hotwire Raum (15h) | Konzept für 2 Räume entwerfen (Planken-/Torwartspiel) (4h) | Konzept für Gesamtlook der Spielwelt, Testraum zum experimentieren (15h) |
09.07.2020 | Raumkonzept für Becherwurf-Raum (18h) | Funktionen Hotwire Raum (15h) | Import der Sample-Rooms, Umgang mit Unity lernen (12h) | Entwurf CubeStack (5h) |
16.07.2020 | Raumkonzept für Minigolf-Raum (18h) | Experimente mit XR-Rig Physik für Planken-Spiel (16h) | Rendering: Light Probes, Reflection Probes, Lightmaps (25h) | |
23.07.2020 | Klausurphase | |||
Ablauf (tatsächlich)
30.07.2020 | M2: Alpha - Implementierung aller Basisfunktionen | |||
Wochen | Dominik | Florian | Philip | Andreas |
06.08.2020 | Funktionen für Minigolf-Raum und Becher-Werfen (Win-Conditions, Reset Manager, Gravities, Teleport-System) (40h) | Funktionen für Hotwire, CubeStack, Minigolf (60h) | Urlaub 06.08. bis 13.08. | Urlaub 08.08. bis 15.08. |
13.08.2020 | Unity Scripting mit Planken- u. Torwartspiel-Demo lernen (24h) | Logik: Fahrstuhl, Modellierung (Räume, Minigolfbahnen) (immersives Design) (40h) | ||
20.08.2020 | Urlaub 29.08. bis 03.09. | Torwart-Spiel mit neuen Assets implementieren (36h) | Logik: Hotwire, CubeStack, Minigolf, Türen, Musik (30h) | |
27.08.2020 | M3: Beta - Spielbare Demo mit Look-And-Feel der finalen Version | |||
03.09.2020 | Drehbucherstellung für das Tutorial-System / Einleitung des Spielers in die Level (14h) | Funktionen CubeStack, Sounds, Manager Klassen (20h) | Neue Hände einfügen, Hand-Skripte programmieren, Interaktions-Experimente (40h) | Logik: AudioManager, Sound, Interaktionsdesign (Schalter, Feedbacksystem) (45h) |
10.09.2020 | Klausurphase | |||
17.09.2020 | Aufnahme für Tutorial-System (10h) / Bugfixing (8h) | Bugfixing (40h) | Ton-Aufnahmen für Tutorialsystem u. Bugfixing (12h) | Visuals, Lighting, GI, Logic: Animatoren, Animationen, Buxfixing (40h) |
24.09.2020 | Audio-Management / -Aufnahme für Tutorial-System (8h) / Präsentation (12h) | Präsentation (8h) | Bugfixing u. Präsentation vorbereiten (8h) | Präsentation, Video, Dokumentation (15h) |
Summe | 153h | 166h | 158h | 245h |
Commit-Historie
Contributions to dev, excluding merge commits
Zeitlicher Verlauf des Git-Repository
Fazit
6.
Prototypen
Prototyp Minigolf
Prototyp Becher Werfen
Prototyp Becher Werfen 2
Florian Eder
Andreas Fuchs
Dominik Schnell
Philip Schimmelpfennig