이번 포스팅에서는 #18 유니티 코루틴(Coroutine), Character 보강 포스팅에 이어서 진행하겠습니다.
#18 유니티 코루틴(Coroutine), Character 보강 포스팅은 아래에 첨부하겠습니다.
포스팅은 유니티 2D 게임 개발(게임 개발 프로그래밍)에 나온 예제로 진행합니다.
#18 유니티 코루틴(Coroutine), Character 보강 포스팅에서 예고한대로 이번 포스팅에서는 OnCollisonEnter2D 메서드와 OnCollisionExit2D 메서드를 사용하여 적(Enemy) 캐릭터와 플레이어(Player) 캐릭터가 부딪혔을때 플레이의 HP가 감소하도록 하겠습니다.
OnCollisonEnter2D() 메서드
Enemy 클래스를 수정해보도록 하겠습니다.
Enemy 스크립트(C#)의 전체코드 입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : Character
{
// 수정한 부분 <------
public int damageStrength;
Coroutine damageCoroutine;
// ------>
float HP;
private void OnEnable()
{
ResetCharacter();
}
public override IEnumerator DamageCharacter(int damage, float interval)
{
while (true)
{
HP = HP - damage;
if (HP <= float.Epsilon)
{
KillCharacter();
break;
}
if (interval > float.Epsilon)
{
yield return new WaitForSeconds(interval);
}
else
{
break;
}
}
}
public override void ResetCharacter()
{
HP = StartingHP;
}
// 수정한 부분 <-----------
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
Player player = collision.gameObject.GetComponent<Player>();
if (damageCoroutine == null)
{
damageCoroutine = StartCoroutine(player.DamageCharacter(damageStrength, 1.0f));
}
}
}
void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
if (damageCoroutine != null)
{
StopCoroutine(damageCoroutine);
damageCoroutine = null;
}
}
}
// ------------>
}
코드를 확인하고 저장합니다.
수정한 부분만 확인해보도록 하겠습니다.
public int damageStrength;
Coroutine damageCoroutine;
int반환 형식의 damageStrength는 pulbic으로 되어있고 적이 입힐 피해량입니다. 유니티에서 설정하겠습니다.
실행중인 코루틴을 가리키는 Couroutine 변수입니다. 참조를 변수에 저장할 수 있고, 코루틴을 중지할때 사용할 수 있습니다.
OnCollisionEnter2D()메서드를 확인해보겠습니다.
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
Player player = collision.gameObject.GetComponent<Player>();
if (damageCoroutine == null)
{
damageCoroutine = StartCoroutine(player.DamageCharacter(damageStrength, 1.0f));
}
}
}
OnCollisionEnter2D()메서드는 현재 오브젝트의 콜라이더 2D가 다른 오브젝트의 콜라이더 2D와 닿을 때마다 유니티 엔진이 호출하는 메서드입니다.
if문을 확인해보겠습니다. 충돌한 오브젝트의 태그를 확인하여 "Player"라면 Player 컴포넌트의 참조를 얻습니다.
다음 if문을 확인해보면 DamagerCharacter() 코루틴을 실행중인지 확인합니다. 실행 중이 아니라면 Player 오브젝트의 코루틴을 시작합니다. 적과 플레이어가 닿아 있을 때 계속 대미지를 주어야하기 때문에 damageStrength 와 interval(1.0f)를 전달합니다.
OnCollisionEnter2D 메서드와 이전에 아이템 줍기에 사용하였던 OnTriggerEnter2D 메서드와 어떤 차이점이 있는지 궁금하여 알아보았습니다.
1. OnCollisonEnter2D
OnCollisonEnter2D 메서드는 매개변수가 Collision2D입니다
OnCollisonEnter2D 메서드는 충돌체의 콜라이더 컴포넌트의 IsTrigger속성이 체크해제 되어있을때 사용한다고 합니다. OnTiggerEnter2D 메서드와는 다르게 물리적인 연산을 하며 충돌을 갑지합니다.
2. OnTriggerEnter2D
OnTriggerEnter2D 메서드는 매개변수가 Collider2D 입니다.
OnTriggerEnter2D 메서드는 충돌체중 하나의 콜라이더 컴포넌트의 IsTrigger속성이 체크가 되어있을때 사용한다고 합니다.
OnCollisionEnter2D 메서드와는 다르게 물리적인 연산을 하지 않고 충돌을 감지하여 두 오브젝트가 충동했을때 서로 통과한다고 합니다.
OnCollisionExit2D() 메서드를 확인해보겠습니다.
void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
if (damageCoroutine != null)
{
StopCoroutine(damageCoroutine);
damageCoroutine = null;
}
}
}
OnCollisionExit2D() 메서드는 오브젝트의 콜라이더 2D와 충돌한 오브젝트의 콜라이더 2D가 접촉을 끝낼 때 불립니다.
OnCollisionExit2D() 메서드는 위의 OnCollisionEnter2D와 마찬가지로 태그로 "Player"를 확인합니다.
damageCoroutine이 null이 아니면 코루틴이 실행중이라는 의미입니다.
StopCoroutine 메서드를 사용하여 damageCoroutine을 중지시키고 damageCoroutine 을 null로 설정합니다.
유니티로 돌아와 Enemy 스크립트(C#) 컴포넌트의 속성을 설정하겠습니다.
EnemyObject 프리팹의 Enemy 스크립트(C#)의 Max HP, Starting HP, Damage Strength 의 속성을 설정합니다.
Max HP : 2
Starting HP : 2
Damage Strength : 1
RigideBody 2D 컴포넌트의 Freeze Rotation Z 속성을 체크하여 Z축 회전을 고정합니다.
재생버튼을 눌러 게임을 실행합니다.
플레이어가 이동하여 적에게 닿으면 적이 끝없이 밀려나는 것을 볼 수있습니다. 지금은 일단 그 상태 그대로 두고 플레이어의 체력이 0이되면 체력바와 인벤토리가 사라지는 것을 확인하시면 되겠습니다.
마지막으로 Ctrl + S를 눌러 Scene을 저장합니다!
감사합니다! :)
'유니티2D' 카테고리의 다른 글
#21 유니티 오브젝트 풀링(Object Pooling) (5) | 2020.12.24 |
---|---|
#20 유니티 인공지는 적(Enemy) 만들기 (9) | 2020.12.23 |
#18 유니티 코루틴(Coroutine), Character 보강 (7) | 2020.12.21 |
#17 유니티 카메라 매니저(플레이어 추적) (7) | 2020.12.19 |
#16 유니티 스폰위치, 게임 매니저(Singleton) (5) | 2020.12.18 |