public static Block FindParentBlock(FlowchartExtend srcFlowchart, Command cmd) { var blocks = srcFlowchart.GetComponents <Block>(); foreach (Block item in blocks) { if (item.CommandList.Contains(cmd)) { return(item); } } return(null); }
//主要CSV 讀入部分 public static void CreateBlockByCSV(FlowchartExtend srcFlowchart, string csvFile, bool inEditor) { //讀入 CSV 檔案,使其分為 string 二維陣列 CsvParser csvParser = new CsvParser(); string[][] csvTable = csvParser.Parse(csvFile); //判斷CSV 檔案 有無內容 if (csvTable.Length <= 1) { AdvUtility.Log("No data rows in file"); return; } //搜尋開頭字串正不正確 int id_key = Array.IndexOf(csvTable[0], AdvUtility.TitleKeys); int id_command = Array.IndexOf(csvTable[0], AdvUtility.TitleCommand); int id_target = Array.IndexOf(csvTable[0], AdvUtility.TitleTarget); int id_arg1 = Array.IndexOf(csvTable[0], AdvUtility.TitleArg1); int id_arg2 = Array.IndexOf(csvTable[0], AdvUtility.TitleArg2); int id_image = Array.IndexOf(csvTable[0], AdvUtility.TitleImage); int id_name = Array.IndexOf(csvTable[0], AdvUtility.TitleName); //判斷CSV 檔案格式正不正確 if (id_command == -1) { AdvUtility.LogWarning("確認 CSV 是否為逗號分隔 (?"); LogBox("確認 CSV 檔案是否為逗號分隔 (? "); return; } if (id_key == -1 || id_command == -1 || id_target == -1) { AdvUtility.LogWarning("CSV 檔案沒有正確的開頭資訊 (Keys, Command, Target, Arg1, Arg2, Content_zh-tw)"); return; } //至此 CSV檔案正常 srcFlowchart.csvBackup = csvFile; if (AdvKeyContent.GetCurrentInstance() == null) { AdvUtility.LogWarning("Adv Keys 尚未初始化! 資源讀取將會失敗!"); } if (srcFlowchart.AutoGenerateBlock != null) { AdvUtility.LogWarning("該Block 已經使用過Create指令, 將清除並重新Create!"); } foreach (var comp in srcFlowchart.GetComponents <Component>()) { if (!(comp is Transform) && !(comp is FlowchartExtend)) { MonoBehaviour.DestroyImmediate(comp, true); } } //視覺化建立的 Block 的位置 Vector2 newNodePosition = Vector2.zero; newNodePosition = new Vector2( 50 / srcFlowchart.Zoom - srcFlowchart.ScrollPos.x + UnityEngine.Random.Range(-10.0f, 10.0f), 50 / srcFlowchart.Zoom - srcFlowchart.ScrollPos.y + UnityEngine.Random.Range(-10.0f, 10.0f) ); newNodePosition = GetNewBlockPosition(ref newNodePosition, new Vector2(50, 50)); //1. 儲存Block 資訊用於CSV架構 //2. SearchHandler為搜尋Block標籤用的事件,當新Block建立時,觸發事件去找該Block是不是該Command要找的Block Dictionary <string, Block> blockTree = new Dictionary <string, Block>(); SearchBlockHandler searchHandler = new SearchBlockHandler(); //建立入口Block Block baseBlock = srcFlowchart.CreateBlock(newNodePosition); srcFlowchart.AutoGenerateBlock = baseBlock; //Main Block 設置完成 baseBlock.BlockName = AdvUtility.CSVImportedBlockName; //Main Block 名稱設置為 Main blockTree.Add(baseBlock.BlockName, baseBlock); //第一行指令設置為 建立入口用 Call Entrance = AddCommandToBlock(srcFlowchart, baseBlock, GetTypeOfCommand("CallExtend")) as Call; //1. 正在添加的Block //2. 該Command 對應的背景, 用於跳場景用 Block workBlock = baseBlock; ControlBackground workBackground = null; srcFlowchart.csvLines = new List <AdvCSVLine>(); //重置 CSV Lines , 這樣的設置前提是每個 Flowchart只匯入一個 CSV LogBox("初始化完畢..."); //針對每一行CSV做處理 for (int i = 1; i < csvTable.Length; i++) { //建立新的CSV Line, 讀入該Line資料進去 AdvCSVLine thisLine = new AdvCSVLine(csvTable[0], csvTable[i]); //加入該CSV Line 進入 flowchart CSVLine 集合 srcFlowchart.csvLines.Add(thisLine); string srcCommand = csvTable[i][id_command]; bool comResult = false; //如果Command是*記錄點,建立Block,否則建立Command if (srcCommand.StartsWith("*")) { comResult = true; string _name = srcCommand; workBlock = srcFlowchart.CreateBlock(GetNewBlockPosition(ref newNodePosition, new Vector2(150, 50))); workBlock.BlockName = _name; blockTree.Add(workBlock.BlockName, workBlock); thisLine.generateBlock = workBlock; searchHandler.createBlockEvent?.Invoke(workBlock); } else { Command newCommand = CreateCommand(srcFlowchart, workBlock, csvTable[0], csvTable[i], searchHandler); if (newCommand != null) { comResult = true; SetupCommand(srcFlowchart, newCommand, i, csvTable[i][id_key]); //設置flowchart中,CSVLine表key值對應的Command , 用於更新資料 thisLine.generatedCommand = newCommand; //如果指令是背景, 設置切入劇情時的背景 if (newCommand.GetType() == typeof(ControlBackground)) { workBackground = newCommand as ControlBackground; } } } if (comResult == false) { LogBox("讀取第 " + i + " 行指令 失敗 , 指令碼(Command)錯誤"); } else { LogBox("讀取第 " + i + " 行指令 成功"); } } LogBox("文本讀取完畢!"); }