Hola este problema que tuviste me animo a hacer un script en base al que tu hiciste, no se si sea mas cómodo pero aquí esta xP
si no te es útil quizás a otro por eso igual lo subo :'v le sea de utilidad igual lo hice por que necesito uno para mi proyecto xD.
Edit: olvide decir que le añadí eso que pediste al inicio de verificar si ya acabo el audio, no creo que sea necesario eso en su lugar puedes usar "yield return new WaitForSeconds (voz.clip.length);" esto hara que espere a que la voz se termine indirectamente :'v.
Saludos!
Wow siempre busque como hacer eso y nunca lo encontré, eso me va a ser muy útil muchas gracias aunque no sea conmigo :'v
jajajajaja Te amo lightbug (En el buen sentido de la palabra) aquí la versión final lo usare en todos mis proyectos :'v
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class SubTitulos : MonoBehaviour{
public string[] subtitulos;
public AudioClip[] audio;
public float[] tiempo; // Tiempo para iniciar cada dialogo.
public int contador;
public Text cuadroTexto;
public AudioSource voz;
public void Iniciar (){
contador = 0;
StartCoroutine (Subtitulo());
}
public void Parar (){
StopAllCoroutines ();
}
public void Retornar (){
StartCoroutine (Subtitulo());
}
IEnumerator Subtitulo (){
yield return new WaitForSeconds (tiempo[contador]);
cuadroTexto.text = subtitulos [contador];
voz.clip = audio [contador];
voz.Play ();
yield return new WaitForSeconds (voz.clip.length);
contador += 1;
if(contador >= subtitulos.Length){
// aqui puedes poner alguna funcion para que se ejecute al terminar todos los subtitulos.
}else{
Retornar ();
}
}
}
si no te es útil quizás a otro por eso igual lo subo :'v le sea de utilidad igual lo hice por que necesito uno para mi proyecto xD.
Edit: olvide decir que le añadí eso que pediste al inicio de verificar si ya acabo el audio, no creo que sea necesario eso en su lugar puedes usar "yield return new WaitForSeconds (voz.clip.length);" esto hara que espere a que la voz se termine indirectamente :'v.
Saludos!
Cita de: lightbug date=1517333096Ah ok, igual como dato, si necesitas tener muchos elementos (vamos a llamarlos diálogos), como por ej subtitulos + audio correspondiente podés tener como base un scirptableObject, por ej, algo así:
using UnityEngine;
[CreateAssetMenu(menuName = "DialogueSystem/Dialogue")]
public class DialogueDataProfile : ScriptableObject
{
[System.Serializable]
public class DialogueData
{
[TextArea(3,10)] //<--- esto es una maravilla
public string m_dialogueString;
public AudioClip m_audioClip;
}
public DialogueData[] m_dataArray;
}
Entonces te vas en tu proyecto a "Create/DialogueSystem/Dialogue" (le mande este nombre pero llamalo como quieras) y ya tenés un dialogo.
Incluso podés crearte más, por ej una secuencia de dialogos, osea otro ScriptableObject que contenga este SCo de recién, para no se, setear esta vez los personajes que lo dirán, acá tenés que ser creativo y productivo, pero la principal idea es diferenciar lógica (el pasar de un dialogo a otro, reproducir audio, etc) y datos (los diálogos), entonces no terminas teniendo texto1 , subtitulo14, etc.
Desde un componente cualquiera tuyo (idealemnte el Manager de diálogos) podés ir pasando de arriba a abajo, reproduciendo y mostrando el elemento del arreglo DialogueData como quieras, siempre tenés que tener una referencia al Sco para poder tomar sus datos.
También podrías usas una cola "queue" (en vez del array que puse) ya que te interesa ir sacando el que venga, creo que es más eficiente, no se la verdad, no las uso demasiado.
Wow siempre busque como hacer eso y nunca lo encontré, eso me va a ser muy útil muchas gracias aunque no sea conmigo :'v
jajajajaja Te amo lightbug (En el buen sentido de la palabra) aquí la versión final lo usare en todos mis proyectos :'v
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
[CreateAssetMenu(menuName = "DialogueSystem/Dialogue")]
public class DialogueDataProfile : ScriptableObject
{
[System.Serializable]
public class DialogueData
{
[TextArea(3,10)] //<--- esto es una maravilla
public string dialogo;
public AudioClip audio;
public float tieIni; // Tiempo para iniciar;
}
public DialogueData[] m_dataArray;
}
public class SubTitulos : MonoBehaviour{
//public string[] subtitulos;
//public AudioClip[] audio;
//public float[] tiempo; // Tiempo para iniciar cada dialogo.
public DialogueDataProfile.DialogueData[] dialogos;
public int contador;
public Text cuadroTexto;
public AudioSource voz;
public void Iniciar (){
contador = 0;
StartCoroutine (Subtitulo());
}
public void Parar (){
StopAllCoroutines ();
}
public void Retornar (){
StartCoroutine (Subtitulo());
}
IEnumerator Subtitulo (){
yield return new WaitForSeconds (dialogos[contador].tieIni);
cuadroTexto.text = dialogos[contador].dialogo;
voz.clip = dialogos[contador].audio;
voz.Play ();
yield return new WaitForSeconds (voz.