思路
摆放好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;}
}
}
本文介绍了如何使用Unity编程语言控制UI界面,包括图片和文字的展示,以及通过代码设置图层位置和角色图片显示。详细讲解了如何处理对话文本、角色选择和选项按钮的动态生成。
1241





