예제 #1
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="paramList"></param>
    /// <param name="speed">1秒几个字</param>
    public float SetPrintString(List <string> paramList, uint speed)
    {
        float ret = 0.0f;

        if (realText == null)
        {
            realText = gameObject.GetComponent <TextMeshProUGUI>();
        }

        if (strTid.Length > 0)
        {
            string c = TextDao.Inst.GetText(strTid, paramList);
            if (c == null)
            {
                realText.text = "该tid:" + strTid + "未配置";
                return(0);
            }
            else
            {
                int length = realText.GetTextInfo(c).characterCount;
                ret           = length * 1.0f / speed;
                realText.text = c;
                realText.maxVisibleCharacters = 0;
                StopAllCoroutines();
                StartCoroutine(PrintText(length, 1.0f / speed));
            }
        }
        return(ret);
    }
예제 #2
0
    void SetText(string text)
    {
        textMesh.SetText(text);

        TMP_TextInfo textInfo = textMesh.GetTextInfo(textMesh.text);

        identityFieldDelta = new Vector2(
            2 * Mathf.Abs(textInfo.characterInfo[0].topLeft.x) + padding.x,
            2 * Mathf.Abs(textInfo.characterInfo[0].topLeft.y) + padding.y
            );
        backgroundRectTransform.sizeDelta = identityFieldDelta;
    }
예제 #3
0
    public void UpdateConversation(string _maintext)
    {
        conversationMainText.text = _maintext;
        TMP_TextInfo info = conversationMainText.GetTextInfo(_maintext);

        maxStepTextCharacters = info.characterCount;
        maxCharactersCounter  = 0;
        Transform[] oldOptions = conversationOptionContainer.GetComponentsInChildren <Transform>();
        for (int i = 1; i < oldOptions.Length; i++)
        {
            Destroy(oldOptions[i].gameObject);
        }
    }
예제 #4
0
            private Vector2 CalculateMessageSize(ref string message)
            {
                if (this.SubTexts == null)
                {
                    return(Vector2.zero);
                }

                TextMeshProUGUI text = this.SubTexts[1].ReferenceText;

                TMP_TextInfo info = text.GetTextInfo(message);

                buffer_CalculateMessageSize.EnsureResetForNextUpdate();

                Vector2 result         = Vector2.zero;
                int     newLinesToSkip = 0;

                for (int i = 0; i < info.lineCount; i++)
                {
                    TMP_LineInfo lineInfo   = info.lineInfo[i];
                    float        lineLength = lineInfo.maxAdvance + 20; // fudge factor because it always seems to sell itself a little short
                    result.x  = Mathf.Max(result.x, lineLength);
                    result.y += lineInfo.lineHeight;
                    if (i > 0)
                    {
                        if (lineInfo.length < 5)   // empty lines tend to about 3.8 long, for some reason
                        {
                            newLinesToSkip = 2;
                        }
                        if (newLinesToSkip > 0)
                        {
                            newLinesToSkip--;
                        }
                        else
                        {
                            buffer_CalculateMessageSize.Add('\n');
                        }
                    }
                    ArcenCharacterBuffer debugBuffer = new ArcenCharacterBuffer();
                    for (int j = lineInfo.firstCharacterIndex; j <= lineInfo.lastCharacterIndex; j++)
                    {
                        debugBuffer.Add(message[j]);
                        buffer_CalculateMessageSize.Add(message[j]);
                    }
                }

                message = buffer_CalculateMessageSize.GetStringAndResetForNextUpdate();

                return(result);
            }
예제 #5
0
    /// <summary>
    /// Add an item to the list
    /// </summary>
    /// <param name="itemText">Title of the added Item</param>
    public void AddListItem(string itemText)
    {
        TaskListItem newItem = Instantiate(prefabTaskListItem, content.transform);

        items.Add(newItem);
        newItem.text = itemText.Trim();


        //Gets the actual size of the message by iterating each lines of the text

        TextMeshProUGUI label = newItem.label;

        label.GetComponent <RectTransform>().sizeDelta = new Vector2(label.GetComponent <RectTransform>().sizeDelta.x, 0);

        float chatItemHeight = 0;

        foreach (var line in label.GetTextInfo(newItem.text).lineInfo)
        {
            chatItemHeight += line.lineHeight;
        }

        //Checks if the chatItemHeight is below the minimum of 5, if it ain't then we apply the new height)
        chatItemHeight = chatItemHeight < 30 ? 30 : chatItemHeight;

        RectTransform chatItemRectTransform = label.GetComponent <RectTransform>();

        //SizeDelta.x is the Width of the RectTransform (this could be done in the ChatItem component)
        chatItemRectTransform.sizeDelta = new Vector2(chatItemRectTransform.sizeDelta.x, chatItemHeight);

        //Dynamically sets the height of the chat (this could be done in a ChatContent component)
        RectTransform chatContentRecTransform = content.GetComponent <RectTransform>();

        float finalHeight =
            chatItemHeight +
            chatContentRecTransform.GetComponent <VerticalLayoutGroup>().spacing +
            chatContentRecTransform.GetComponent <VerticalLayoutGroup>().padding.top +
            chatContentRecTransform.GetComponent <VerticalLayoutGroup>().padding.bottom;

        chatContentRecTransform.sizeDelta = new Vector2(chatContentRecTransform.sizeDelta.x, chatContentRecTransform.sizeDelta.y + finalHeight);

        UpdateList();
    }
예제 #6
0
 public void SetPages()
 {
     try
     {
         numPages = listText.GetTextInfo(listText.text).pageCount;
     }
     catch
     {
         Debug.Log("Something went wrong"); // seems to occur the first time I open tree info
     }
     listText.pageToDisplay    = 1;
     pagePrevious.interactable = false; // set to first page, so can't go back
     if (numPages == 1)
     {
         pageNext.interactable = false; // no second page
     }
     else
     {
         pageNext.interactable = true;
     }
 }
예제 #7
0
    /// <summary>
    /// 課題文に合わせてテキスト表示の調整
    /// </summary>
    private void AdjustDisplaySettings()
    {
        // フォームの改行、禁則処理に合致するように課題文の改行を調整しつつ改行を表すマークを挿入
        displayText       = (isUseRuby ? taskWithRuby : taskDisplayText);
        UIInputField.text = taskText;
        var inputInfo     = CurrentInputText.GetTextInfo(displayText);
        var inputLineInfo = inputInfo.lineInfo;

        if (!isUseRuby || metadata.Language.Equals("English"))
        {
            var prevIdx = Int32.MaxValue;
            for (int i = inputLineInfo.Length - 1; i >= 0; --i)
            {
                var lastIdx = inputLineInfo[i].lastCharacterIndex;
                if (!(0 < lastIdx && lastIdx < displayText.Length && prevIdx > lastIdx))
                {
                    continue;
                }
                prevIdx = lastIdx;
                var lastChar = displayText[lastIdx];
                if (lastChar == '\n')
                {
                    displayText = displayText.Insert(lastIdx, "⏎");
                }
                else
                {
                    displayText = displayText.Insert(lastIdx + 1, "\n");
                }
            }
        }
        // ルビありの場合は愚直に後ろから照合していくしかない
        else
        {
            var lineIdx      = 0;
            var maxLastindex = 0;
            for (int i = 0; i < inputLineInfo.Length; ++i)
            {
                var lastIdx = inputLineInfo[i].lastCharacterIndex;
                if (maxLastindex < lastIdx && lastIdx < taskText.Length)
                {
                    maxLastindex = inputLineInfo[i].lastCharacterIndex;
                    lineIdx      = i;
                }
            }
            var          taskIdx    = taskText.Length - 1;
            var          displayIdx = displayText.Length - 1;
            var          newlineIdx = maxLastindex;
            const string rubyTagEnd = "</r>";
            bool         isRubyTag  = false;
            while (taskIdx >= 0 && displayIdx >= 0 && lineIdx >= 0)
            {
                if (displayText[displayIdx] == '>')
                {
                    isRubyTag = true;
                }
                else if (displayText[displayIdx] == '<')
                {
                    isRubyTag = false;
                }
                if (!isRubyTag && taskText[taskIdx].ToString().Equals(displayText[displayIdx].ToString()))
                {
                    if (taskIdx == newlineIdx)
                    {
                        if (taskText[taskIdx] == '\n')
                        {
                            displayText = displayText.Insert(displayIdx, "⏎");
                        }
                        else if (displayIdx + rubyTagEnd.Length < displayText.Length &&
                                 displayText.Substring(displayIdx + 1, rubyTagEnd.Length).Equals(rubyTagEnd))
                        {
                            displayText = displayText.Insert(displayIdx + 1 + rubyTagEnd.Length, "\n");
                        }
                        else
                        {
                            displayText = displayText.Insert(displayIdx + 1, "\n");
                        }
                        lineIdx--;
                        if (lineIdx >= 0)
                        {
                            newlineIdx = inputLineInfo[lineIdx].lastCharacterIndex;
                        }
                    }
                    taskIdx--;
                }
                displayIdx--;
            }
        }
    }
    private void Format()
    {
        var lineIdx       = 0;
        var maxLastindex  = 0;
        var inputInfo     = beforeFormatText.GetTextInfo(displayText);
        var inputLineInfo = inputInfo.lineInfo;

        UnityEngine.Debug.Log(inputInfo);
        for (int i = 0; i < inputLineInfo.Length; ++i)
        {
            var lastIdx = inputLineInfo[i].lastCharacterIndex;
            if (maxLastindex < lastIdx && lastIdx < taskText.Length)
            {
                maxLastindex = inputLineInfo[i].lastCharacterIndex;
                lineIdx      = i;
            }
        }
        var          taskIdx    = taskText.Length - 1;
        var          displayIdx = displayText.Length - 1;
        var          newlineIdx = maxLastindex;
        const string rubyTagEnd = "</r>";
        bool         isRubyTag  = false;

        while (taskIdx >= 0 && displayIdx >= 0 && lineIdx >= 0)
        {
            if (displayText[displayIdx] == '>')
            {
                isRubyTag = true;
            }
            else if (displayText[displayIdx] == '<')
            {
                isRubyTag = false;
            }
            if (!isRubyTag && taskText[taskIdx].ToString().Equals(displayText[displayIdx].ToString()))
            {
                if (taskIdx == newlineIdx)
                {
                    if (taskText[taskIdx] == '\n')
                    {
                        displayText = displayText.Insert(displayIdx, "⏎");
                    }
                    else if (displayIdx + rubyTagEnd.Length < displayText.Length &&
                             displayText.Substring(displayIdx + 1, rubyTagEnd.Length).Equals(rubyTagEnd))
                    {
                        displayText = displayText.Insert(displayIdx + 1 + rubyTagEnd.Length, "\n");
                    }
                    else
                    {
                        displayText = displayText.Insert(displayIdx + 1, "\n");
                    }
                    lineIdx--;
                    if (lineIdx >= 0)
                    {
                        newlineIdx = inputLineInfo[lineIdx].lastCharacterIndex;
                    }
                }
                taskIdx--;
            }
            displayIdx--;
        }
        // Rubyタグと矢印を戻す
        var rubyReversed = Regex.Replace(displayText, rubyTagRegex, reverseReplacement);

        convertedText = Regex.Replace(rubyReversed, "⏎", newLineSymbol);
        AfterConvertInputField.text = convertedText;
        MakePreview();
    }