유니티 2D(물리레이어설정, 피격 및 무적 이벤트 구현, 애니메이션의 AnyState와 Exit활용)

JHO·2022년 10월 28일
0

유니티 2D

목록 보기
8/8

1. 준비 단계(타일맵이용 설치, 물리레이어설정)


1-1. 장애물 설치(타일맵을 이용한 장애물 설치)

  • 먼저, 또다른 Tilemap을 생성하여 Spikes라는 장애물 전용 타일맵을 생성.
  • 원하는 위치에 장애물 설치.
  • TilemapTilemap Collider 2D 추가.

1-2. 물리 레이어 설정

  • 우선, Layer에 Enemy라는 이름을 추가하여 장애물과 몬스터 레이어 설정.
  • 피격당하지 않은 상태피격당한 상태를 나타내는 PlayerPlayerDamaged라는 Layer을 따로 생성.
  • GameObject - Project Settings - Physics 2D에서 PlayerDamaged와 Enemy와의 충돌효과를 false.
    • (피격시, 잠시 동안의 무적상태를 구현하기 위해)
  • Enemy와 Enemy 끼리의 충돌효과 또한 false.
    • (장애물과 몬스터가 서로 부딪히지 않도록 겹치지않도록 설정하기위함.)
      (장애물과 몬스터가 서로 겹치지 않는 모습, 겹칠 때 몬스터가 보이도록 z축을 마이너스로 설정. -> z축 위치가 작을수록 카메라에 가까움.)

2. 피격 및 무적 구현


2-1. 코드

Rigidbody2D rigid;
SpriteRenderer spriteRenderer;
void OnCollisionEnter2D(Collision2D collision)
  {
      if(collision.gameObject.tag == "Enemy")
      {
          OnDamaged(collision.transform.position);
      }
  }
void OnDamaged(Vector2 targetPos)
{       //layer변화
        gameObject.layer = 11;        
        //피격시 색깔변화
        spriteRenderer.color = new Color(1, 1, 1, 0.4f);// 4번째 인자는 투명도
        //피격시 튕김리액션 
        int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
        rigid.AddForce(new Vector2(dirc, 1)*7, ForceMode2D.Impulse);
        Invoke("OffDamaged", 2);
}
void OffDamaged()
{
      gameObject.layer = 10;
      spriteRenderer.color = new Color(1, 1, 1, 1);
}
  • 현재, Player 레이어는 10번, PlayerDamaged 레이어는 11번인 상태.
  • OnCollisionEnter2D 함수를 통해 장애물이나 몬스터를 부딪힐 시, OnDamaged()함수 호출.
  • Layer을 PlayerDamaged로 바꾸어 장애물이나 몬스터 충돌 시, 다음 장애물과 몬스터와의 충돌효과를 off 해줌.(1-2 참고) Player를 투명하게 바꿔줌.
  • 장애물이나 몬스터의 왼쪽면에 충돌하면 왼쪽으로, 오른쪽면에 충돌하면 오른쪽으로 튕겨나가게 하기위해 tag가 Enemy인 객체를 인자로 받아 현재 Player의 위치에서 뺌.
  • 뺀 결과값이 양수면 addforce를 통해 오른쪽으로, 음수면 왼쪽으로 힘을 가해서 튕기는 효과를 줌.
    • (곱하기 7을 해준 이유는, 튕기는 효과가 미미해서.)
  • Invoke 함수를 사용해 OffDamaged()함수를 호출하여, 2초동안의 무적시간을 구현.
    • OffDamaged()함수 호출시, layer가 Player로 바뀌면서 몬스터와 장애물과의 충돌효과 on, 또한 Player 색깔 복구.

3. 애니메이션 적용(AnyState 와 Exit의 활용)


3-1. 준비단계

  • 원하는 피격 애니메이션 생성 후, 위 사진처럼 애니메이터에서 조정.(위 사진의 경우, 0.3초동안 애니메이션 동작)
  • Any State어떤 상태든 상관없는 상태.
  • Any State -> Exit는 즉, 어떤 조건이 충족 되면 위 사진 기준, Damaged 실행 후, 종료 후, 원래대로 다시 상태와 조건에 따라 Idle, Walk, Jump 상태로 복귀.
  • trigger형(방아쇠역할의 매개변수, 값이 없는 매개변수)의 doDamaged라는 Parameter 생성 후, Any State -> Damaged에서 추가.
  • 0.3 초만 까지만 돌고 Damaged 에서 Exit로 나가기 위해 Loop Time false, Damaged -> Exit로 가는 Transition 에서 Has Exit Time True.

3-2. 코드

Animator anim;
void OnDamaged(Vector2 targetPos)
    {   ...
        ...
        anim.SetTrigger("doDamaged");
        Invoke("OffDamaged", 2);
    }
  • Animator 형 변수 anim을 사용.
  • SetTrigger() 이용해, 피격시 호출되는 함수안에 parameter doDamaged를 활성화하여 AnyState -> Damaged -> exit의 애니메이션 동작.
    (피격 및 애니메이션 적용한 모습)

<참고>
골드 메탈님 강의 영상: https://www.youtube.com/watch?v=epZFE5Hpbdc&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2&index=21![](https://velog.velcdn.com/images/ohjh1744/post/4aeb8a90-10b0-4d90-8128-b81c2835868a/image.gif)

사용한 텍스처 소스 : http://u3d.as/2mvJ (by골드메탈님)

profile
개발노트

0개의 댓글