using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Sirenix.OdinInspector; /// /// 一次对话,只需在面板设置对话顺序和内容列表,再拖入对话者即可,其他一些暴露参数可不调 /// public class AConversation : MonoBehaviour { [ListDrawerSettings] public List contentList; [ListDrawerSettings] public List speakerList; public string conversationName; public float timePerSpeak; public Sprite P1Background; public Sprite P2Background; [Header("P1一定是左边的,切记")] public Transform P1Pos; public Transform P2Pos; [Header("对话框到说话者中心的偏移量")] public Vector2 offset = new Vector2(1.5f, 1.5f); private List speakList; protected ASpeak.Speaker P1; protected ASpeak.Speaker P2; protected SpriteRenderer P1Renderer; protected SpriteRenderer P2Renderer; protected Player player; protected SpriteRenderer P1ContentRenderer; protected SpriteRenderer P2ContentRenderer; void Start() { speakList = new List(); //新增对话框游戏物体,挂在这个游戏物体上 AddDialog(); //找到玩家 player = FindObjectOfType(); SetConversation(); } /// /// 对外界唯一接口 /// public void OnCall() { if(speakList.Count == speakerList.Count) { //移动对话框到相应位置 MoveDialog(); //开始对话 StartCoroutine(Speak()); } else { Debug.LogError("对话顺序和内容列表长度不一致"); } } protected IEnumerator Speak(){ yield return new WaitForEndOfFrame(); //遍历对话列表 foreach(ASpeak speak in speakList){ //根据说话者将对话的透明度插值至1 if(speak.speaker == P1){ P1Renderer.DOColor(new Color(1,1,1,1),1f); P1ContentRenderer.sprite = speak.content; P1ContentRenderer.DOColor(new Color(1,1,1,1),1f); } else{ P2Renderer.DOColor(new Color(1,1,1,1),1f); P2ContentRenderer.sprite = speak.content; P2ContentRenderer.DOColor(new Color(1,1,1,1),1f); } //等待 yield return new WaitForSeconds(timePerSpeak); //根据说话者将对话的透明度插值至0 if(speak.speaker == P1){ P1Renderer.DOColor(new Color(1,1,1,0),1f); P1ContentRenderer.DOColor(new Color(1,1,1,0),1f); } else{ P2Renderer.DOColor(new Color(1,1,1,0),1f); P2ContentRenderer.DOColor(new Color(1,1,1,0),1f); } yield return new WaitForSeconds(1f); } //都说完以后,触发结束事件 OnEnd(); } /// /// 在设置对话顺序时使用 /// /// protected void AddASpeak(ASpeak.Speaker speaker,Sprite content) { ASpeak speak = new ASpeak(); speak.speaker = speaker; speak.content = content; speakList.Add(speak); } /// /// 只需要手动设置说话的顺序,不需要手动设置对话内容 /// public virtual void SetConversation() { for(int i = 0; i < speakerList.Count; i++) { AddASpeak(speakerList[i], contentList[i]); } } /// /// 对话结束时触发 会恢复玩家的操作权限 /// public virtual void OnEnd() { //不在演出中时,恢复玩家的操作权限 if(!ConversationController.Instance.CheckStage()) player.ToMap("Normal"); } /// /// 初始化对话框 /// protected void AddDialog() { //新增对话框游戏物体,挂在这个游戏物体上 GameObject P1dialog = new GameObject("P1Dialog"); P1dialog.transform.SetParent(transform); P1dialog.transform.position = new Vector3(0, 0, 0); P1dialog.AddComponent(); P1Renderer = P1dialog.GetComponent(); P1Renderer.sprite = P1Background; P1Renderer.sortingLayerName = "UI"; GameObject P2dialog = new GameObject("P2Dialog"); P2dialog.transform.SetParent(transform); P2dialog.transform.position = new Vector3(0, 0, 0); P2dialog.AddComponent(); P2Renderer = P2dialog.GetComponent(); P2Renderer.sprite = P2Background; P2Renderer.sortingLayerName = "UI"; //使其二透明度变为0 P1Renderer.color = new Color(1, 1, 1, 0); P2Renderer.color = new Color(1, 1, 1, 0); //新增对话框内容游戏物体,挂在对话框游戏物体上 GameObject P1Content = new GameObject("P1Content"); P1Content.transform.SetParent(P1dialog.transform); P1Content.transform.localPosition = new Vector3(0, 0, 0); P1Content.AddComponent(); P1ContentRenderer = P1Content.GetComponent(); P1ContentRenderer.sortingLayerName = "UI"; P1ContentRenderer.sortingOrder = 2; GameObject P2Content = new GameObject("P2Content"); P2Content.transform.SetParent(P2dialog.transform); P2Content.transform.localPosition = new Vector3(0, 0, 0); P2Content.AddComponent(); P2ContentRenderer = P2Content.GetComponent(); P2ContentRenderer.sortingLayerName = "UI"; P2ContentRenderer.sortingOrder = 2; //使其二透明度变为0 P1ContentRenderer.color = new Color(1, 1, 1, 0); P2ContentRenderer.color = new Color(1, 1, 1, 0); } protected void MoveDialog() { P1Renderer.transform.position = P1Pos.position + new Vector3(offset.x, offset.y, 0); P2Renderer.transform.position = P2Pos.position + new Vector3(offset.x * - 1, offset.y, 0); } }