본문 바로가기

GAME

[Unity]UI Setting

728x90

UI : User Interface 유저가 보는 화면? 같은 느낌

 

이제부터 본격적으로 게임에 필요한 요소인 UI를 설정해봅시다

 

1. 캔버스 (Canvas)

Hierarchy ->오른쪽 마우스 -> UI -> Canvas

뭔가 흰색이 생겼네요

화면 윗부분에 2D를 눌러봅시다

캔버스가 설정되었습니다

이게 바로 스크린인, 게임이 표시되는 화면, 해상도로 크기를 결정합니다.

 

2. 스크린

게임이 표시되는 화면으로 해상도로 크기를 결정합니다.

유니티에는 2개의 좌표계가 있습니다

좌표계에 대해 아시나요..? 보통 직교 좌표계 / 구면 좌표계 / 원주 좌표계라는 말 들어보셨을 텐데 

좌표면을 표현하는 서로 다른 방법..? 의 느낌입니다. 저희가 지금 게임을 보는 view창도 직교 좌표계로 진행하고 있었죠

 

유니티에는 2개의 좌표계가 있다고 했는데, 바로 screen과 world입니다.

world : 카메라 (o)

world

screen : 카메라 (x) , 게임상 보이는 화면으로 마우스 커서도 스크린 좌표계에 해당 

screen

 

골드 메탈님은 이렇게 표현하셨네요. 이해를 매우 돕는 이미지인 것 같습니다.

https://www.youtube.com/watch?v=k4YUJy-otDs&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2&index=13

 

 

이제 각각 어떤 UI가 있는지 대해 자세히 알아보도록 합시다

 

 

1.Text UI 

문자열을 표시하는 UI

생성한 캔버스 오른쪽 클릭 -> UI -> Text 

 

Text component를 보시면 포토샵이나 워드등을 사용해보셨으면 익숙하실 것입니다

그런데 여기서 폰트를 적용하려면 저작권에 유의하셔야 합니다 특히 상업용 게임을 만드실 경우..(폰트 라이선스 확인)

Deliver의 민족에서 나온 폰트를 주로 사용하신다고 하네요

다른 것들을 아실 테고

Horizontal Overflow를 Overflow로 바꿔주시면, 쓴 문구가 칸을 초과해도 보이게 해 줍니다 -> 그 대신 UI가 깨지는 경우가 있기 때문에 그냥 Wrap을 쓰시는 게 안전합니다

Line Spacing : 행간 거리 (폰트 사이즈만큼이 1)

 

 

2. 이미지 UI

이미지를 표시하는 UI

생성한 캔버스 오른쪽 클릭 -> UI -> Image

이렇게 하면 하얀 네모 모양으로 디폴트 이미지가 나오는데요 원하는 그림을 넣어봅시다

 

일단 이미지를 project 부분으로 불러와주시고요

Project창이 너무 복잡해서 폴더로 정리해주었습니다

이렇게 불러와진 이미지는 Texture라고 부른다고 하니 그렇게 폴더명을 지정해주었습니다.

Texture Type을 Default에서 Sprite(2D and UI)로 변경해주셔야 합니다.

그 후 Apply를 누르고

 

이미지를 Source Image로 드래그해주시면 이제 텍스처가 이미지 UI에 적용됩니다

 

정사각형 모양으로 적용되어서 돼지네요

이미지의 크기와 비율이 맞지 않아서라는데 이제 맞춰보도록 합시다

 

Image component에서

Preserve Aspect에 체크하면 비율을 맞춰줍니다

Set Native size를 클릭해주면, 원래 그림파일과 사이즈를 동일하게 해 줍니다

사이즈가 원래 160*180이었나 봅니다 (너무 오래전에 그린 그림이라 사이즈를 까먹었네요)

 

Image Type

Simple/Sliced/Tiled/Filled

심플은 기본이고요, Sliced 다음(Button UI)에 가서 설명하도록 합시다

Tiled는 비율을 동일하게 해서 바둑판식 배열, 

윽 징그러 슈퍼맨으로 할껄 그린랜턴 레고 귀엽긴한데... 제가 그려서 그런지 왤캐 형광 풍댕이 같고 좀 그렇네요

 

Filled

Filled Amount를 조절하면 우리의 그림이 먹히네요...

Filled Method를 조절하면 원모 양이 아닌 세로로 먹기 뭐 가로로 먹기 한번 해 보시길 바랍니다

 

쿨타임 표현에 유용합니다

이미지를 2개 만들어 겹친 후 하나를 조금 검게 표현해서 Filled를 사용한 것입니다

쿨타임 표현이라는 게 무슨 의미인지 게임을 해보신 분들은 어떤 말씀인지 아시겠죠?

 

참고로

*캔버스 내에서 아래쪽에 쓰여있을수록 위쪽에 존재합니다 (캔버스에서 가까울수록 먼저 그려지기 때문에 아래쪽에 존재)

 

 

3. Button UI

생성한 캔버스 오른쪽 클릭 -> UI -> Button

Button은 Text를 가지고 있네요. 글씨를 마음대로 바꿔봅시다

 

아까 넘어갔던 Image 컴포넌트의 Image Type : Sliced를 설명하고 넘어가겠습니다.

더보기

버튼의 크기를 160->100으로 줄여보면

버튼이 통째로 줄어드는 것이 아니고 정말 딱 버튼 뒷 배경 네모 모양만 줄어든 것을 볼 수 있는데, 

이것은 Sliced가 크기 조절 시 외부 경계선의 크기만 조절되고 내부는 동일하게 채우는 효과를 가지고 있어서 그렇습니다.

흰색 네모에 stroke 검은색인 이미지인데, 외부 겉 선만 크기의 영향을 받고 내부는 그냥 흰색으로 동일하게 채운 것입니다

Fill center를 체크 해제해보시면

구멍이 뚫리는데 남아있는 겉 부분만 겉 선이라고 유니티가 인식하고 있고 내부는 크기를 어떻게 조절하든 동일하게 채워지는 것입니다

 

그래서 Sliced는 UI에서 팝업창을 만들거나, 자유자재 크기로 이미지를 구현할 때 이용합니다

 

 

이제 버튼의 컴포넌트를 살펴봅시다

Button component 

Interactable : 버튼이 활성화되어있는가(체크)? 아니면 비활성화 버튼인가(체크 해제)? 


Transition : 어떻게 반응할 것인가? 
                  - Color Tint
                   (Normal) 가만히 있을 때 / (Hightlighted) 마우스가 올라가 있을 때 / (Pressed) 버튼이 클릭되었을 때 / (Disabled) 버튼이 비활성화되었을 때


Navigation : 웹에서 보시면 로그인할 때, Tab을 누르면 아이 디치는 곳-> 비밀번호 치는 곳으로 자동으로 넘어가는 것을 볼 수 있는데, 그거랑 유사한 기능입니다. Tab을 누르면 다음 버튼으로 넘어가는? 기능


Onclick() 함수 : 버튼 클릭 시 호출되는 이벤트 함수 (밑에서 설명하도록 한다)

 

Onclick() 함수! 가장 핵심!

버튼을 클릭했을 때 어떠한 기능(함수/코드)이 실행되나

처음에는 Empty인데, 

+를 이용해서 스크립트를 추가할 수 있습니다 

전 강의? 에서 사용했던 MyBall스크립트를 드래그해서 넣어주었습니다

스크립트 안에 새로운 함수를 꼭 public으로 설정하여 어떤 액션을 취할지 코딩해주고 

 

이제 No function부분을 자기가 만든 함수로 바꾸면 해당 기능이 수행되는데... 저는 안되더라고요

 

동기에게 질문해서 해결해봤는데

Button UI는 엥..? 그래서 저 함수 누가 하는 거..?? 누구한테 적용하면 되는 건데 라는 상태라고 합니다 

그래서 Onclick함수에 MyBall스크립트가 아닌 MainBall오브젝트 자체를 드래그해주었습니다 그랬더니 되더라고요 

저는 MyBall스크립트에서 Jump함수를 버튼에 적용시켰습니다

 

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

public class MyBall : MonoBehaviour
{

    Rigidbody rigid; 


    // Start is called before the first frame update
    void Start()
    {
        rigid = GetComponent<Rigidbody>(); //초기화 
        



    }

    // Update is called once per frame
    void FixedUpdate()
    {   

        //2. 힘을 가하기 적용해서 물체 게임모드 


        float horizon = Input.GetAxisRaw("Horizontal")*0.5f;
        float vertic = Input.GetAxisRaw("Vertical")*0.5f;

        if(Input.GetButtonDown("Jump")){
        rigid.AddForce(Vector3.up*5, ForceMode.Impulse);
        }

        Vector3 vec = new Vector3(horizon,0,vertic);

        rigid.AddForce(vec, ForceMode.Impulse);
        
        
    }

    private void OnTriggerStay(Collider other) {

        if(other.name == "Cube"){
            rigid.AddForce(Vector3.up*2,ForceMode.Impulse);
        }
    }


    public void Jump(){
        
        rigid.AddForce(Vector3.up*20,ForceMode.Impulse);
    }

    

}

마지막 줄에 퍼블릭으로 점프 함수를 추가해서 버튼을 누르면 점프 함수가 실행되는 모습을 볼 수 있습니다.

 

 

앵커 (Anchor) 

매우 중요한 친구입니다 오늘 중에 가장 중요

UI화면에 제가 배치한 UI들이 정확한 자리에서 이동하지 않고 항상 어떤 기기로 접근해도 

그 자리에 존재해야 하는데 그것을 담당하는 부분입니다

아 뭐야진짜 더럽네요 제가 디자인 감각이 없어서

 

여태까지 모든 오브젝트들은 Transform을 가지고 있었는데

UI 들은 특이하게도 Rect Transform이라는 것을 가집니다

UI트랜스폼이라고 생각하시면 됩니다  

다른 오브젝트들은 그냥 world내에서 움직이지만

UI는 유저에게 보이는 것이기 때문에 무엇으로 접근하느냐에 따라 전부 다르게 보일 수 있어 그것을 방지하고자

기준을 Anchor라고 하는 친구로 잡고, 그것을 기준으로 배치합니다

마치 원주 좌표계가 뭐 원의 반지름 어쩌고 벌써 까먹었네 이런 친구 들을 기준으로 배치되는 것처럼 말이죠 

 

저기 네모난 박스를 누르게 되면 Anchor Preset이라는 게 나오는데

Anchor를 어디에 배치할지를 결정하는 것입니다. 

 

Anchor이 뭐냐면, 저는 지금 텍스트 유아이를 선택했는데

텍스트 유아이에게는 중심이 이것입니다

저기 충전하기 버튼 위에 있는 이상한 모양의 저것이 바로 텍스트 유아이의 중심입니다

중심으로부터 X축은 PosX, Y축은 PosY만큼 텍스트 UI가 떨어져 있다는 의미입니다.

 

이제 저 텍스트를 왼쪽 상단에 고정시켜봅시다

Anchor Preset을 지금 top/left로 했더니 Anchor가 저쪽으로 이동했습니다

이상태에서 shift를 누르면 파란 점이 나오는데 

파란 점은 : 컴포넌트에서의 기준점 

이 중앙에 있는 파란 링 말하는 것 같습니다 

이 파란 링도 left/top에 맞춰준 후 

Pos X Pos Y를 0,0으로 바꿔줍시다  ( 단축키 ALT를 누르면 여백 없이 자동으로 맞춰줍니다 )  

이렇게 되면 딱 맞게 되는데 여백을 조금 주고 싶으면 0,0이 아닌 5, -5 정도로 주시면 됩니다

 

이렇게 되면 항상 저 자리에서 뜨게 됩니다. 게임창을 옮겨도 저 자리에 뜨게 됩니다 

나머지도 해야 하는데 배고프니까 그냥 그린랜턴까지만 해주죠 뭐

화면을 움직여도 저 친구들은 저 사이드에만 보이게 됩니다 

 

 

<참고자료>

youtu.be/k4 YUJy-otDs

 

 

728x90

'GAME' 카테고리의 다른 글

[Unity]기초 3D게임만들기 - 2  (0) 2020.07.30
[Unity]기초 3D게임 만들기-1  (4) 2020.07.30
[Unity]오브젝트 컨트롤  (0) 2020.07.17
[Unity]입력처리와 오브젝트 이동  (0) 2020.07.15
[Unity]C#기초와 유니티LIFE CYCLE  (0) 2020.07.10