Created
September 23, 2020 08:20
-
-
Save josemorval/6590c7dff6ac33c260fd629f6d0f4484 to your computer and use it in GitHub Desktop.
Revisions
-
josemorval created this gist
Sep 23, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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(); } }