unity简单实现RPG对话框

老规矩废话不多说 直接上效果图可以支持多个选项

对话框的类结构

工程基于本人的GameFrame框架 主要逻辑如下

    void ChangeScence()
    {
        Singleton<SceneManager>.GetInstance().LoadScene("Login", () =>
        {
        Singleton<WindowManager>.GetInstance().OpenWindow("Dialogue",true,true,new DialogueContent("dialoguedata.json","node1"));
        });
    }

UI框架的DialogueContent的类结构如下: 支持当前对话 的模型头像的一些支持 比如当前说话的角色头像模型变大之类的

public class DialogueContent : WindowContext
{
    public string FileName ;
    public string StartNode;
    public Sprite LeftIcon;
    public GameObject LeftModel;
    public Sprite RightIcon;
    public GameObject RightModel;
    public int ShowType = 0;// 不显示 1 显示ICON 2 显示 MODEL
    public DialogueContent(string file,string node,Sprite lefticon = null ,Sprite righticon = null,GameObject leftmodle = null,GameObject rightmodel = null,int show = 0)
    {
        FileName = file;
        StartNode = node;
        LeftIcon = lefticon;
        RightIcon = righticon;
        LeftModel = leftmodle;
        RightModel = rightmodel;
        ShowType = show;
    }
}
//初始化按钮的监听事件
 for (int i = 0; i < 4; i++)
        {
            Answers[i] = CacheTransform.Find("Content/AnswerBtn" + (i + 1)).gameObject;
            EventTriggerListener.Get(Answers[i].gameObject).SetEventHandle(EnumTouchEventType.OnClick, (a, b, c) =>
            {
                StopContentText();
                string nextNode = NodeData.Answers[(int) (c[0])].Target;
                if (nextNode == "end")
                {
                    //关闭界面
                    Singleton<WindowManager>.GetInstance().CloseWindow(false,"Dialogue");
                    return;
                }
                NodeData = GetDialogue(nextNode);
                Coroutine = SingletonMono<GameFrameWork>.GetInstance().StartCoroutine(ShowContentText());
            },i);
        }

//更新全局的当前对话的数据
 private DialogueNodeData GetDialogue(string nodename)
    {
        for (int i = 0; i < Data.Nodes.Length; i++)
        {
            if (Data.Nodes[i].Character == nodename)
            {
                return Data.Nodes[i];
            }
        }
        return null;
    }


//显示按钮与对话文字
 private IEnumerator ShowContentText()
    {
        TitleText.text = NodeData.Character;
        //显示按钮
        for (int i = 0; i < 4; i++)
        {
            if (NodeData.Answers.Length > i)
            {
                Answers[i].SetActive(true);
                Answers[i].transform.Find("Text").gameObject.GetComponent<Text>().text = NodeData.Answers[i].Option;
            }
            else
            {
                Answers[i].SetActive(false);
            }
        }
        ShowText.text = "";
        char[] letters = NodeData.Dialogue.ToCharArray();
        for (int i = 0; i < letters.Length; i++)
        {
            ShowText.text += letters[i];
            yield return new WaitForEndOfFrame();
        }
    }

简单实现了一个编辑对话框的Editor扩展

效果如下

有什么疑问 请联系本人或评论

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值