Unity Chapter 10-3. UGUI : 인터랙션 컴포넌트
카테고리: Unity Lesson 1
태그: Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 10. UGUI
🔔 UI 인터랙션 컴포넌트
키보드나 마우스, 터치 등의 입력을 감지하여 거기에 맞는 대응을 해주는 UI다.
Selectable 클래스
모든 인터랙션 컴포넌트들은
Selectable
클래스를 상속받아 만들어진다. 즉, 인터랙션 컴포넌트들은Selectable
클래스있는 기능들을 공통적으로 가지고 있다.
- 인터랙션 컴포넌트들은 스스로 그래픽을 그리지 않는다.
- 이미지 컴포넌트나 텍스트 컴포넌트가 붙어있는 것을 볼 수 있는데 인터랙션 컴포넌트들은 비주얼 컴포넌트로 구현되며 비주얼 컴포넌트들을 제어한다.
- 인터랙션 컴포넌트의 비주얼적인 부분을 변경하고자 한다면 이미지, 텍스트 컴포넌트를 건드려야 한다.
인터랙션 컴포넌트의 공통적인 필드
Selectable
클래스의 기능들. 버튼, 슬라이더 등등 인터랙션 컴포넌트들은 다음과 같은 필드들을 공통적으로 가진다.
- Interactable
- : 체크 해제 되어 있으면 동작하지 않게 된다. 터치도 안되고 해당 UI는 Navigate도 되지 않음.
- Transition
- 유저들이 해당 UI를 터치했을 때나 해당 UI에 머물시 그에 대한 피드백의 시각적인 효과 설정
- Color Tint : 해당 UI의 색깔을 바꿔서 보여준다.
- Normal Color 평소 색깔, Highlighted Color 유저가 터치했을때 색깔
- Sprite Swap : 해당 UI의 Sprite(그림)를 바꿔서 보여준다.
- Animation : 해당 UI에서 어떤 Animation을 발생시킨다.
- Navigation
- Visualize를 눌러주면 Scene창에서 노란 화살표로 나타나 인터랙션 UI들간에 방향을 개발자가 시각적으로 볼 수 있다.
- 키보드 방향키로 각 UI 요소들을 탐색할 때 어느 방향으로 이동할지를 볼 수 있다.
- Horizontal로 설정된 경우는 ←→에 반응하고
- Vertical인 경우는 ↑↓에 따라 움직인다.
- Automatic은 자동으로 적당하게 움직인다.
- Explicit의 경우는 키보드 방향별로, 어떠 버턴으로 움직일 지 지정할 수 있다.
- Visualize를 눌러주면 Scene창에서 노란 화살표로 나타나 인터랙션 UI들간에 방향을 개발자가 시각적으로 볼 수 있다.
EventSystem
에서 First Selected에Selectable
클래스를 상속받는 인터랙션 컴포넌트가 달린 UI 요소를 드래그 앤 드롭해주면 게임 시작시 이 UI 요소가 선택된 채로 시작된다.
Button
- On Click()
- 유니티 이벤트
- 버튼이 클릭 되는 이벤트가 발생했을 때, 자동으로 실행시켜주는 컴포넌트.
버튼을 눌렀을 때, 큐브 오브젝트의 색깔이 변경되게 구현해보자.
- 큐브 오브젝트에 📜ColorChange.cs 스크립트를 붙여준다
📜ColorChange.cs
- 자기 자신의 색깔을 랜덤한 색상으로 변경한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorChange : MonoBehaviour
{
public void ChangeColor()
{
GetComponent<Renderer>().material.color = Random.ColorHSV();
}
}
- 이 ChangeColor()함수를 버튼이 클릭될 때 실행시켜주면 된다.
- 큐브 오브젝트를 드래그 앤 드롭 해준다.
꼭 스크립트에 있는 함수가 아니더라도 GameObject 등등 모든 게임 오브젝트들이 상속받아 기본적으로 내장되있는 함수들도 발동시킬 수 있다.
- Directional Light 기본 오브젝트를 드래그 앤 드롭하여 GameObject의 SetActive()을 선택해준 후 체크를 해제하면
- 버튼이 클릭될 때 화면이 어두워질 것이다. Directional Light 오브젝트가 꺼져서!
Toggle
Toggle
: 껏다 켰다 할 수 있는 체크 박스
- Is On
- 토글을 체크했을때 이 변수도 체크된다.
- C# 스크립트를 통하여 이 변수의 값(bool)을 직접 변경할 수도 있다.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // ⭐⭐ public class ColorChange : MonoBehaviour { public Toggle toggle; // ⭐⭐ void Start() { Debug.Log(toggle.isOn); // ⭐⭐ } }
- isOn 슬롯에 토글 UI를 드래그 앤 드롭해주어야 한다.
- On Value Changed
- 유니티 이벤트
- 토글을 체크했을때, 혹은 체크하지 않았을때 발동시킬 함수들을 설정할 수 있다.
- 단, Boolean 타입의 인수를 받는 함수여야한다.
- 토글이 체크되었는지 안되었는지 정보를 받아 실행되야 하는 함수들이 등록되기 때문에
- 유니티 이벤트
📜ColorChange.cs
- 함수가 bool 인수를 받도록 변경하였다.
- 토글이 체크되있으면 랜덤한 컬러로, 체크 해제되어 있으면 하얀색 컬러로 변경
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorChange : MonoBehaviour
{
public void ChangeColor(bool isOn)
{
if(isOn)
GetComponent<Renderer>().material.color = Random.ColorHSV();
else
GetComponent<Renderer>().material.color = Color.white;
}
}
- On Value Changed
- 큐브 오브젝트를 드래그 앤 드롭 해준다.
- Dynamic bool
- 유니티 이벤트가 입력 값(bool)을 전달할 수 있는 경우
- 게임 실행 상에서 자동으로 입력 값이 들어온다.
- 예를들어 SetActive 같은 함수가 대표적으로 Dynamic 하게 인수를 받는데 체크 박스를 해제하면 SetActive에 자동으로 false가 들어와 게임 오브젝트도 게임창에서 사라지게 된다.
- Dynamic bool을 선택했을 때 입력필드가 따로 없는 것을 볼 수 있다.
- Static bool
- 개발자가 직접 입력 값(bool)을 미리 조정 하는 경우.
- 따라서 따로 입력(체크) 필드가 있다.
- 개발자가 직접 게임실행전에 미리 따로 체크하고 체크 해제하여 입력값(Bool)을 주게 된다.
- Dynamic bool
- ⭐함수 선택시 Dynamic bool에 있는 ColorChange를 선택해준다.
- 게임 실행전 개발자가 미리 bool입력을 주는 것이 아닌 게임 실행 중에 토글의 체크 변화에 따라서 bool입력을 받을 것이기 때문에
- 큐브 오브젝트를 드래그 앤 드롭 해준다.
Toggle Group 컴포넌트
Toggle Group 컴포넌트는 여러개의 토글 중 하나만 선택되게 하며 토글 하나가 선택되면 다른 토글들은 해제되도록 해준다.
UI - Panel
을 만든 후Penel
에 그룹으로 만들 여러개의Toggle들
을 자식으로 붙여준다.Panel
에 Toggle Group 컴포넌트를 검색하여 붙여준다.- 이 패널을 토글들의 그룹으로 지정해준다.
- 각각의
Toggle
들의 Toggle 컴포넌트의 Group에Penel
을 드래그 앤 드롭 해준다.- 자신(토글)이 속한 그룹을 지정해 준 것.
- Allow Switch Off를 체크하면 해당 토글을 체크 해제하는 것도 가능하다. 다시 한번 더 눌러 체크를 해제하는 것도 가능함
- 즉 전체 토글들 중 0개를 체크하는 케이스도 가능해진다.
Slider
유저가 슬라이더 핸들을 움직이거나 개발자가 스크립트를 통하여 슬라이더 핸들을 움직여 슬라이더에게 어떤 value를 전달할 수도 있다.
Slider의 자식 오브젝트
- Background
- 슬라이더의 전체 길이가 되는 Bar. 슬라이더의 배경이 된다.
- 이미지 컴포넌트가 달려있어서 슬라이더 바를 그리며 배경 색 같은 것을 지정해줄 수 잇다.
- 없어도 무방하다.
- 없애주면 이런식
- FillArea & Fill
-
슬라이더의 역할 👉
FillArea
에 비해Fill
의 크기를 상대적으로 조절.Fill
은FillArea
를 채운다.Fill
: 슬라이더가 크기를 조절할 영역- 이미지 컴포넌트가 붙어있어 value만큼 채워 그려진다.
- 슬라이더가 채워질때의 색이나 그림을 변경하고 싶다면
Fill
의 이미지 컴포넌트로 가야한다.
FillArea
: 슬라이더 전체 영역- 예를 들어 min value가 0이고 max value가 50이고 이때 value가 25라면
Fill
이FillArea
크기에 비해 50 % 크기로 채워진다.
- Handle Slide Area
- 슬라이더를 땡길 수 있는 동그란 손잡이(Handle).
- 이미지 컴포넌트가 달려있어서 슬라이더 핸들을 그리며 슬라이더 핸들의 색깔 같은 것을 지정해줄 수 잇다.
- 사실 손잡이 없어도 슬라이드는 유저의 입력과 터치에 반응하여 슬라이더 값을 변경할 수 있기 때문에 없어도 무방하다.
- (그냥 편의로 있는건가보다.)
Slider 필드
- Interactable
- Selectable클래스들을 상속받는 인터랙트 컴포넌트들은 다 가지고 있다고 위에서 배웠다.
- 체크 해제 하면 슬라이더를 유저가 움직일 수 없고 코드를 통해서만 value를 제어할 수 있다.
- Fill Rect
- 슬라이더가 크기를 변경하여 슬라이더를 채울 오브젝트.
- 기본적으로 슬라이더 UI 생성하면 자식 오브젝트로 같이 생성되는
Fill
이 들어간다.
- Handle
- 손잡이가 될 오브젝트
- 기본적으로 슬라이더 UI 생성하면 자식 오브젝트로 같이 생성되는
Fill
이 들어간다.
- Direction
- 슬라이더가 채워지는 방향
- 기본적으로 왼->오
- Whole Numbers
- : 슬라이더 손잡이를 움직일 때 value가 정수 단위로 움직인다.
이벤트
- On Value Changed(Single)
- 슬라이더의 value 값이 변경 될 때마다 자동으로 실행된다.
- 숫자를 인수를 받는 함수가 이 이벤트에 ⭐Dynamic⭐으로 들어간다면 실시간으로 슬라이더의 value 값이 인수로 넘어간다.
- 아래 두 스크립트의 ColorChange 함수를 Dynamic으로 이벤트에 등록해주자.
📜ColorChange.cs
- 큐브 오브젝트에 붙어있는 스크립트다.
- 슬라이더 바를 조절하여 큐브의 색깔의 빨간색 부분의 명도를 변경해줄 것이다.
- 인수로 float을 받기 때문에 인수로 슬라이더의 value값이 실시간으로 들어오게 된다.
- 따라서 슬라이더 바에 따라 큐브의 빨간색이 바뀌게 된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // ⭐⭐
public class ColorChange : MonoBehaviour
{
public void ChangeColor(float percentage)
{
Color color = new Color(percentage, 0, 0);
GetComponent<Renderer>().material.color = color;
}
}
📜SliderChange.cs
- 큐브 오브젝트에 붙는 스크립트다.
- 게임이 시작될때 슬라이더 바를 중간에 놓은 채로 시작
- 현재 min = 0, max = 1인 상태
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // ⭐⭐
public class SliderChange : MonoBehaviour
{
public Slider slider;
void Start()
{
slider.value = 0.5f;
}
}
Dropdown
여러가지 옵션 중 하나의 옵션을 선택할 수 있는 버튼.
UI - Dropdown
Dropdown의 자식 오브젝트
- Label
- 텍스트
- Arrow
- 화살표 이미지
- Template
- 평소엔 비활성화 되어있다.
- 드롭다운을 열었을 때 패널을 그린다.
- Template - Viewport - Content - Item 에서 옵션 하나하나를 그리게 된다.
- 옵션들의 그림, 색을 수정하려면 여기서 수정하면 된다.
Dropdown의 필드
- Value
- 현재 선택된 옵션의 Value
-
드롭다운의 옵션들은 차례로 0, 1, 2, 3 .. 이렇게 인덱스처럼 Value 값이 지정되어 있다.
- 가장 위에있는 옵션의 value는 0
- options
- 옵션을 추가 삭제 수정할 수 있다.
- Sprite는 이미지를 추가해주면 옵션마다 왼쪽에 나타난다.
- On Value Changed(Int 32)
- 유니티 이벤트
- 옵션들 중 하나를 선택하면 발동되는 이벤트이며 인수로는 선택된 해당 옵션의 value가 전달된다.
📜ColorChange.cs
드롭 다운으로 큐브의 바꿔줄 색상을 선택한다.
- 드롭다운 이벤트에 Dynamic으로 붙여줄 함수 ChangeColor(int index)
- 큐브 오브젝트에 붙어있는 스크립트다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // ⭐⭐
public class ColorChange : MonoBehaviour
{
public void ChangeColor(int index)
{
Color color = Color.white;
switch(index)
{
case 0:
color = Color.red;
break;
case 1:
color = Color.blue;
break;
case 2:
color = Color.green;
break;
case 3:
color = Color.white;
break;
}
GetComponent<Renderer>().material.color = color;
}
Scroll View
작은 영역을 통해서 그보다 큰 컨텐츠를 드래그 하면서 볼 수 있는 UI
UI - Scroll View
- 스크롤의 대상이 되는 컨텐츠는
Scroll View - Viewport - Content
의 자식으로 넣어주면 된다. - 우리가 보는 컨텐츠는 사실 훨씬 더 크다.
- 그러나
Viewport
에 Mask 컴포넌트가 붙어있어서 넘치는 부분은 잘라내기 때문에 보이지 않는 것. - 보이는 영역을 크게하고 싶으면
Viewport
의 크기를 늘리면 되는데,Scroll View
의 크기를 변경하면 알아서 같이 변경된다.
- 그러나
컨텐츠에 스크롤 붙이기
Scroll View - Viewport - Content
에 Image 컴포넌트를 검색하여 붙이고 배경색을 지정해주었다.Contetnt
의 자식으로UI - Text
를 추가해주었다.- 세로 길이는 부모인
Viewport
에 의하여 맞춰지지만(상대좌표) 가로 길이는 스스로 수동적으로 값을 입력해 결정할 수 있도록 (절대좌표)Content
의 앵커 프리셋을 stretch-left 으로 해준다.- 이렇게 해준 이유는 밑에서 세로 스르롤링 (Vertical)을 한번 체크 해제해볼라고.
- 반대로 가로 스크롤링은 없고 세로 스크롤링만 하도록 구현하려면 앵커 프리셋을 top - stretch로.
- Alt키를 누르고 지정하여 텍스트도 왼쪽 상단으로 옮겨주자.
Control View
에서 vertical을 해제하여 위아래로 드래그 하지 못하도록 막아주었다.Scroll View
의 또 다른 자식들인Scrollbar Horizontal
,Scrollbar Vertical
을 없애주었다.- 스크롤 이미지가 사라진다.
- 스크롤바 이미지만 사라지는거지 드래그는 여전히 가능하다.
- 사라지고 남은 여백을
ViewPort
가 채울 수 있도록ViewPort
의 패딩값을 전부 0으로 해주었다. (right = 0, bottom = 0)
- 스크롤 이미지가 사라진다.
이벤트
- On Value Changed(Vector2)
- 유니티 이벤트
- 스크롤 뷰를 드래그하면 자동으로 발동되는 이벤트로 스크롤 바를 어디까지 드래그 했는지 그 위치(Vector2)를 함수들에게 인수로 넘겨준다.
Scroll Rect
- MovementType
- 스크롤의 움직임 스타일
- deceleration rate
- 값이 높을수록 스크롤링에서 손을 뗏을때 스크롤링을 빨리 멈춘다.
- Scroll Sensitivity
- 민감도
Input Field
플레이어가 직접 텍스트를 입력할 수 있는 공간.
UI - Input Field
Input Field의 자식 오브젝트
- Placeholder
- 여기에도 텍스트 컴포넌트가 붙어있는데 이는 유저 입력전에 안내문구 같은 것이다.
- 기본적으로 Enter Text… 라고 되어있는 그 문구.
- 따라서 유저가 입력을 시작하면 이 Placeholder의 Text 컴포넌트는 비활성화된다.
- 여기에도 텍스트 컴포넌트가 붙어있는데 이는 유저 입력전에 안내문구 같은 것이다.
- Text
- 이 텍스트 UI에 유저의 입력이 들어간다.
- 이처럼 인터랙트 컴포넌트(Input Field 컴포넌트)는 직접 그래픽을 표현하지 않는다.
Input Field의 이벤트
이벤트가 2개다.
- On Value Changed (String)
- 유저가 타이핑을 한번 할 때 마다 발생하는 이벤트.
- 글자 한글자 칠때마다 계속 발동 되며 그 한글자 한글자가 다 인수로 넘어가게된다.
- 만약에 유저가 abc를 입력했다면
- a
- ab
- abc
- 이렇게 string 인수로 3번 넘어간다.
- On End Edit (String)
- 유저가 엔터키를 눌러서 타이핑을 끝냈을때발생하는 이벤트.
- 만약에 유저가 abc를 입력했다면
- abc 이렇게 한번만 넘어간다.
Input Field 필드
- Content Type : 유저의 입력 형식을 지정해줄 수 있다.
- Standard : 유저 입력 아무거나 다 받는다.
- Integer Number : 정수만 입력 받는다. (오로지 정수만 타이핑 됨)
- Password : 유저 입력 다 받긴 하는데 비밀번호 입력할 때처럼 가려진다.
- Text에는 뜬다.
- Read Only : 입력 불가
- Chracter Limit : 글자 수 제한
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기