2017-07-03 3 views
0

Ich struggele, um mit einem cleveren Weg zu kommen, um mit Zwischensequenzen in meinem 2D-Spiel umzugehen. Ich denke, ich habe beschlossen, die Cutscenes mit der Animator zu erstellen/zu steuern und die eigentlichen GameObjects zu verschieben.Unity 2D: Simple Cutscene Animationssystem/Manager

Was ich struggeling mit ist:

Dieser Ansatz bedeutet, jeder GameObject braucht es eigene Animator ist. Wie kann ich dann die richtige Cutscene auslösen? Ich werde Spielstufen verwenden, um das Spiel und seine Fortschritte zu kontrollieren, so zum Beispiel:

if(gameStage == 34 && entering scene castle) 
{ 
    playCorrectCutscene(); 
} 

Wie und wo bleibe ich Verweise auf alle meine cutscenes? Angenommen, ich habe 22 NPCs in einer Szene, und 15 davon haben ihre eigenen Animator, da sie eine Zwischensequenz haben, wie spiele ich die Animation von NPC_11?

Ich denke, was ich suche ist eine Art "Cutscene Manager". Die beste Lösung wäre eine List jeder Zwischensequenz (Animation) mit einer ID. Dann könnte ich einfach die ID verwenden, um die richtige Animation zu spielen. Aber da jede Animation im aktuellen GameObject gespeichert ist habe ich keine Ahnung ob das möglich ist.

Hoffnung macht Sinn.

+1

Sie können jede Zwischensequenz als vordefiniertes Feld erstellen, indem Sie ihr einen Referenznamen geben und dann das vorfabrizierte Exemplar instanziieren - Sie würden viel Speicher sparen, wenn Sie viele Zwischensequenzen haben. –

+1

@RafalZiolkowski Ich denke, du solltest das als Antwort verwenden. Wenn Sie alle GameObjects als Prefab und [loading] (https://StackOverflow.com/a/44832347/3785314) als Ressourcen oder Assetbundles verwenden, sollten Sie dies tun. – Programmer

+0

@Programmer - Ich werde es tun, wenn ich wieder nach Hause komme, einschließlich Code-Beispiele - Ich bin nicht genau Einheit Entwickler bei meinem täglichen Job :) –

Antwort

1

Sie sich nach Abschluss erstellen Fertig mit 1 Animator pro Fertig, dann können Sie unten Methode verwenden Instanzen on the fly zu erstellen:

Lassen Sie sagen, Sie haben CutsceneManager Skript wie folgt:

class CutsceneManager : MonoBehaviour { 
    public GameObject InstantiateResource(string folder, string name) 
    { 
     GameObject resource = Instantiate<GameObject>(Resources.Load<GameObject>(folder + "/" + name)); 
     if (resource == null) 
     { 
      Debug.LogErrorFormat("Cannot find resource {0} in {1}", name, folder); 
      return null; 
     } 
     resource.name = name; 
     return resource; 
    }   
} 

Am einfachsten ist es, es an ein leeres Objekt anzuhängen. Dann können Sie öffentliche Variable für Manager in anderen Scripts erstellen, wo Sie brauchen würde Cutscene zu zeigen, wie folgt aus:

class SomeOtherScript : MonoBehaviour { 
    public CutsceneManager CutsceneManager; 
} 

So können Sie & Drop CutsceneManager leer in jedem Skript ziehen, wo Sie es brauchen. Auf diese Weise haben Sie eine Instanz von cutscenemanager für alle Klassen.

nun an Ort und Stelle, wo Sie brauchen würde custscene zu spielen, Sie instanziiert: Assets\Resources\Cutscenes

Cutscenes genannt würde: SomeOtherCutscene.prefab

class SomeOtherScript : MonoBehaviour { 
    public CutsceneManager CutsceneManager; 

    public void PlayMyCutscene() { 
     GameObject cutscene = CutsceneManager.InstantiateResource("Cutscenes", "SomeOtherCutscene"); 
     cutscene.setActive(true); // Or whetever other method to fire it off 
    } 
} 

Auf Ordnerstruktur Sie haben müssten Beachten Sie, dass Sie bei der Instanziierung keine .prefab-Datei hinzufügen müssen - das Unity-Framework "weiß" und fügt es für Sie hinzu.

+0

Wo spiele ich die eigentliche Animation? Sag NPC1 herumlaufen in meiner Welt. Aber er hat auch 2 Zwischensequenzen. Würde ich einen neuen NPC1 instanziieren, nur um die Zwischensequenz abzuspielen und sie dann zu entfernen? (PS: Sollten alle Prefabs im Resources-Ordner gespeichert werden? Ich habe sie nur in einem Prefab-Ordner atm, und wenn ich einen in einem Script brauche, füge ich ihn im Editor an.). –

+0

Es hängt davon ab, wie Ihre Zwischenszenenanimation gemacht wird. Kann es vorhandene NPC1 als Parameter erhalten, um es wieder zu verwenden? –

+0

Momentan befestige ich nur einen Animator an NPC1 und erstelle eine Animation für jede Zwischensequenz. Wäre es dann NPC1 I Instantiate und triggert die richtige anim aus? –