public void Show(string message, RectTransform rectTransform, TooltipAnchorPosition anchorPosition) { if (rectTransform == null) { return; } resizerText.text = message; switch (State) { case TooltipState.HIDDEN: State = TooltipState.WAITING_FOR_DISPLAY; break; case TooltipState.FADING_OUT: State = TooltipState.FADING_IN; break; } StartCoroutine(waitForAndOfAFrameAndReposition(rectTransform, anchorPosition)); }
public void ShowFromScene(string message, Vector3 sceneWorldPosition, TooltipAnchorPosition anchorPosition) { helperTransform.position = mainCamera.WorldToScreenPoint(sceneWorldPosition); Show(message, helperTransform, anchorPosition); }
/// <summary> /// The layouter has to resize according to new inserted text - /// need to wait for end of a frame to correctly reposition. /// </summary> /// <param name="parentRectTransform"></param> /// <param name="anchorPosition"></param> /// <returns></returns> IEnumerator waitForAndOfAFrameAndReposition(RectTransform parentRectTransform, TooltipAnchorPosition anchorPosition) { yield return(new WaitForEndOfFrame()); float parentWidth; float parentHeight; Vector3 parentPosOffset = getRectTransformOffsetToCenter(parentRectTransform, out parentHeight, out parentWidth); //offset from pos to calculate center switch (anchorPosition) { case TooltipAnchorPosition.CENTER: resizerTransform.pivot = new Vector2(0.5f, 0.5f); break; case TooltipAnchorPosition.DOWN: resizerTransform.pivot = new Vector2(0.5f, 1f); parentPosOffset.y -= (parentHeight / 2f + offsetFromParent); break; case TooltipAnchorPosition.UP: resizerTransform.pivot = new Vector2(0.5f, 0f); parentPosOffset.y += (parentHeight / 2f + offsetFromParent); break; case TooltipAnchorPosition.LEFT: resizerTransform.pivot = new Vector2(1f, 0.5f); parentPosOffset.x -= (parentWidth / 2f + offsetFromParent); break; case TooltipAnchorPosition.RIGHT: resizerTransform.pivot = new Vector2(0f, 0.5f); parentPosOffset.x += (parentWidth / 2f + offsetFromParent); break; } Vector3 targetPos = parentRectTransform.position + parentPosOffset; resizerTransform.position = parentRectTransform.position + parentPosOffset; float width; float height; Vector3 currentCenter = getRectTransformOffsetToCenter(resizerTransform, out height, out width); currentCenter = targetPos + currentCenter; float innerFrameWidth = resizerInnerFrame.sizeDelta.x; float innerFrameHeight = resizerInnerFrame.sizeDelta.y; //rect sides positions float left = currentCenter.x - (innerFrameWidth / 2f); float right = currentCenter.x + (innerFrameWidth / 2f); float up = currentCenter.y + (innerFrameHeight / 2f); float down = currentCenter.y - (innerFrameHeight / 2f); Vector3 offset = new Vector3(); //the offset that rect must be moved to fit into a screen if (left < 0) { offset.x = -left; } if (right > Screen.width) { offset.x = Screen.width - right; } if (up > Screen.height) { offset.y = Screen.height - up; } if (down < 0) { offset.y = -down; } //float innerFrameWidth = resizerInnerFrame.sizeDelta.x; //float innerFrameHeight = resizerInnerFrame.sizeDelta.y; Vector2 sizeDiff = new Vector2(width - innerFrameWidth, height - innerFrameHeight); switch (anchorPosition) { case TooltipAnchorPosition.CENTER: break; case TooltipAnchorPosition.DOWN: offset.y += sizeDiff.y / 2f; break; case TooltipAnchorPosition.UP: offset.y -= sizeDiff.y / 2f; break; case TooltipAnchorPosition.LEFT: offset.x += sizeDiff.x / 2f; break; case TooltipAnchorPosition.RIGHT: offset.x -= sizeDiff.x / 2f; break; } resizerTransform.position = resizerTransform.position + offset; RectTransform thisRectTransform = (RectTransform)transform; thisRectTransform.pivot = resizerTransform.pivot; thisRectTransform.position = resizerTransform.position; thisText.text = resizerText.text; }