TIL

2024.2.2

새벽이슬방울 2024. 2. 2. 21:03

으어어어

강의 듣는데 계속 한 개씩 빼먹거나 잘못누르거나 그래서 생각보다 엄청 늦어져서 다 못끝냈습니다.

제대로만 했으면 정말 다 끝내는건데..

근데 마지막까지도 무슨 문제가 자꾸 생겨나네요.. 더 만들기 무섭게 ㄷㄷ

 

계속 2D에 대해서 만들었다면 이번 것은 3D 입니다.

만들면서 보니깐 요즘 핫한 그 게임 생각나더라구요.. 그건 3인칭이긴한데.. ㅎ

 

완강을 한 것도 아니고 지금 완벽히 이해했어! 도 아니기때문에 강의를 듣다가 이건 개인 프로젝트할 때나 나중에 게임만들 때 쓰면 좋을 것 같은 걸 골라서 적어보도록 하겠습니다.


 

1. UI Image 크기 조절

Fill Method와 Fill Origin을 잘 설정해준다면 왼쪽에서 오른쪽으로 HP가 채워지거나 반대로 깍이거나를 쉽게 만들 수 있습니다.

단, Fill Amount의 최대가 1이므로 현재 체력 / 최대 체력 을 해줘서 설정해줘야합니다.

 


 

2. GetComponent +@

component를 가져오기 위해서는 GetComponent를 이용해줍니다. 더 나아가서 TryGetComponent<>(out )을 사용해준다면 component가 있다면 out에 저장해주면서 true를 반환하고 없다면 false를 반환합니다.

Parse 와 TryParse 랑 비슷하다고 느껴집니다.

 


 

3. Light

3D에만 있는 기능입니다. 빛이 어느 방향으로 빛추면 어디는 좀 더 어둡고 어디는 좀 더 밝고 가 가능하기도 하며, 빛의 색을 변화시킬 수 있기 때문에 더 어둡게, 더 밝게도 가능하게 해줍니다.

 

원을 1/4로 나눠서 가장 위에는 태양이 가장 높게 올라가는 낮이고 가장 아래는 태양이 가장 아래에 있는 자정이라고 생각하면 좋습니다. 따라서 달은 그 반대로 태양이 가장 높은 위치에서는 가장 낮은 위치에 있고 태양이 가장 낮은 곳에 있으면 달이 가장 높은.. 그렇다고 생각하면..

 

0.25일 때 태양이 가장 높은 위치이고 0.75일 때 달이 가장 높은 위치입니다.

그것을 이용해서 해와 달을 만들고 둘이 서로 반대편에서 시계 방향으로 돈다고 보면 됩니다.

transform.eulerAngles = (time - (lightSource == sun ? 0.25f : 0.75f)) * noon * 4.0f;
//noon은 정오

 


 

4. 아이템 보여주기

가장 신기했던 부분입니다. 바라보는 아이템이 있다면 UI로 아이템의 정보를 뜨게 해주는 방법입니다.

Ray를 사용해서 해주는 방법인데 생각해보면 Ray에 대해 적은 적은 없는 것 같습니다.

Ray에 대해서 깔끔하게 아는 것도 아니라서 딱히 적은 것은 없는 것 같은데.. 

쉽게 생각하면 눈에서 직선의 광선이 나와서 광선에서 부딪히는 것들의 정보를 가져오는? 이라고만 기억하고 있습니다.

그래서 Ray는 보통 눈이 되어주는 3D에서 카메라에 많이 하는 편이고 2D에서는 마우스의 위치라고 볼 수 있습니다.

Raycast는 빔을 쏘는 것이고 

RaycastHit은 빔을 쏘는데 맞는 오브젝트가 있다면 가져오는 것 입니다.

            Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, maxCheckDistance, layerMask))
            {
                if (hit.collider.gameObject != curInteractGameobject)
                {
                    curInteractGameobject = hit.collider.gameObject;
                    curInteractable = hit.collider.GetComponent<IInteractable>();
                    SetPromptText();
                }
            }

 

+ 부딪히는 오브젝트의 정보를 가져오는 부분은 SetPromptText()입니다.

script를 통해 text를 굵게 해줄 수 있는 방법은 <b>text</b> 입니다.

 


 

5. 폰트

Text(MeshPro)를 사용하면 편하긴 하지만 기본 폰트는 한글을 지원하지 않습니다.

그렇기 때문에 폰트를 변경해줘야하는데요.

폰트 중에서도 원하는 값들만 받을 수 있도록 지정해줄 수 있습니다.

 

Window - TextMeshPro - Font Asset Creator

 

Source Font File - 베이스가 될 폰트

Character Set - 사용 가능한 글자들(영어, 한글, 특수문자 등) 설정

Character Sequence - Character Set을 Custom Range로 하게 된다면 나오는 부분

 

32-126,44032-55203,12593-12643,8200-9900

영어 범위 : 32-126

한글 범위 : 44032-55203

한글 자모 : 12593-12643

특수 문자 : 8200-9900

글꼴에 따라 지원하지 않는 특수 문자는 missing

 

이렇게 설정해주면 됩니다.

 

Generate Font Atlas 누르고 다 끝나면 Save 해주면 끝납니다!

 


 

어느정도 초반은 정리가 된 것 같습니다.

가장 중요한 인벤토리 부분부터 적과 싸우는 부분까지는 내일 정리해보겠습니다...

 

아무래도 서바이벌류 게임을 만들다보니깐 이것 저것 생각할게 많아서 너무 양이 많네요 ㅠㅠ