블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

- ParticleSystem, Spine, TMP 등 Renderer를 가진 오브젝트들을 NGUI 위에 올리고 Depth를 맞추기 위한 소스

  (NGUI Widget의 Depth 제어 부분을 Renderer를 가진 오브젝트에서도 셋팅되도록 함)

- 출처에서는 ParticleSystem용으로 이름을 지어놨는데 어차피 Renderer를 가지고 있는 것들은 다 되는거라 이름 변경함

 

NGUIRendererWidget.cs
0.00MB

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


[AddComponentMenu("NGUI/UI/NGUI Renderer Widget")]
public class NGUIRendererWidget : UIWidget
{
    protected Renderer m_Renderer;
    protected Material m_Mat;

    public override Material material
    {
        get
        {
            return m_Mat;
        }

        set
        {
            if (m_Mat != value)
            {
                RemoveFromPanel();
                m_Mat = value;
                MarkAsChanged();
            }
        }
    }

    protected override void OnEnable()
    {
        Init();
        base.OnEnable();
    }

    protected void Init()
    {
        if (null == m_Renderer)
        {
            m_Renderer = GetComponent<Renderer>();
        }

        if (null == m_Renderer)
        {
            return;
        }

        if (null == material)
        {
            if (false == Application.isPlaying)
            {
                material = m_Renderer.sharedMaterial;
                m_Renderer.sharedMaterial = material;
            }
            else
            {
                material = m_Renderer.material;
                m_Renderer.material = material;
            }
        }
    }

    private void OnWillRenderObject()
    {
        if (null != drawCall && drawCall.finalRenderQueue != material.renderQueue)
        {
            material.renderQueue = drawCall.finalRenderQueue;
        }

        if (Application.isPlaying == true && m_Renderer.material != material)
        {
            m_Renderer.material = material;
        }
    }

    public override void OnFill(List<Vector3> verts, List<Vector2> uvs, List<Color> cols)
    {
        for (int i = 0; i < 4; i++)
        {
            verts.Add(Vector3.zero);
            uvs.Add(Vector2.zero);
            cols.Add(color);
        }
    }
}

 

[출처] https://tenlie10.tistory.com/169

 

[Unity | 유니티] NGUI와 ParticleSystem간 Depth 조정

ParticleSystem에 해당 스크립트를 추가하고 타 NGUI 컴포넌트처럼 Depth값을 조정하면 된다. UIParticleWidget.cs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33..

tenlie10.tistory.com

 

반응형
Posted by blueasa
, |

텍스트 메쉬 프로에 대한 사용법에 대하여 검색용으로 간략히 적어 놓습니다.

편하게 적다 보니 반말체인 점 양해 부탁드립니다.

---------------------------------------------------------------------------------------------------------

ㅁ 텍스트 메쉬 프로(이하 텍메프)의 설치
  1. 유니티 메뉴의 Window -> Package Manager 에서 받아서 설치한다.





ㅁ 텍메프 생성


  1. 하이라키 뷰에서 마우스 오른쪽 클릭 -> UI -> Text - Text Mesh Pro를 실행한다. 텍메프는 유니티 GUI 기능을 이용하며 이는 캔버스 내부에 사용한다.



ㅁ 폰트 에셋
  텍메프는 폰트 파일(ttf)가 아닌 폰트 파일을 이용해서 만든 폰트 에셋을 사용한다. 폰트 에셋 생성은 다음과 같다. (한글 파일 기준)




1. 유니티 메뉴의 Window -> TextMeshPro -> Font Asset Creator 를 실행한다.

2. Source Font File에 폰트 파일(ttf)를 입력한다.

3. Padding에 글자 간 간격을 입력한다. 4~5 정도가 적당한 듯 하다.

4. Atlas Resolution에서 아틀라스 이미지 파일의 크기를 결정한다. 한글 폰트의 경우 4096 X 4096 정도는 되어야 할 듯 하다.

5. Character Set에서 어떤 방식을 사용할지 결정 할 수가 있다.




주목할 점은 Custom Range, Custom Characters.

- Custom Range 은 폰트의 글자 위치를 이용하여 아틀라스로 만들 글자를 정한다.

- Custom Characters는 특정 원하는 글자를 직접 입력하여 원하는 글자를 추출할 수 있다. "가나다"라고 입력 시 가나다 3글자만 추출한다.

여기서는 Custom Range를 이용하여 모든 글자를 추출한다.

6. Character Sequence에 추출할 글자를 입력한다.

완성형 기본 한글의 경우 44032-55203을 입력한다.

7. Rander Mode를 설정 한다.

 



특정 렌더 모드이 경우 텍메프에서 메테리얼이 비트맵 형식으로 가공된다. 이 경우 아웃라인등 추가적인 효과를 입력하기 어렵다.

이번에는 추가적인 효과를 입력할 수 있는 Distance Field 형식이 필요하기에 SDF32 방식으로 설정한다.

- 특정 렌더 모드의 경우 글자 끝을 둥글게 처리한다. 즉 고딕 폰트를 설정하였는데 돋음체 처럼 끝이 둥근 형태로 나올 수 있다.
- 추후 메테리얼을 직접 Distance field 로 변경할 수 있다. 하지만 이 경우 한글에 아웃라인 등 추가적인 효과가 적용되지 않는 것을 확인하였다.

8. Generate Font Atlas를 클릭하여 굽는다.



굽는다. 시간이 오래 걸린다.




시간이 오래 걸리니 귀여운 고양이를 보자.

귀엽다.





안고도 잔다.

귀엽다.





배고도 잔다.

귀엽다.





귀엽다.



9. 폰트 에셋이 노릇노릇 구워 지면 Save를 눌러 저장하자. 저장하는 걸 잊지 말자.


ㅁ 텍메프에 폰트 에셋 연결


1. 텍메프의 인스팩터 뷰에서 Font Asset 부분에 방금 구워진 폰트 에셋을 추가한다.


2. 한글을 입력해 본다.

잘 나온다.



ㅁ 프리셀



이건 프리셀이다.



ㅁ 메테리얼 프리셋

텍스트 메테리얼 부분을 이용하여 특정 효과를 입력 추가 하여 보자.



폰트에 아웃라인을 추가하였다. 하지만 이때 문제는 같은 메테리얼을 공유하는 모든 텍메프에 효과가 동일 하게 적용된다.

우선 추가로 다른 메테리얼을 추가해 보자.


1. 폰트 에셋의 작은 삼각형 화살표를 열고 메테리얼 파일을 복사한다.  (맥 기준 Alt + D.. 윈도는 컨트롤 디였던가…?)


2. 복제된 메테리얼의 이름을 수정한다. 이때 폰트명은 폰트 에셋의 이름이 반드시 포함되어야 한다.
예 ) 폰트 에셋 명 : "NSquareB" , 추가된 메테리얼 명 "NSquareB Outline"


3. 텍메프의 인스펙터뷰의 Material Preset에서 새로 추가된 메테리얼을 선택 후 원하는 효과를 추가해 보자.

메테리얼을 변경한 텍메프에만 효과가 적용되는 걸 확인할 수 있다.



ㅁ 로컬라이징
한글 외에 일본어 중국어 등이 추가하여 새로운 폰트 에셋을 생성할 경우 앞에서 만든 기존의 폰트 에셋을 사용할 수 없다.

폰트에셋과 이름이 다른 메테리얼을 사용할 수가 없기 때문이다. (메테리얼에 적용된 아틀라스가 다르니... )

아마 로컬라이징을 생각하는 경우 언어별로 폰트에셋을 사용해야 하는데 이 경우에는 테그를 이용하는 게 편할 듯 하다.



1. 텍메프의 Text 부분에 다음과 같은 테그를 입력하여 적용할 수 있다.

폰트 변경 : font="폰트에셋명"
메테리얼 변경 : material="메테리얼명"

2. 테그 잘 안다고 material = "이름" 같이 사이 띄기 넣지 마라. (내가 헤맨 건 절대 아님….)

3. 이때 폰트 에셋과 메테리얼은 Resources 폴더 안에 위치해야 한다.



ㅁ 스타일
사실 저 테그가 게임 내에 들어갈 글귀들과 함께 들어가기에는 좀 길다. 스타일을 이용하여 단축할 수 있다.


1. 프로젝트뷰에서 텍메프 폴더 하단에 Style Sheets폴더 안 Default Style Sheet 파일을 선택 한다.


2. 인스팩터 뷰의 스크롤을 내린 뒤 + 버튼을 클릭한다.

3. 아무런 변화가 없다.

4. 당황하지 말고 Next를 눌러 다음 페이지로 넘기자.

5. 아마 마지막과 같은 내용의 스타일이 하나 더 추가되어 있을 것이다.



6. 원하는 Name을 입력 후 원하는 테그를 입력한다.

7. 저장 버튼을 누른다.

8. 속았다. 저장 버튼은 없다. 자동 저장이다.



9. 6에서 입력한 Name을 스타일 테그로 불러올 경우 정상적으로 동작하는 것을 확인할 수 있다.

(마지막 이미지의 붉은 글씨가 헷갈릴 수 있을 거 같다. 선택된 텍메프 오브젝트는 위의 글씨다.)

 

 


[추가]
하나 더 추가합니다.

로컬라이징 부분에서 한글 영어, 일어, 등 변경 사항이 있을 때 위에는 폰트 에셋과 메테리얼을

테그로 손보는 방식을 생각해 봤는데 더욱더 간단한 방법이 될 수도 있을 거 같아요.

만드신 폰트 에셋을 선택하고 인스팩터 뷰에서 스크롤 쭉 내리시면 위의 이미지와 같은

Fallback Font Assets이라는 부분이 있습니다.

이건 입력한 문자가 폰트에셋에 없으면 다른 폰트 에셋의 문자로 대처할 수 있는 기능이에요.

여기에 한국어 영어 일본어 등 추가 폰트 등을 물려 놓을 경우 별도의 폰트 로컬라이징 필요 없이

바로 자동으로 연결이 되네요.

 

 

[출처]

http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=5297

루트군님

 

유니티 텍스트 메쉬 프로에 대한 사용법 간략 정리

텍스트 메쉬 프로에 대한 사용법에 대하여 검색용으로 간략히 적어 놓습니다.편하게 적다 보니 반말체인 점 양해 부탁드립니다.--------------------------------...

www.gamecodi.com

 

반응형
Posted by blueasa
, |