- Home /
UI text vs. moving camera
There is a rectangle (landscape) game space in which the character moves horizontally back and forth between the left and right edge and there are other fixed game items (i.e. they do not move). Both the character and the fixed game items have some UI text displayed next to them. The game is intended to operate in a way that the game space is larger than the actual view the player can see any given moment. The player can see only a portrait oriented smaller window of the game space and as the character moves horizontally the “sliding window” reveals only the actual part of the game space where the character currently is.
The approach to implement this is to have separate canvas and camera for the game space and the “sliding window” respectively. For the canvases Screen Space Camera is used. The “sliding window” effect is achieved by moving the camera according to the character movement. Everything works except one thing: for the moving camera the UI text can only be seen in Scene view, but not in Game view. The UI text components are the child of the fixed items /character and placed under the game space’s canvas. The Depth value is higher for the moving camera (if it is lower than the game space’s camera then only a fixed view can be seen – some part of the game space – where UI text shown correctly). I guess the problem is that the camera associated with the “sliding window” is separated from the canvas associated with the game space.
How could this be fixed? I have seen proposals when there is a separate camera just for the UI elements (using separate layers and setting the culling mask properly), but I could not apply that approach to my case.
Any help would be appreciated!
Answer by pbdesign · Oct 20, 2017 at 12:05 PM
Found a solution:
Use Text Mesh instead of Text
Use a script to set the sorting layer of the gameobject the Text Mesh belongs high enough:
using UnityEngine; using System.Collections; public class SortingLayerExposer : MonoBehaviour { public string SortingLayerName = "Default"; public int SortingOrder = 0; void Awake () { gameObject.GetComponent<MeshRenderer> ().sortingLayerName = SortingLayerName; gameObject.GetComponent<MeshRenderer> ().sortingOrder = SortingOrder; } }
The tip came from here: link text