Skip to content

Instantly share code, notes, and snippets.

@josemorval
Created September 23, 2020 08:20
Show Gist options
  • Save josemorval/6590c7dff6ac33c260fd629f6d0f4484 to your computer and use it in GitHub Desktop.
Save josemorval/6590c7dff6ac33c260fd629f6d0f4484 to your computer and use it in GitHub Desktop.

Revisions

  1. josemorval created this gist Sep 23, 2020.
    252 changes: 252 additions & 0 deletions Some conversation manager Wild Flirting
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,252 @@
    using UnityEngine;
    using System.Collections;

    public class ConversationManager : MonoBehaviour {

    GameObject go1;
    GameObject go2;
    GameObject go3;

    public Transform answerAnchorHide;
    public Transform answerAnchorShow;

    public Transform conversationBox;
    public GameObject templateTextBox;
    public GameObject templateTextAnswerBox;

    public ArrayList conversations;
    public int maxNumCharacters;
    public float overlapFactor;
    public float heightSeparation;
    public float heightOffset;
    public float heightAnswerSeparation;
    public float maximumHeight;

    public Color playerColor;
    public Color otherColor;

    public bool isWriting;
    public float timeToWrite;
    public AnimationCurve anim;

    public void StartManager(){
    conversations = new ArrayList();
    }

    public void EmitLine(bool isPlayer, string text){

    if(!isWriting)
    StartCoroutine(EmitLineCor(isPlayer,text));
    }

    IEnumerator EmitLineCor(bool isPlayer, string text){

    isWriting = true;

    string strInLines;
    int numLines;

    PutTextInLines(text,out strInLines,out numLines);
    float scale = 0.5f + 0.3f*numLines;

    GameObject go;

    if(isPlayer){
    go = Instantiate(templateTextBox,new Vector3(0f,0f,0f),Quaternion.identity) as GameObject;
    go.transform.parent = conversationBox.transform;
    go.transform.GetChild(0).transform.GetComponent<TextBoxScript>().SetBoxColor(playerColor);

    go.transform.localPosition = new Vector3(overlapFactor,scale,-1f);

    }else{
    go = Instantiate(templateTextBox,new Vector3(0f,0f,0f),Quaternion.identity) as GameObject;
    go.transform.parent = conversationBox.transform;
    go.transform.GetChild(0).transform.GetComponent<TextBoxScript>().SetBoxColor(otherColor);

    go.transform.localPosition = new Vector3(-overlapFactor,scale,-1f);

    }

    go.transform.GetChild(0).transform.localScale = new Vector3(go.transform.GetChild(0).transform.localScale.x,
    scale,
    go.transform.GetChild(0).transform.localScale.z);

    go.transform.GetChild(1).GetComponent<TextMesh>().text = strInLines;


    //Nos guardamos las posiciones iniciales
    Vector3 curGoPos = go.transform.localPosition;
    Vector3[] gosPositions = new Vector3[conversations.Count];

    for(int i=0;i<conversations.Count;i++){
    gosPositions[i] = ((GameObject)conversations[i]).transform.localPosition;
    }


    float time = 0f;

    while(time<1f){

    go.transform.localPosition = (curGoPos-new Vector3(0f,heightSeparation+scale-heightOffset,0f))*(1f-anim.Evaluate(time))+
    (curGoPos+new Vector3(0f,heightOffset,0f))*anim.Evaluate(time);

    for(int i=0;i<conversations.Count;i++){
    GameObject g = conversations[i] as GameObject;
    g.transform.localPosition = gosPositions[i]*(1f-anim.Evaluate(time))+
    (gosPositions[i]+new Vector3(0f,scale+heightSeparation,0f))*anim.Evaluate(time);
    }

    //El "tiempo" mejor entre 0 y 1 para el Lerp, y controlamos lo que tarda con la "velocidad de aumento del tiempo"
    time+=1.0f/timeToWrite * Time.deltaTime;

    yield return null;
    }

    go.transform.localPosition = curGoPos+new Vector3(0f,heightOffset,0f);


    ArrayList listToDestroy = new ArrayList();

    for(int i=0;i<conversations.Count;i++){
    GameObject g = conversations[i] as GameObject;
    g.transform.localPosition = gosPositions[i]+new Vector3(0f,scale+heightSeparation,0f);

    if(g.transform.localPosition.y>maximumHeight){
    listToDestroy.Add(i);
    }
    }


    for(int i=listToDestroy.Count-1;i>=0;i--){

    int index = (int)listToDestroy[i];
    GameObject g = conversations[index] as GameObject;

    conversations.RemoveAt(index);
    DestroyObject(g);
    }


    conversations.Add (go);

    isWriting = false;

    yield return null;

    }

    public void PutTextInLines(string text, out string strInLines, out int numLines){

    numLines=0;
    strInLines = "";
    int countCharacters = 0;
    string[] tokens = text.Split(' ');

    for(int i=0;i<tokens.Length;i++){

    if((countCharacters+tokens[i].Length)>maxNumCharacters){
    countCharacters = 0;
    strInLines +="\n";
    numLines++;
    }

    strInLines+=tokens[i]+" ";
    countCharacters+=tokens[i].Length+1;

    }


    }


    IEnumerator EmitLineOptions(string[] text){
    //optionBoxes[0].gameObject
    //isWriting = true;

    string strInLines;
    int numLines;
    string strInLines2;
    int numLines2;
    string strInLines3;
    int numLines3;

    PutTextInLines(text[0],out strInLines,out numLines);
    PutTextInLines(text[1],out strInLines2,out numLines2);
    PutTextInLines(text[2],out strInLines3,out numLines3);
    float scale = 0.5f + 0.3f*numLines;


    go1 = Instantiate(templateTextAnswerBox,new Vector3(0f,0f,0f),Quaternion.identity) as GameObject;
    go1.transform.parent = conversationBox.transform;

    go1.transform.GetChild(0).transform.GetComponent<TextBoxScript>().SetBoxColor(playerColor);

    go1.transform.GetChild(0).transform.localScale = new Vector3(go1.transform.GetChild(0).transform.localScale.x,
    scale,
    go1.transform.GetChild(0).transform.localScale.z);

    go1.transform.GetChild(1).GetComponent<TextMesh>().text = strInLines;
    go1.transform.position = answerAnchorShow.position;

    go1.transform.GetChild(0).name = "Opt1";

    float scale2 = 0.5f + 0.3f*numLines2;

    go2 = Instantiate(templateTextAnswerBox,new Vector3(0f,0f,0f),Quaternion.identity) as GameObject;
    go2.transform.parent = conversationBox.transform;
    go2.transform.GetChild(0).transform.GetComponent<TextBoxScript>().SetBoxColor(playerColor);

    go2.transform.GetChild(0).transform.localScale = new Vector3(go2.transform.GetChild(0).transform.localScale.x,
    scale2,
    go2.transform.GetChild(0).transform.localScale.z);

    go2.transform.GetChild(1).GetComponent<TextMesh>().text = strInLines2;
    go2.transform.position = go1.transform.position+new Vector3(0f,-scale-heightAnswerSeparation,0f);


    go2.transform.GetChild(0).name = "Opt2";

    float scale3 = 0.5f + 0.3f*numLines3;

    go3 = Instantiate(templateTextAnswerBox,new Vector3(0f,0f,0f),Quaternion.identity) as GameObject;
    go3.transform.parent = conversationBox.transform;
    go3.transform.GetChild(0).transform.GetComponent<TextBoxScript>().SetBoxColor(playerColor);

    go3.transform.GetChild(0).transform.localScale = new Vector3(go3.transform.GetChild(0).transform.localScale.x,
    scale3,
    go3.transform.GetChild(0).transform.localScale.z);

    go3.transform.GetChild(1).GetComponent<TextMesh>().text = strInLines3;
    go3.transform.position = go2.transform.position+new Vector3(0f,-scale2-heightAnswerSeparation,0f);

    go3.transform.GetChild(0).name = "Opt3";

    ShowOpts();

    yield return null;

    }

    public void DontShowOpts(){
    if (go1 != null) DestroyObject(go1);
    if (go2 != null) DestroyObject(go2);
    if (go3 != null) DestroyObject(go3);
    }

    public void ShowOpts(){
    if (go1 != null) go1.SetActive(true);
    if (go2 != null) go2.SetActive(true);
    if (go3 != null) go3.SetActive(true);
    }

    public void ClearConversations(){

    foreach(Transform child in conversationBox) {
    Destroy(child.gameObject);
    }

    conversations.Clear();

    }

    }