[TUTORIAL] Sistema simples de Cutscenes
Página 1 de 1
[TUTORIAL] Sistema simples de Cutscenes
Olá a todos td bem?
Estava trabalhando para um projeto aqui, e necessitava de um sistema para cutscenes com uma única animação em conjunto
então criei esse sistema para auxiliar na hora de chamar as cutscenes (Sem necessidade do Cinemachine)
*O script está em inglês por causa do pessoal que está trabalhando no projeto junto comigo
Basicamente o sistema reposiciona todos os objetos solicitados pelo script em uma determinada localização, e ele chama a animação do nome da Cutscene nos objetos que estiverem um Animator vinculado a eles
Para chamar a cutscene, basta fazer algum script chamar a void "StartCutscene()"
é um sistema Utilitário/Complementar, pode ser utilizado com um outro sistema que disponibilizei aqui
Estava trabalhando para um projeto aqui, e necessitava de um sistema para cutscenes com uma única animação em conjunto
então criei esse sistema para auxiliar na hora de chamar as cutscenes (Sem necessidade do Cinemachine)
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Cutscene : MonoBehaviour
{
public Animator MainAnimator;
[System.Serializable]
public class _Cutscenes
{
public string CutsceneName;
public float EndTime;
public float LerpToPosition;
[System.Serializable]
public class _AnotherObjects
{
public Transform Object;
public bool ReParent = true;
public bool RePosition = true;
public bool ReRotation = true;
[Space]
public Transform StartPosition;
public Transform EndPosition;
}
[SerializeField]
public _AnotherObjects[] AnotherObjects;
}
[SerializeField]
public _Cutscenes[] Cutscenes;
float TimePassed;
void Awake()
{
if (!MainAnimator)
{
MainAnimator = GetComponent<Animator>();
}
}
public void StartCutscene(string CutsceneName)
{
for (int c = 0; c < Cutscenes.Length; c++)
{
for (int o = 0; o < Cutscenes[c].AnotherObjects.Length; o++)
{
if (Cutscenes[c].CutsceneName == CutsceneName)
{
//Start Animations on animator
MainAnimator.SetBool(Cutscenes[c].CutsceneName, true);
if (Cutscenes[c].AnotherObjects[o].Object.GetComponent<Animator>()) // Verify objects with Animator
{
Cutscenes[c].AnotherObjects[o].Object.GetComponent<Animator>().SetBool(Cutscenes[c].CutsceneName, true);
}
//Set Location and Rotation of all objects called
if (Cutscenes[c].AnotherObjects[o].RePosition)
{
Cutscenes[c].AnotherObjects[o].Object.transform.position =
Vector3.Lerp(Cutscenes[c].AnotherObjects[o].Object.transform.position,
Cutscenes[c].AnotherObjects[o].StartPosition.position, Cutscenes[c].LerpToPosition * Time.deltaTime);
}
if (Cutscenes[c].AnotherObjects[o].ReRotation)
{
Cutscenes[c].AnotherObjects[o].Object.transform.rotation =
Quaternion.Lerp(Cutscenes[c].AnotherObjects[o].Object.transform.rotation,
Cutscenes[c].AnotherObjects[o].StartPosition.rotation, Cutscenes[c].LerpToPosition * Time.deltaTime);
}
if (Cutscenes[c].AnotherObjects[o].ReParent)
{
Cutscenes[c].AnotherObjects[o].Object.transform.parent = Cutscenes[c].AnotherObjects[o].StartPosition;
}
}
//Set the time pass to end Cutscene
TimePassed += Time.deltaTime;
if (TimePassed >= Cutscenes[c].EndTime)
{
SkipCutscenes(CutsceneName, false);
}
}
}
}
public void SkipCutscenes(string CutsceneName, bool SkipAnimations)
{
for (int c = 0; c < Cutscenes.Length; c++)
{
for (int o = 0; o < Cutscenes[c].AnotherObjects.Length; o++)
{
if (Cutscenes[c].CutsceneName == CutsceneName)
{
//Verify and Skip all animations
if (SkipAnimations) // This pass are here case the player Wanna Skip the Cutscene
{
MainAnimator.speed = 100;
}
MainAnimator.SetBool(Cutscenes[c].CutsceneName, false);
if (SkipAnimations) // This pass are here case the player Wanna Skip the Cutscene to reset animations
{
MainAnimator.speed = 0;
}
if (Cutscenes[c].AnotherObjects[o].Object.GetComponent<Animator>())
{
if (SkipAnimations) // This pass are here case the player Wanna Skip the Cutscene
{
Cutscenes[c].AnotherObjects[o].Object.GetComponent<Animator>().speed = 100;
}
Cutscenes[c].AnotherObjects[o].Object.GetComponent<Animator>().SetBool(Cutscenes[c].CutsceneName, false);
if (SkipAnimations) // This pass are here case the player Wanna Skip the Cutscene to reset animations
{
MainAnimator.speed = 1;
}
}
//Verify and set Final Location And Rotation
if (Cutscenes[c].AnotherObjects[o].RePosition && Cutscenes[c].AnotherObjects[o].EndPosition)
{
Cutscenes[c].AnotherObjects[o].Object.transform.position =
Cutscenes[c].AnotherObjects[o].EndPosition.position;
}
if (Cutscenes[c].AnotherObjects[o].ReRotation && Cutscenes[c].AnotherObjects[o].EndPosition)
{
Cutscenes[c].AnotherObjects[o].Object.transform.rotation =
Cutscenes[c].AnotherObjects[o].EndPosition.rotation;
}
if (Cutscenes[c].AnotherObjects[o].ReParent)
{
Cutscenes[c].AnotherObjects[o].Object.transform.parent = null;
}
}
}
}
}
}
*O script está em inglês por causa do pessoal que está trabalhando no projeto junto comigo
Basicamente o sistema reposiciona todos os objetos solicitados pelo script em uma determinada localização, e ele chama a animação do nome da Cutscene nos objetos que estiverem um Animator vinculado a eles
Para chamar a cutscene, basta fazer algum script chamar a void "StartCutscene()"
é um sistema Utilitário/Complementar, pode ser utilizado com um outro sistema que disponibilizei aqui
Tópicos semelhantes
» [TUTORIAL] Simples Sistema De Noite e Dia
» [TUTORIAL] Sistema Simples de Falas
» [TUTORIAL] Sistema de Lanterna Simples sem bateria
» [TUTORIAL] Sistema simples de GRANADA e EXPLOSÕES
» [TUTORIAL] Sistema de câmera em primeira pessoa SIMPLES
» [TUTORIAL] Sistema Simples de Falas
» [TUTORIAL] Sistema de Lanterna Simples sem bateria
» [TUTORIAL] Sistema simples de GRANADA e EXPLOSÕES
» [TUTORIAL] Sistema de câmera em primeira pessoa SIMPLES
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos