using SK.Framework; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; /// /// Excel数据解析器 /// public class CSVReader : MonoBehaviour { public DialogueData ParseDialogueData(string path) { //检查文件是否存在 if (!File.Exists(path)) return null; //创建对话数据对象 DialogueData dialogueData = new DialogueData(); DialogueEntry currentEntry = null; bool isProcessEvent = false; DialogueEntry eventEntry = null; //读取文件内容 string[] lines = File.ReadAllLines(path); for (int i = 0; i < lines.Length; i++) { string line = lines[i]; if (string.IsNullOrWhiteSpace(line)) continue; //分割行数据 string[] parts = line.Split('|'); //清理每个部分 for (int j = 0; j < parts.Length; j++) { parts[j] = parts[j].Trim(); } if (parts.Length < 2) continue; //解析角色行 if (parts[0].Equals("角色")) { //如果正在处理事件,先保存事件条目 if (isProcessEvent && eventEntry != null) { dialogueData.entries.Add(eventEntry); isProcessEvent = false; eventEntry = null; } //保存上一个对话条目 if (currentEntry != null && (currentEntry.dialogues.Count > 0 || currentEntry.hasEvent)) dialogueData.entries.Add(currentEntry); //创建新的对话条目 currentEntry = new DialogueEntry { role = parts[1], dialogues = new List(), hasEvent = false, eventName = "", eventRole = "", eventChoices = new List(), nextEntryIndex = -1 }; } //解析对话行 else if (parts[0].Equals("对话") && currentEntry != null) { for (int j = 1; j < parts.Length; j++) { if (!string.IsNullOrEmpty(parts[j]) && !parts[j].Equals("xxxxx")) { currentEntry.dialogues.Add(parts[j]); } } } //解析事件行 else if (parts[0].Equals("事件") && currentEntry != null) { if (currentEntry != null) { currentEntry.hasEvent = true; currentEntry.eventName = "交互事件"; } //创建独立的事件条目 eventEntry = new DialogueEntry { role = "系统事件", dialogues = new List(), hasEvent = true, eventName = "玩家选择事件", eventRole = "", eventChoices = new List(), nextEntryIndex = -1 }; isProcessEvent = true; } //解析事件角色行 else if (parts[0].Equals("事件角色") && eventEntry != null && isProcessEvent) { eventEntry.eventRole = parts[1]; } //解析事件选项行 else if (parts[0].Equals("事件选项") && isProcessEvent && eventEntry != null) { for (int j = 1; j < parts.Length; j++) { if (!string.IsNullOrEmpty(parts[j]) && !parts[j].Equals("xxxxx")) eventEntry.eventChoices.Add(parts[j]); } //检查后续行是否也是选项 int nextLineIndex = i + 1; while (nextLineIndex < line.Length) { string nextLine = lines[nextLineIndex].Trim(); if (string.IsNullOrEmpty(nextLine)) break; string[] nextparts = nextLine.Split('|'); if (nextparts.Length > 0 && string.IsNullOrEmpty(nextparts[0].Trim())) { //选项的延续行 for (int j = 0; j < nextparts.Length; j++) { string option = parts[j].Trim(); if (!string.IsNullOrEmpty(option)) eventEntry.eventChoices.Add(option); } i = nextLineIndex; //跳过已处理的行 nextLineIndex++; } else { break; } } } //处理空行中的对话内容(对话延续) else if (parts.Length > 0 && string.IsNullOrEmpty(parts[0]) && currentEntry != null) { for (int j = 0; j < parts.Length; j++) { if (!string.IsNullOrEmpty(parts[j])) currentEntry.dialogues.Add(parts[j]); } } } //保留最后一个条目 if (currentEntry != null && (currentEntry.dialogues.Count > 0 || currentEntry.hasEvent)) { dialogueData.entries.Add(currentEntry); } //保留最后一个事件条目 if (isProcessEvent && eventEntry != null) { dialogueData.entries.Add((eventEntry)); } //BuildEventJumpTable(dialogueData); return dialogueData; } /// /// 创建事件跳过 /// /// private void BuildEventJumpTable(DialogueData data) { for (int i = 0; i < data.entries.Count; i++) { if (data.entries[i].hasEvent && !string.IsNullOrEmpty(data.entries[i].eventName)) { string eventKey = $"{data.entries[i].eventRole}_{data.entries[i].eventName}"; if (!data.eventJumpTable.ContainsKey(eventKey)) data.eventJumpTable.Add(eventKey, i); } } } }