unity对话UI设置

本文介绍了如何使用Unity编程语言控制UI界面,包括图片和文字的展示,以及通过代码设置图层位置和角色图片显示。详细讲解了如何处理对话文本、角色选择和选项按钮的动态生成。

思路

摆放好ui后用代码控制ui的图片和里面的文字

图片位置设置

这个设置图层位置

代码

using System.Collections;

using System.Collections.Generic;

using System.Data.Common;

using TMPro;

using UnityEngine;

using UnityEngine.UI;



public class TMp : MonoBehaviour

{

    /// <summary>

    /// 对话文本文件。.csv格式

    /// </summary>

    public TextAsset dialogDateFile;



    /// <summary>

    /// 左侧角色图像

    /// </summary>

    public SpriteRenderer spriteLeft;



    /// <summary>

    /// 右侧角色图像

    /// </summary>

    public SpriteRenderer spriteRight;



    /// <summary>

    /// 角色名字文本

    /// </summary>

    public TMP_Text nameText;



    /// <summary>

    /// 对话内容文本

    /// </summary>

    public TMP_Text dialogText;



    /// <summary>

    /// 角色图片列表

    /// 在unity里面手动添加可以

    /// </summary>

    public List<Sprite> sprites = new List<Sprite>();



    /// <summary>

    /// 角色名字对应图片的字典

    /// </summary>

    Dictionary<string,Sprite> imageDic = new Dictionary<string, Sprite>();



    /// <summary>

    /// 对话文本 按行分割

    /// </summary>

    public string[] dialogRows;



    /// <summary>

    /// 当前对话索引值

    /// </summary>

    private int dialogIndex;



    /// <summary>

    /// 对话继续按钮

    /// </summary>

    public Button nextButton;



    /// <summary>

    /// 选项预制体

    /// </summary>

    public GameObject optionButton;



    /// <summary>

    /// 选项父节点,用于自动排列

    /// </summary>

    public Transform buttonGroup;

    [Header("鱼")]

    public int yu;

    [Header("钱")]

    public int qian;

    private void Awake() {

        imageDic["渔夫"] = sprites[0];

        imageDic["剑客"]= sprites[1];

    }

   

    private void Start() {

        ReaText(dialogDateFile);

        ShowDialogRow();

        spriteRight.sprite = null;

        spriteLeft.sprite = null;

        // UpdateText("博士","这里是");

        // UpdateImage("渔夫",false);

    }

    public void UpdateText(string _name , string _text){

        nameText.text = _name;//人物名字

        dialogText.text = _text;//对话内容

    }

    public void UpdateImage(string _name,string _atLeft)//判断图片是否在左侧

    {

        if(_atLeft == "左"){

            spriteLeft.sprite = imageDic[_name];

            spriteRight.sprite = imageDic[_name];

        }

        else if(_atLeft == "右")

        {

            spriteRight.sprite = imageDic[_name];

            spriteLeft.sprite = imageDic[_name];

        }

    }

    public void ReaText(TextAsset _textAsset){

        dialogRows = _textAsset.text.Split('\n');//读取文件用Split('\n')分割

        Debug.Log("读取成功");

    }

    public void ShowDialogRow()

    {//dialogIndex是全局变量所以重新启动后dialogIndex还是变化后的值所以循环不会被打断

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

        {

            string[] cells = dialogRows[i].Split(',');

            //#条件时直接给对话框图片赋值

            if (cells[0]=="#" /*找判断条件*/&&int.Parse(cells[1]) == dialogIndex/*找id*/)

            {

                UpdateText(cells[2], cells[4]);//文本赋值

                UpdateImage(cells[2], cells[3]);//对话框赋值

                dialogIndex = int.Parse(cells[5]);//int.Parse()将内容转变为int类型赋值给对话索引

                nextButton.gameObject.SetActive(true);//显示回来

                break;

            }

            else if(cells[0]=="&" &&int.Parse(cells[1]) == dialogIndex){

                nextButton.gameObject.SetActive(false);

                GenerateOption(i);//需要传入的是第几列的值

            }

            else if(cells[0]=="END" &&int.Parse(cells[1]) == dialogIndex){

                nextButton.gameObject.SetActive(false);//显示回来

                spriteRight.sprite = null;

                spriteLeft.sprite = null;

                dialogText.text = "购买结束";

                Debug.Log("结束");

            }

        }

    }

    public void OnclickNext()//继续按键按下后执行的事件

    {

        ShowDialogRow();

    }

    public void GenerateOption(int _index)

    {

        string[] cells = dialogRows[_index].Split(',');

        if(cells[0] =="&")

        {

            GameObject button = Instantiate(optionButton,buttonGroup);

            //绑定按钮事件

            //button.GetComponentInChildren<TextMeshPro>().text= cells[4];//子物体的TextMeshPro

            TextMeshProUGUI textMeshPro = button.GetComponentInChildren<TextMeshProUGUI>();

            if (textMeshPro != null)  

            {  

                // 绑定按钮的文本  

                textMeshPro.text = cells[4];  

            }  

            else  

            {  

                // 处理TextMeshPro组件不存在的情况  

                Debug.LogError("TextMeshProUGUI component not found on the button or its children.");  

            }  

            button.GetComponent<Button>().onClick.AddListener(()=>

            {

                OnOptionClick(int.Parse(cells[5]));//赋值跳转的id

                //增加效果

                if(cells[6]!= ""&& cells[6].Contains("@"))

                {

                    string[] strings = cells[6].Split("@");

                    OptionEffect(strings[0],int.Parse(strings[1]));

                }

            });

            GenerateOption(_index+1);//生成多个预制体按钮

        }

    }

    //销毁选项

    public void OnOptionClick(int _id){

        dialogIndex=_id;

        ShowDialogRow();

        for (int i = 0 ;i <buttonGroup.childCount;i++){

            Destroy(buttonGroup.GetChild(i).gameObject);

        }

    }

    //效果部分

    public void OptionEffect(string effect ,int zhi){

        if (effect=="鱼"){yu+=1;}

        if (effect=="钱"){qian+=1;}

    }

}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值