void Awake() { m_Instance = this; //create and position all our text lines m_NumLines = Mathf.Max(m_NumLines, 1); m_InfoLines = new InfoLine[m_NumLines]; for (int i = 0; i < m_InfoLines.Length; ++i) { m_InfoLines[i] = new InfoLine(); GameObject rLine = (GameObject)Instantiate(m_InfoLinePrefab); rLine.transform.parent = m_RenderablesParent; m_InfoLines[i].m_Line = rLine; m_InfoLines[i].m_TextMesh = rLine.GetComponent <TextMesh>(); m_InfoLines[i].m_Renderer = rLine.GetComponent <Renderer>(); Vector3 vLocalPos = m_BaseLineLocalPositionOffset; vLocalPos.y += m_LineSpacing * (float)i; rLine.transform.localPosition = vLocalPos; rLine.transform.localRotation = Quaternion.identity; } m_LineOperateIndex = m_InfoLines.Length - 1; m_MeshRenderers = m_RenderablesParent.GetComponentsInChildren <Renderer>(); UpdateBackgroundWidth(); SetState(State.Disabled); InputManager.OnSwapControllers += AttachToBrush; #if (UNITY_EDITOR || EXPERIMENTAL_ENABLED) if (Config.IsExperimental) { m_AutosaveIcon.gameObject.SetActive(true); } #endif }
private void AddNewLineImpl(string sText, bool bNotify = false) { string remainingText = ""; //scoot all the lines around for (int i = 0; i < m_InfoLines.Length; ++i) { Vector3 vLocalPos = m_InfoLines[i].m_Line.transform.localPosition; vLocalPos.y += m_LineSpacing; m_InfoLines[i].m_Line.transform.localPosition = vLocalPos; } //set the new line's text InfoLine operateLine = m_InfoLines[m_LineOperateIndex]; operateLine.m_Line.transform.localPosition = m_BaseLineLocalPositionOffset; operateLine.m_TextMesh.text = sText; operateLine.m_Renderer.material.color = bNotify ? m_NotificationTextColor : m_StandardTextColor; operateLine.m_LineWidth = TextMeasureScript.GetTextWidth(operateLine.m_TextMesh); // Split long lines - cheap and nasty, as it assumes that all characters in a string are the // same length, but as the console widens to accommodate its lines anyway, I don't think it // matters. if (operateLine.m_LineWidth > m_MaxLineWidth) { float portion = m_MaxLineWidth / operateLine.m_LineWidth; int splitPoint = Mathf.FloorToInt(sText.Length * portion); // Look back a few characters to see if there's a better character to split on for (int i = 0; (i > -kSplitSearchMagnitude) && ((i + splitPoint) > 0); i--) { if (!System.Char.IsLetter(sText[i + splitPoint])) { splitPoint += i; break; } } remainingText = sText.Substring(splitPoint).TrimStart(); operateLine.m_TextMesh.text = sText.Substring(0, splitPoint); operateLine.m_LineWidth = TextMeasureScript.GetTextWidth(operateLine.m_TextMesh); } //update our operating index --m_LineOperateIndex; if (m_LineOperateIndex < 0) { m_LineOperateIndex += m_InfoLines.Length; } UpdateBackgroundWidth(); //reset our timer if (bNotify) { m_NotificationDisplayTimer = m_NotificationDisplayDuration; m_Notification.Play(); } if (remainingText.Length > 0) { // TODO: remove the tail-recursion AddNewLineImpl(remainingText, false); } }