/// <summary> /// Makes the text mesh pixel perfect to the active camera. /// Automatically detects <see cref="tk2dCamera"/> if present /// Otherwise uses Camera.main /// </summary> public void MakePixelPerfect() { float s = 1.0f; tk2dCamera cam = tk2dCamera.CameraForLayer(gameObject.layer); if (cam != null) { if (_fontInst.version < 1) { Debug.LogError("Need to rebuild font."); } float zdist = (transform.position.z - cam.transform.position.z); float textMeshSize = (_fontInst.invOrthoSize * _fontInst.halfTargetHeight); s = cam.GetSizeAtDistance(zdist) * textMeshSize; } else if (Camera.main) { if (Camera.main.orthographic) { s = Camera.main.orthographicSize; } else { float zdist = (transform.position.z - Camera.main.transform.position.z); s = tk2dPixelPerfectHelper.CalculateScaleForPerspectiveCamera(Camera.main.fieldOfView, zdist); } s *= _fontInst.invOrthoSize; } scale = new Vector3(Mathf.Sign(scale.x) * s, Mathf.Sign(scale.y) * s, Mathf.Sign(scale.z) * s); }
/// <summary> /// Makes the sprite pixel perfect to the active camera. /// Automatically detects <see cref="tk2dCamera"/> if present /// Otherwise uses Camera.main /// </summary> public void MakePixelPerfect() { float s = 1.0f; tk2dCamera cam = tk2dCamera.CameraForLayer(gameObject.layer); if (cam != null) { if (Collection.version < 2) { CustomDebug.LogError("Need to rebuild sprite collection."); } float zdist = (transform.position.z - cam.transform.position.z); float spriteSize = (Collection.invOrthoSize * Collection.halfTargetHeight); s = cam.GetSizeAtDistance(zdist) * spriteSize; } else if (Camera.main) { #if UNITY_5 if (Camera.main.orthographic) #else if (Camera.main.isOrthoGraphic) #endif { s = Camera.main.orthographicSize; } else { float zdist = (transform.position.z - Camera.main.transform.position.z); s = tk2dPixelPerfectHelper.CalculateScaleForPerspectiveCamera(Camera.main.fieldOfView, zdist); } s *= Collection.invOrthoSize; } else { CustomDebug.LogError("Main camera not found."); } scale = new Vector3(Mathf.Sign(scale.x) * s, Mathf.Sign(scale.y) * s, Mathf.Sign(scale.z) * s); }
void UpdateTransform() { // Break out if anchor camera is not bound if (AnchorCamera == null) { return; } float pixelScale = 1; // size of one pixel Vector3 position = myTransform.localPosition; // we're ignoring perspective tk2dCameras for now tk2dCamera currentCamera = (AnchorTk2dCamera != null && AnchorTk2dCamera.CameraSettings.projection != tk2dCameraSettings.ProjectionType.Perspective) ? AnchorTk2dCamera : null; Rect rect = new Rect(); if (currentCamera != null) { rect = anchorToNativeBounds ? currentCamera.NativeScreenExtents : currentCamera.ScreenExtents; pixelScale = currentCamera.GetSizeAtDistance(1); } else { rect.Set(0, 0, AnchorCamera.pixelWidth, AnchorCamera.pixelHeight); } float y_bot = rect.yMin; float y_top = rect.yMax; float y_ctr = (y_bot + y_top) * 0.5f; float x_lhs = rect.xMin; float x_rhs = rect.xMax; float x_ctr = (x_lhs + x_rhs) * 0.5f; Vector3 anchoredPosition = Vector3.zero; switch (AnchorPoint) { case tk2dBaseSprite.Anchor.UpperLeft: anchoredPosition = new Vector3(x_lhs, y_top, position.z); break; case tk2dBaseSprite.Anchor.UpperCenter: anchoredPosition = new Vector3(x_ctr, y_top, position.z); break; case tk2dBaseSprite.Anchor.UpperRight: anchoredPosition = new Vector3(x_rhs, y_top, position.z); break; case tk2dBaseSprite.Anchor.MiddleLeft: anchoredPosition = new Vector3(x_lhs, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.MiddleCenter: anchoredPosition = new Vector3(x_ctr, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.MiddleRight: anchoredPosition = new Vector3(x_rhs, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.LowerLeft: anchoredPosition = new Vector3(x_lhs, y_bot, position.z); break; case tk2dBaseSprite.Anchor.LowerCenter: anchoredPosition = new Vector3(x_ctr, y_bot, position.z); break; case tk2dBaseSprite.Anchor.LowerRight: anchoredPosition = new Vector3(x_rhs, y_bot, position.z); break; } Vector3 screenAnchoredPosition = anchoredPosition + new Vector3(pixelScale * offset.x, pixelScale * offset.y, 0); if (currentCamera == null) // not a tk2dCamera, we need to transform { Vector3 worldAnchoredPosition = AnchorCamera.ScreenToWorldPoint(screenAnchoredPosition); if (myTransform.position != worldAnchoredPosition) { myTransform.position = worldAnchoredPosition; } } else { Vector3 oldPosition = myTransform.localPosition; if (oldPosition != screenAnchoredPosition) { myTransform.localPosition = screenAnchoredPosition; } } }
void UpdateTransform() { // Break out if anchor camera is not bound if (AnchorCamera == null) { return; } float pixelScale = 1; // size of one pixel Vector3 position = myTransform.localPosition; // we're ignoring perspective tk2dCameras for now tk2dCamera = (AnchorTk2dCamera != null && AnchorTk2dCamera.CameraSettings.projection != tk2dCameraSettings.ProjectionType.Perspective) ? AnchorTk2dCamera : null; Rect rect = new Rect(); if (tk2dCamera != null) { rect = anchorToNativeBounds ? tk2dCamera.NativeScreenExtents : tk2dCamera.ScreenExtents; pixelScale = tk2dCamera.GetSizeAtDistance( 1 ); } else { rect.Set(0, 0, AnchorCamera.pixelWidth, AnchorCamera.pixelHeight); } float y_bot = rect.yMin; float y_top = rect.yMax; float y_ctr = (y_bot + y_top) * 0.5f; float x_lhs = rect.xMin; float x_rhs = rect.xMax; float x_ctr = (x_lhs + x_rhs) * 0.5f; Vector3 anchoredPosition = Vector3.zero; switch (AnchorPoint) { case tk2dBaseSprite.Anchor.UpperLeft: anchoredPosition = new Vector3(x_lhs, y_top, position.z); break; case tk2dBaseSprite.Anchor.UpperCenter: anchoredPosition = new Vector3(x_ctr, y_top, position.z); break; case tk2dBaseSprite.Anchor.UpperRight: anchoredPosition = new Vector3(x_rhs, y_top, position.z); break; case tk2dBaseSprite.Anchor.MiddleLeft: anchoredPosition = new Vector3(x_lhs, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.MiddleCenter: anchoredPosition = new Vector3(x_ctr, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.MiddleRight: anchoredPosition = new Vector3(x_rhs, y_ctr, position.z); break; case tk2dBaseSprite.Anchor.LowerLeft: anchoredPosition = new Vector3(x_lhs, y_bot, position.z); break; case tk2dBaseSprite.Anchor.LowerCenter: anchoredPosition = new Vector3(x_ctr, y_bot, position.z); break; case tk2dBaseSprite.Anchor.LowerRight: anchoredPosition = new Vector3(x_rhs, y_bot, position.z); break; } Vector3 screenAnchoredPosition = anchoredPosition + new Vector3(pixelScale * offset.x, pixelScale * offset.y, 0); if (tk2dCamera == null) { // not a tk2dCamera, we need to transform Vector3 worldAnchoredPosition = AnchorCamera.ScreenToWorldPoint( screenAnchoredPosition ); if (myTransform.position != worldAnchoredPosition) { myTransform.position = worldAnchoredPosition; } } else { Vector3 oldPosition = myTransform.localPosition; if (oldPosition != screenAnchoredPosition) { myTransform.localPosition = screenAnchoredPosition; } } }