[Unity3D] UI - HP, MP 에너바 조절하기. [Part 1]
※ 주의
이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.
Menu
0. 미리보기
1. HP,MP껍데기 및 기능 만들기.
2. HP,MP 조절을 위한 데미지, 리커버리 만들기.
1. HP, MP껍데기 및 기능 만들기.
- 배칭(드로우콜)을 줄이기 위해 유니티에서 제공하는 아틀라스 사용.
텍스쳐 타입 : sprite (2D and UI)
스프라이트 모드 : Multiple
패킹 태그 : UI
위의 셋팅이 끝난 뒤 스프라이트 에디터를 누른다.
Slice를 누면 밑에 창이 나오는데, 그 창에서 Slice를 누르면 이미지들이 자신의 크기에 맞게 잘린다.
이미지가 알맞게 잘렸으면 Apply를 눌러 빠져나온다.
메인 이미지에 붙어있는 ◀단추를 누르면 잘린 이미지들이 자식으로 들어가 있는것을 확인 할 수 있다.
※ 다른 이미지가 필요해졌을 때 패킹 태그를 똑같은 이름으로 지정하면 똑같은 스프라이트 팩에 들어가게 된다.
이러한 설정(아틀라스)을 하지 않으면, 캔버스에 이미지를 하나 만들어 쓸때마다 배치(Batches)가 증가하게 된다.
모바일 게임에 경우 이러한 배치수를 100개를 상한선으로 두고 있다.
※ 배치수가 너무 많다면 게임을 원할하게 돌아가게 할 수 없다.
스프라이트 팩에들어있는 이미지는 몇개를 꺼내쓰든 1개의 배치만을 소모한다.
게임창에 Stats를 누르면 배치수를 확인 할수 있는데, SkyBox 배치 1개, 이미지 배치수가 1개가 들어간 것을 볼 수 있다.
※ 사용한 이미지는 총 5개다.
여기서 아틀라스화 하지 않은 이미지를 쓰면 배치는 바로 증가하게 된다.
-------------------------------------------------------------------------------------------------------------------
- HP 및 MP를 눌러 이미지 타입을 Simple에서 Filled로 전환한다.
그 후
Fill Method : Horizontal
Fill Origin : Left
으로 전환한 뒤
Fill Amount를 마우스로 수동으로 조절해보면 밑의 그림처럼 변환되는것을 확인 할 수 있다.
Fill Amount의 값은 0 ~ 1의 값만을 가지고 있다.
실시간으로 변하는 체력을 표시하고 싶다면 Fill Amount = (현재체력 / 체력의 최대치)로 처리하여 넣으면 된다.
이제 코드로 플레이어의 체력을 변화시켜보도록 하자.
PlayerInfo스크립트를 만들어 플레이어 컴포넌트에 추가한다.
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // 이걸 using시켜줘야 Image의 자료형을 쓸수 있다. public class PlayerInfo : MonoBehaviour { // 공개 public GameObject[] Effect; public Image[] Img; // HP,MP이미지. public float MAX_HP; // HP 최대치. public float MAX_MP; // MP 최대치. public float p_HP; // 현재 HP. public float p_MP; // 현재 MP. // 플레이어 UI정보 갱신. // 인자 : (HP냐? MP냐?, 데미지냐? 체력회복이냐?, 데미지 혹은 체력회복의 수치는 얼마만큼이냐?) public void UIUpdate(string _Type, string _InfoType, float _Value) { float Type = 0; // HP또는 MP의 현재 수치. float MAXType = 0; // HP또는 MP의 최대치. int Index = 0; // HP또는 MP의 이미지 인덱스. switch (_InfoType) { case "HP": { Index = 0; Type = p_HP; MAXType = MAX_HP; // 리커버리면 회복 if (_Type == "Recover") p_HP += _Value; // 리커버리가 아니면 데미지. else p_HP -= _Value; break; } case "MP": { Index = 1; Type = p_MP; MAXType = MAX_MP; if (_Type == "Recover") p_MP += _Value; else p_MP -= _Value; break; } } // 인덱스 번째의 이미지를 갱신시킨다. // 만약, 변화시켜야 되는 이미지가 HP이고, 체력의 최대치가 100이라고 하자. // 20의 데미지를 받아 체력이 80남았다고 하자, 그러면 체력이 80이 남은것을 보여줘야 한다. // fillAmount의 값은 0 ~ 1가 끝이기 때문에 체력을 소수점으로 변환해줘야 표현이 가능해진다. // 80 / 100 = 0.8 요컨데 퍼센트로 바꿔서 표현한다 생각하면 된다. Img[Index].fillAmount = Type / MAXType; } } | cs |
플레이어의 인스펙터창 정보.
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] 객체 미리 생성 후 재활용 - Memory pool [Part 0] (0) | 2017.03.20 |
---|---|
[Unity3D] UI - HP, MP 에너바 조절하기. [Part 2] (1) | 2017.03.17 |
[Unity3D] UI - HP, MP 에너바 조절하기. [Part 0] (0) | 2017.03.15 |
[Unity3D] 조이스틱으로 캐릭터 조종하기. [Part 2] (10) | 2017.03.13 |
[Unity3D] 조이스틱으로 캐릭터 조종하기. [Part 1] (6) | 2017.03.10 |