
이번 강좌는 플레이어 피격 이벤트에 관한 강좌다.
기존에 생성한 'Platform' 타일 맵에 가시를 추가해 보겠다.
타일 팔레트 위에 스프라이트를 드래그하고 놓으면 추가할 수 있다.
그런데 지금 타일맵에 가시를 추가하면 지형으로 인식되기 때문에 새로운 타일맵을 생성한 후, 그 타일맵에서 가시를 추가한다.
그리고 가시를 추가한 타일맵과 몬스터에 'Enemy' 태그와 레이어를 만든 후 적용한다.
그리고 Player에 'Player' 레이어를 만든 후 적용하고, 'PlayerDamaged'라는 레이어도 생성한다. (Player는 레이어 2개를 사용할 예정이다)
몬스터가 가시를 지나갈 때 관통하지 않고 경사로처럼 올라간다.
몬스터가 가시는 관통하여 지나가도록 설정하겠다.
'Edit - Project Settings - Physics 2D - Layer Collision Matrix'에서 'Enemy'와 'Enemy'가 만나는 박스를 체크 해제한 후 실행하면 몬스터가 가시를 관통하여 지나간다.
그리고 몬스터가 가시 앞에 보이게 하기 위해 z값을 -1로 설정한다.
그리고 Player에 무적 시간을 주기 위해 'PlayerDamaged'와 'Enemy'가 만나는 박스를 체크 해제한다.
'PlayerMove' 스크립트 파일을 연 후, 다음과 같은 코드를 추가한다.
...
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
Debug.Log("플레이어가 맞았습니다");
}
}
...
실행한 후, 가시나 몬스터에게 닿으면 로그가 출력되는 것을 확인할 수 있다.
다음과 같이 코드를 수정하고, 추가한다.
...
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
onDamaged(collision.transform.position);
}
}
void ㅒnDamaged(Vector2 targetPos)
{
gameObject.layer = 9;
spriteRenderer.color = new Color(1, 1, 1, 0.4f);
int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
rigid.AddForce(new Vector2(dirc, 1) * 7, ForceMode2D.Impulse);
}
...
Player가 가시나 몬스터에 닿으면 넉백이 되고 투명해지면서 무적이 되는 모습을 볼 수 있다.
gameObject.layer = 9의 숫자는 본인의 'PlayerDamaged' 레이어 번호를 적으면 된다.
무적 상태가 된 이후 영구히 무적 상태가 된다.
무적을 해제하기 위해 다음과 같이 코드를 수정하고, 추가한다.
...
void OnDamaged(Vector2 targetPos)
{
...
Invoke("OffDamaged", 3);
}
void OffDamaged()
{
gameObject.layer = 8;
spriteRenderer.color = new Color(1, 1, 1, 1);
}
...
무적 상태가 되고 3초 뒤에 무적이 풀리게 된다.
피격 애니메이션을 추가해 보겠다.
점프 애니메이션 스프라이트 하나를 사용해 다음과 같이 애니메이션을 만든다.

애니메이션 파라미터에 'doDamaged'라는 이름의 Trigger 타입 변수를 추가한다.
Trigger : 방아쇠 역할의 매개변수, 값이 없음
그리고 Transition을 'Any State -> Player_Damaged -> Exit'로 연결한다.
'Any State -> Player_Damaged' Transition을 다른 애니메이션과 똑같이 설정하고, Conditions에 'doDamaged'를 추가한다.
그런 다음, 'Player_Damaged' 애니메이션의 Loop Time을 비활성화한다.
'Player_Damaged -> Exit' Transition에 Has Exit Time은 활성화 되어 있어야 한다.
Any State -> Exit : 현재 상태 상관없이 실행 후 복귀
그리고 다음과 같은 코드를 추가한다.
...
void OnDamaged(Vector2 targetPos)
{
...
anim.SetTrigger("doDamaged");
...
}
...
실행하면 피격 후 애니메이션이 재생된다.
레이어로 구분해서 무적을 구현하는게 흥미로웠다.
게임메이커에서는 따로 변수를 추가해서 그 변숫값에 따라 무적을 구현했는데, 유니티에선 레이어를 사용해서 좀 더 쉬운 느낌이 든다.