이번 포스팅은 아이텝 줍기 관련 포스팅의 마지막입니다.
#13-1 유니티 아이템 줍기(써클 콜라이더) 포스팅과 #13-2 유니티 아이템 Scriptable Object(스크립터블 오브젝트)를 참고하시기 바랍니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
#13-1 유니티 아이템 줍기(써클 콜라이더)링크는 아래에 첨부하겠습니다.
#13-2 유니티 아이템 Scriptable Object(스크립터블 오브젝트) 링크는 아래에 첨부하겠습니다.
체력 아이템을 만들고 Player 스크립트(C#)의 Player 클래스 안에 OnTriggerEnter2D() 메서드를 수정하겠습니다.
체력 아이템 만들기
지금까지 학습한 내용을 종합하여 체력 아이템을 만들겠습니다.
1. Hierarchy창에서 게임오브젝트를 생성하고 HeartObject라고 이름을 바꾸었습니다.
2. HeartObject의 Tag > CanBePickedUp , Layer > Consumables로 바꾸었습니다.
3. Sprite Renderer , Animator , Polygon Collider 2D 컴포넌트를 추가합니다.
※ Polygon Collider 2D 컴포넌트는 하트모양의 오브젝트의 콜라이더 모양과 잘어울리기 때문에 추가하였습니다.
4. Polygon Collider 2D의 Is Trigger > 체크 하여 트리거 속성을 설정합니다.
1. Assets > Scripts > Scriptable Objects 폴더에 heart(Scriptable Object)를 생성합니다.
2. heart(Scriptable Object)오브젝트의 속성을 사진과 같이 설정하였습니다.
Object Name : heart
Spirte : 해당 오브젝트와 맞는 스프라이트
Quantity : 1
Stackalbe : 체크해제
Item Type : Health
1. HeartObject에 Conusmable(Script) 컴포넌트를 추가합니다.
2. Item 속성에 위에서 만든 Heart(Scriptable Object)를 추가합니다.
마지막으로 HeartObject를 Prefabs 폴더로 드래그 앤 드롭하여 프리팹으로 만들어 줍니다.
지금까지 학습한 것을 종합하여 체력 아이템을 만들었습니다.
Player 스크립트 수정(Player 클래스의 OnTriggerEnter2D() 메서드 수정)
Player 스크립트를 수정하여 여러 기능을 추가하거나 수정하도록 하겠습니다.
Player 스크립트의 전체 코드 입니다.
using UnityEngine;
public class Player : Character
{
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("CanBePickedUp"))
{
Item hitObject = collision.gameObject.GetComponent<Consumable>().item;
if(hitObject != null)
{
print("Hit: " + hitObject.objectName);
switch (hitObject.itemType)
{
case Item.ItemType.COIN:
break;
case Item.ItemType.HEALTH:
AdjustHP(hitObject.quantity);
break;
default:
break;
}
collision.gameObject.SetActive(false);
}
}
}
public void AdjustHP(int amount)
{
HP += amount;
print("Adjusted HP by: " + amount + ". New Value: " + HP);
}
}
OnTriggerEnter2D()메서드를 보기 전에 새롭게 정의한 AdjustHP()메서드 부터 살펴보겠습니다.
public void AdjustHP(int amount)
{
HP += amount;
print("Adjusted HP by: " + amount + ". New Value: " + HP);
}
HP += amount; 는 HP = HP + amount를 줄인 것입니다.
인수로 받은 값을 원래 체력 값에 더한 결과를 HP에 대입합니다.
이 메서드의 인수로 음수를 전달하여 플레이어가 피해를 받을 때 체력 값을 깎을 때 사용할 것입니다.
print()메서드는 괄호안의 내용을 콘솔창에 전달하는 메서드 입니다.
체력값을 표시할 때 사용합니다.
OnTriggerEnter2D()메서드입니다.
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("CanBePickedUp"))
{
Item hitObject = collision.gameObject.GetComponent<Consumable>().item;
if(hitObject != null)
{
print("Hit: " + hitObject.objectName);
switch (hitObject.itemType)
{
case Item.ItemType.COIN:
break;
case Item.ItemType.HEALTH:
AdjustHP(hitObject.quantity);
break;
default:
break;
}
collision.gameObject.SetActive(false);
}
}
}
먼저 조건문으로 CanBePickedUp 태그로 조건이 참인지 확인합니다.
collision에 들어있는 gameObject의 참조를 저장합니다.
gameObject에서 스크립트 이름인 "Consumable" 을 인수로 GetConmponent()를 호출합니다.
Consumable 스크립트 컴포넌트를 얻고, Consumable 스크립트의 item속성을 얻어 Item 형식의 hitObject에 대입합니다.
if(hitObject != null) 조건문으로 null 체크를 하여 hitObject가 null 아닌지 확인해줍니다.
hitObject가 null이 아니라면 print() 메서드를 호출합니다.
switch문을 사용하여 hitObject의 ItemType 속성과 동일한 ItemType을 찾습니다.
hitObject의 타입이 COIN이라면 아무일도 일어 나지 않습니다.
hitObject의 타입이 HEALTH라면 AdjustHP()메서드를 호출합니다.
그리고 충돌한 게임 오브젝트를 씬에서 삭제합니다.
위에서 정의한 switch 문은 아래의 if문과 동일한 기능을 합니다.
if(hitObject.itemType == Item.ItemType.COIN)
{
print("Hit: " + hitObject.objectName);
}
else if(hitObject.itemType == Item.ItemType.HEALTH)
{
AdjustHP(hitObject.quantity);
print("Hit: " + hitObject.objectName)
}
else
{
print("Hit: " + hitObject.objectName);
}
수정한 스크립트를 저장합니다.
프리팹 폴더에 있는 동전 아이템(CoinObject)과 체력 아이템(HeartObject)를 씬에 배치합니다.
재생버튼을 눌러 게임을 진행시키고 배치한 아이템과 충돌합니다.
Console창을 확인합니다. 확인 후에 에러가 나온다면 에러코드를 확인하고 수정합니다.
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#14-2 유니티 체력바 만들기_스크립트(C#) (2) | 2020.12.15 |
---|---|
#14-1 유니티 체력바 만들기(캔버스, UI, 텍스트) (0) | 2020.12.14 |
#13-2 유니티 아이템 Scriptable Object(스크립터블 오브젝트) (0) | 2020.12.11 |
#13-1 유니티 아이템 줍기(써클 콜라이더) (0) | 2020.12.10 |
#12 유니티 기초 종합, 클래스 구현 (0) | 2020.12.08 |