TextMesh를 표현하는 GameObject에 아래 script를 부착하면 textoutline이 생긴다.
using UnityEngine; using System.Collections; public class TextOutline : MonoBehaviour { //두께 설정 public float pixelSize = 1; public Color outlineColor = Color.black; //해상도에 따라 pixel size를 조정할지 결정 public bool resolutionDependant = false; //설정된 Resolution보다 클 경우 pixel size 두 배로 설정 public int doubleResolution = 1024; private TextMesh textMesh; private MeshRenderer meshRenderer; private bool isDead = false; // Use this for initialization void Start () { isDead = false; textMesh = GetComponent<TextMesh>(); meshRenderer = GetComponent<MeshRenderer>(); for(int i=0;i<8; i++) { GameObject outline = new GameObject("outline", typeof(TextMesh)); outline.transform.parent = transform; outline.transform.localScale = new Vector3(1, 1, 1); MeshRenderer otherMeshRenderer = outline.GetComponent<MeshRenderer>(); otherMeshRenderer.material = new Material(meshRenderer.material); otherMeshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; otherMeshRenderer.receiveShadows = false; otherMeshRenderer.sortingLayerID = meshRenderer.sortingLayerID; otherMeshRenderer.sortingLayerName = meshRenderer.sortingLayerName; } } void LateUpdate() { if (isDead) return; //현재 원본 Text의 월드 좌표를 스크린 포인트로 맵핑합니다. Vector3 screenPoint = Camera.main.WorldToScreenPoint(transform.position); outlineColor.a = textMesh.color.a * textMesh.color.a; //복제된 TextMesh 옵션 설정 for(int i=0;i<transform.childCount;i++) { //원본으로부터 복제된 자식(child)들을 불러옵니다. TextMesh other = transform.GetChild(i).GetComponent<TextMesh>(); other.color = outlineColor; other.text = textMesh.text; other.alignment = textMesh.alignment; other.anchor = textMesh.anchor; other.characterSize = textMesh.characterSize; other.font = textMesh.font; other.fontSize = textMesh.fontSize; other.fontStyle = textMesh.fontStyle; other.richText = textMesh.richText; other.tabSize = textMesh.tabSize; other.lineSpacing = textMesh.lineSpacing; other.offsetZ = textMesh.offsetZ; //설정된 해상도(doubleResolution)보다 큰 디바이스에서 실행될 경우 //pixelSize를 두배로 합니다. bool doublePixel = resolutionDependant && (Screen.width > doubleResolution || Screen.height > doubleResolution); Vector3 pixelOffset = GetOffset(i) * (doublePixel ? 2.0f * pixelSize : pixelSize); Vector3 worldPoint = Camera.main.ScreenToWorldPoint(screenPoint + pixelOffset); other.transform.position = worldPoint; //레이어 오더 MeshRenderer otherMeshRenderer = transform.GetChild(i).GetComponent<MeshRenderer>(); otherMeshRenderer.sortingLayerID = meshRenderer.sortingLayerID; otherMeshRenderer.sortingLayerName = meshRenderer.sortingLayerName; } } public void dead() { //원할 경우 복제들을 파괴합니다. isDead = true; for(int i=0;i<transform.childCount;i++) { GameObject other = transform.GetChild(i).gameObject; Destroy(other); } Destroy(this); } //복제된 TextMesh들의 배치정보 Vector3 GetOffset(int i) { switch(i % 8) { case 0: return new Vector3(0, 1, 0); case 1: return new Vector3(1, 1, 0); case 2: return new Vector3(1, 0, 0); case 3: return new Vector3(1, -1, 0); case 4: return new Vector3(0, -1, 0); case 5: return new Vector3(-1, -1, 0); case 6: return new Vector3(-1, 0, 0); case 7: return new Vector3(-1, 1, 0); default: return Vector3.zero; } } // Update is called once per frame void Update () { } }
'Unity' 카테고리의 다른 글
파티클시스템(Particle System) (0) | 2016.03.02 |
---|---|
게임에셋(그래픽) 찾기 사이트 (0) | 2016.02.29 |
UI – 폰트 (0) | 2016.02.23 |
메카님애니메이션 - Has Exit Time (0) | 2016.02.21 |
iTween (0) | 2016.02.15 |