Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    //主要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("文本讀取完畢!");
    }