파란색 잼 - 이동속도 증가
초록색 잼 - 공격속도 증가
빨간색 잼 - 체력회복
스크립트 폴더 안에 items 폴더를 만들고, 아이템마다 스크립트를 만듭니다.
GemBlue.cs
public class GemBlue : MonoBehaviour
{
// 10초간 이동속도 100% 증가
private void OnTriggerEnter2D(Collider2D col)
{
if(col.CompareTag("Player"))
{
Sword_Man swordMan = col.GetComponent<Sword_Man>();
StartCoroutine(IncreaseMoveSpeed(swordMan));
GetComponent<SpriteRenderer>().enabled = false; // Destroy를 하면 코루틴이 정지되므로, 임시로 그림만 없앴음.
GetComponent<Collider2D>().enabled = false; // 충돌체 제거
}
}
IEnumerator IncreaseMoveSpeed(Sword_Man swordMan)
{
float moveSpeed = swordMan.getMoveSpeed();
swordMan.SetMoveSpeed(moveSpeed * 2f);
yield return new WaitForSeconds(10);
swordMan.SetMoveSpeed(moveSpeed);
Destroy(gameObject);
}
}
GemGreen.cs
public class GemGreen : MonoBehaviour
{
// 10초간 공속 50% 증가
private void OnTriggerEnter2D(Collider2D col)
{
if(col.CompareTag("Player"))
{
Sword_Man swordMan = col.GetComponent<Sword_Man>();
StartCoroutine(IncreaseAttackSpeed(swordMan));
GetComponent<SpriteRenderer>().enabled = false;
GetComponent<Collider2D>().enabled = false;
}
}
IEnumerator IncreaseAttackSpeed(Sword_Man swordMan)
{
float attackSpeed = swordMan.GetAttackSpeed();
swordMan.SetAttackSpeed(attackSpeed * 1.5f);
yield return new WaitForSeconds(10);
swordMan.SetAttackSpeed(attackSpeed);
Destroy(gameObject);
}
}
GemRed.cs
public class GemRed : MonoBehaviour
{
// 체력 50 회복
private void OnTriggerEnter2D(Collider2D col)
{
if (col.CompareTag("Player"))
{
Sword_Man swordMan = col.GetComponent<Sword_Man>();
swordMan.nowHp += 50;
if (swordMan.nowHp > swordMan.maxHp)
swordMan.nowHp = swordMan.maxHp;
Destroy(gameObject);
}
}
}
IEnumerator로 함수를 만들어서 코루틴을 실행하면 함수가 병렬로 실행이 됩니다. 간단하게 실행분기를 나눌 수 있고, 언제든지 실행을 멈추고 일정 시간 후에 실행되게 할 수 있어서 자주 사용하는 기능입니다. 위 코드에서는 코루틴을 실행분기를 나누는 것에 사용하지는 않았고, 10초 후에 코드가 자동 실행되게 하는 것에 사용했습니다.
코루틴 사용 예제
StartCoroutine(test()); // 코루틴 시작
IEnumerator test() { // 함수 정의
A // A 실행
yield return new WaitForSeconds(5); // 5초 일시정지
B // 5초 후 B 실행
}
만약 코루틴 실행 중에 스크립트가 추가된 오브젝트가 없어진다면 코루틴은 멈추게 됩니다. 따라서 위에 코드에서 아이템을 먹을 때 임시로 그림과 충돌체만 없애고, 코루틴이 끝날 때 오브젝트를 없앴습니다.
만든 스크립트를 아이템에 각각 붙이고, Collider 2D Trigger를 추가합니다.
Hierarchy창에서 만든 아이템 오브젝트를 Project창으로 드래그 앤 드롭하면 Prefab이 생기는데요.
Prefab은 가공된 오브젝트를 쉽게 꺼내 쓸 수 있도록 저장하는 시스템입니다.
Prefabs 폴더를 만들고 저장해두겠습니다.
아이템에 닿은 오브젝트를 Tag로 판단하므로, 소드맨에 Player 태그를 달아줍니다.
기존 무기 Tag가 Player였는데 겹치면 안 되니 Weapon으로 바꿔주겠습니다.
Enemy.cs의 OnTriggerEnder2D의 CompareTag도 Player에서 Weapon으로 바꿔줬습니다.
Sword_Man.cs에서 Get, Set 메소드를 만들어 공속, 이속을 가져오고, 설정하는데 사용했습니다.
체력회복도 캡슐화하는게 좋지만 이번엔 변수로 했습니다.
GemBlue
GemGreen
GemRed
'유니티 게임 개발' 카테고리의 다른 글
[유니티 강좌] 2D RPG 게임 만들기 - 14 / 사운드 (0) | 2021.03.28 |
---|---|
[유니티 강좌] 2D RPG 게임 만들기 - 13 / 함정 (0) | 2021.03.24 |
[유니티 강좌] 2D RPG 게임 만들기 - 11 / 간단한 적 AI (5) | 2021.03.21 |
[유니티 강좌] 2D RPG 게임 만들기 - 10 / 따라오는 카메라, 영역 설정 (1) | 2021.03.18 |
[유니티 강좌] 2D RPG 게임 만들기 - 9 / 맵 생성, 타일 맵 (6) | 2021.03.18 |
댓글