Jump to content
Unity Insider Forum

Handlungsscript


Lessly

Recommended Posts

Hallo zusammen,

 

erstmal vielen Dank für die Aufnahme im Forum.

 

Ich habe ein Problem, an dem ich schon seit Wochen rumprobiere, aber auf keinen Grünen Zweig komme.

 

Ich möchte eine Handlung in einem Spiel via Skript (C#) steuern. Dabei sollen drei Personen miteinander interagieren. Trigger steht dafür, dass die Person im Spiel, also die Frau vom User angeklickt wird, dann soll die Audio und Animation abgespielt werden und parallel der Text auch Grafisch dargestellt werden. Daraufhin wird der Text vom Charakter angezeigt und die Audiodatei abgespielt. Für die Animation wird einen default angelegt. Danach soll der Charakter mit einem Mann kommunizieren, der wieder angeklickt werden muss.

 

Dazu habe ich eine Textdatei erstellt die folgendes beinhaltet:

 

Frau

trigger

audiodatei

animationsdatei

Text

 

Character (3rd Person Controller)

automatic

audiodatei

animatinsdatei

text

 

Frau

automatic

audiodatei

animationsdatei

Text

 

Character (3rd Person Controller)

automatic

audiodatei

animatinsdatei

text

 

Mann

trigger

audiodatei

animationsdatei

text

 

Hat jemand einen Vorschlag wie man dieses Problem am besten lösen kann?

 

Würde mich sehr freuen, wenn ihr mir weiterhelfen könntet.

 

Liebe Grüße

Lessly

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Ansatz ist (für mich) irgendwie verwirrend... Warum eine Textdatei?

 

Ohne genau zu wissen, wo du hinwillst, würde ich für dein aktuelles Problem so vorgehen :

 

Die Personen müssen mit der Maus auswählbar sein -> Collider müssen sein.

Du möchtest eine Art Cutscene abspielen -> Wir brauchen Animationen und Coroutines (Geht auch anders, sind aber toll :) )

 

Kleiner Aufbau:

 

Art (Models, Texturen, Audio, Sprechblasen etc. ) sollten von dir schon so angeordnet sein, wie du dir das vorstellst.

Alle Personen bzw. Dinge, mit denen per Maus interagiert werden soll, sollten einen passenden Collider haben.

 

Dann brauchst du noch diese (hier sehr vereinfachten ) Scripte:

 

1. Auf den Objekten, mit denen interagiert werden kann:

// Klasse CanBeClickedToInteract
void OnMouseUpAsButton()
{
InteractionControl.GetInstance().SomebodyWasClicked(gameObject.name);
}

 

Dann noch (eine von unzähligen Möglichkeiten) ein zentraler Interaktionsmanager, der z.B. auf der Camera sitzt.

 

// Klasse InteractionControl
//Singleton
----------------------------------
static InteractionControl instance;
public static InteractionControl GetInstance() {return instance;}
void Awake() { instance = this;}
------------------------------------
GameObject Person1;
GameObject Person2;
GameObject Person3;
bool InCutscene
// Ich mag keine Strings, machen wir hier aber der Einfachheit halber, spätestens wenns mehr als 3 sind wird das sehr unübersichtlich und fehleranfällig.
void Start()
{
Person1 = GameObject.Find("Hans");
Person2 = GameObject.Find("Ute");
usw.
// GameObject.Find ist subobtimal, kann man aber 1mal in Start gut machen.
}

public void SomebodyWasClicked(string personName)
{
// Schauen ob wir schon in der CutScene sind
if (!InCutscene)
{
StartCoroutine("PlayCutscene" + personName());
}
}
IEnumerator PlayCutscenePerson1()
{
InCutScene = true;
// Beispiel CutScene
// wenn du Animationen abspielen willst, brauchst du natürlich auch einen Animator auf den Personen.
Hans.GetComponent<Animator>().SetTrigger("Talk") // Beispiel
// Audio starten...etc.
yield return new WaitForSeconds(Cutscene Länge)
InCutscene = false;
}
// für die anderen Personen natürlich auch...

 

1. Die Formatierung ist grauenvoll, ich sehe aber keine Möglichkeit, dass jetzt und hier zu lösen^^

2. Der Ansatz ist subobtimal, aber ein Anfang, damit du ungefähr weisst, wie man so was machen könnte.

3. Wirst du (auch wenn du wirklich so was machen wolltest) Fragen haben, ich denke ich bin auch später noch mal da :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vielen herzlichen Dank für deine Hilfe. Ich hab da gleich mal rumprobiert.

 

ich hab an eine Textdatei gedacht, da die Handlung sehr lang ist und damit die Texte, Audio, Animationen in der richtigen Reihenfolge abgespielt werden.

Wie geb ich dem Avatar des Spielers als dem 3rd Person Controller den die Texte und Animationen mit? auch so wie in deinem Beispiel?

Schreib ich dann in einer Cutscene im Prinzip den Handlungsstrang bis vom Benutzer eine neue Interaktion gefordert ist?

 

Eine Interaction Klasse habe ich jetzt so geschrieben. Collider haben alle Figuren und Gegenstände.

Die Idee war jetzt mit der Interaction ein Paket zu schnürren, das den text, audio und animation je Schritt enthält.

 

using UnityEngine;
using System.Collections;
public class Interaction {
public string text;
public string animation;
public AudioClip audio;
public Interaction(string animation, AudioClip audio, string text)
{
 this.text = text;
 this.animation = animation;
 this.audio = audio;
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich jetzt richtig liege, dann also als Cutscene-Klasse? Das als Interaction-Klasse zu machen, würde imho am Ziel vorbeigehen, da die Player-Interaktion (z.B. Klick) eine einfache Sache ist, die keine eigenen Klasse haben muss, die Cutscenes aber schon eher.

 

Das ist ne gute Möglichkeit, das einzige Problem was ich da sehe, sind die Referenzen zu den handelnden Personen... Vielleicht solltest du in einem Cutscene-Manager (am einfachsten Singleton) eine statische Liste mit Referenzen zu allen Charakteren haben und zuweisen.

 

Dann baust du dein Cutscene Object, mit verschiedenen Konstruktoren (je nach dem wieviele Personen beteiligt sind). Jede Cutscene hat dann einen internen Wert für Dauer, eine Liste mit den Referenzen zu den beteiligten Charakteren (diese haben Ihre eigenen Animationen, die nicht innerhalb der Cutscene gespeichert werden sollten).

 

Die ausführende Coroutine sitzt dann im Manager-Script und bekommt die Daten der Cutscenes aus den einzelenen Cutscene Klassen.

 

Ein hilfreicher Link hierzu : http://answers.unity3d.com/questions/161084/coroutine-without-monobehaviour.html

 

Auf der anderen Seite ist dein erstes Gefühl nicht falsch gewesen, die Cutscenes mit einer Art Timeline zu organisieren wie in einem Film also z.B. eine Textdatei

<<

00:51 Marvin, Augusta, Cutscene Streit

01:56 Augusta erschlägt Marvin mit einer Küchenrolle

>>

 

Das würde allerdings erfordern aus deinem Storyboard heraus Befehle in Unity einzuspeisen, die dort eingelesen und interpretiert werden können. Da bin ich selber dran, aber noch nicht so weit. Das geht dann in Richtung Data Handling (JSON, Scriptable Object etc sind die Möglichkeiten)

 

Ist jetzt ne kleine Zwickmühle: fängst du hardcoded (also leichter) an, wird das schnell unübersichtlich, ist aber erstmal realitischer fertigzustellen. Fängst du direkt mit Data-Management an, musst du dich die nächsten Monate hinsetzen und üben (dauert, zumindest bei mir), hast dann aber was sehr wertvolles gelernt (braucht man praktisch immer, selbst wenn es ein Platformer ist, und der Spieler hat 3 verschiedene Waffen. Wenn man die über eine vernüftige Data-Lösung eingebaut hat, kann man alles sehr komfortabel erweitern bzw. ändern). Ist auf der anderen Seite aber auch oft overkill :)

 

Alles nicht so einfach, vielleicht hat noch jemand einen Tipp für dich, es gibt bestimmt noch Lösungen an die ich nicht denke. Ansonsten musst du eine von den 2 Möglichkeiten nehmen, oder Plan B

 

Plan B: ein anderes Spiel. Klingt erstmal krass einfach aufzuhören, aber nach meiner Erfahrung ist es besser erstmal was weniger aufwendiges zu machen. Diese Zeile in 34512 Variationen wirst du auf allen GameDev-Seiten lesen :) Du musst nicht unbedingt Pong machen (gähn) aber irgendwas nicht so komplexes hat den Vorteil, dass es fertig wird, und dann kann man von da aus weitermachen.

 

Will dich nicht entmutigen, letztendlich musst du das selber wissen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

 

danke für deine Ausführliche Erklärung.

 

Ich hab das ganze jetzt Hardcodiert und ein Skript für die Zuordnung der Personen geschrieben und es läuft :) und jeder spricht an der Stelle die er soll. Deine Hilfe hat mich echt zum diesem Ergebnis gebracht. Vielen vielen Dank.

 

Jetzt hab ich grad nur noch das Problem das die Kamera des 3rd Person Controller durch die Wand geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist dass während der Cutscenes?

 

Dann versuch mal folgendes: Verteile in deiner Scene GameObjects (empty) wo sich die Camera befinden soll (also eine Art Sammlung von CameraPfaden (Positionen, Rotationen), die dann über das Script in eine Liste von Vector3s überführt werden. Während der Cutscenes wird die Camera dann an diese Punkten fixiert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...