You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity(C#)中如何从列表内的独立类提取字符串?

解决Unity对话系统的List访问错误问题

嘿,我完全懂你作为新手的困扰——有时候就是盯着简单细节反而绕进去了😉 先直接说你报错的原因:你把整个List集合当成单个DialogueInfo对象来访问了!dialogueInfoList<DialogueInfo>类型,它本身没有Words属性,只有集合里的每一个DialogueInfo元素才有这个属性。

一、快速修复当前代码

根据你的需求,分两种情况处理:

  1. 取列表中某一句对话的文本
    如果你要切换到特定的某一句(比如第1句、下一句),需要用索引访问List里的元素:
// 比如取第0个元素的文本(List索引从0开始)
NPC.dialogLines = dialogueInfo[0].Words;

要是想实现逐句切换,你可以维护一个索引变量,比如:

private int currentLineIndex = 0;

// 切换到下一句的方法
public void ShowNextLine()
{
    if (currentLineIndex < dialogueInfo.Count)
    {
        DialogueInfo currentDialogue = dialogueInfo[currentLineIndex];
        // 更新文本
        NPC.dialogLines = currentDialogue.Words;
        // 同步更新Sprite表情
        yourDialogueImage.sprite = currentDialogue.emotion;
        
        currentLineIndex++;
    }
    else
    {
        Debug.Log("对话已经结束啦!");
    }
}
  1. 提取所有对话文本到一个集合
    如果你想把List里所有的Words都提取出来(比如一次性给NPC所有台词),可以用LINQ来简化:
    首先在脚本顶部引用LINQ:
using System.Linq;

然后提取所有文本:

// 转成List<string>
NPC.dialogLines = dialogueInfo.Select(info => info.Words).ToList();
// 或者转成数组
NPC.dialogLines = dialogueInfo.Select(info => info.Words).ToArray();

二、关于你的方案合理性

其实你的核心思路非常棒——用DialogueInfo把文本和Sprite绑定,再用List管理,完美契合逐句切换对话的需求,完全不需要推翻重来。

三、进阶优化方案:用ScriptableObject管理对话数据

如果想更方便地在Unity编辑器里编辑对话(不用硬编码赋值),可以试试ScriptableObject:

  1. 创建一个ScriptableObject类:
using UnityEngine;
using System.Collections.Generic;

[CreateAssetMenu(fileName = "New NPC Dialogue", menuName = "Dialogue/NPC Dialogue")]
public class NPCDialogueData : ScriptableObject
{
    public List<DialogueInfo> dialogueList;
    
    // 嵌套你的DialogueInfo类(或者单独写)
    [System.Serializable]
    public class DialogueInfo
    {
        public Sprite emotionSprite;
        [TextArea] // 让文本输入框更友好
        public string dialogueText;
    }
}
  1. 在Unity编辑器右键→Dialogue→NPC Dialogue,创建一个对话数据文件,直接在Inspector里拖入Sprite、输入文本,不用写代码赋值。
  2. 在你的对话脚本里引用这个ScriptableObject:
public NPCDialogueData npcDialogue;
private int currentIndex = 0;

void Start()
{
    // 直接用npcDialogue.dialogueList来访问所有对话数据
    ShowNextLine();
}

这种方式更适合多人协作或者大量对话的场景,数据和逻辑分离,维护起来更轻松。

内容的提问来源于stack exchange,提问作者RCC

火山引擎 最新活动