ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CCI - 08 - 플레이어 피격모션
    팀업 프로젝트/C.C.I

    안녕하세요.

     

    이번 글에서는 적 (지정된 태그)에 피격 (충돌) 되었을 시

     

    이렇게 플레이어가 뒤로 넉백 되는 부분에 대해서 알아볼 예정입니다.

     

    간략하게 구현 동작 부분을 살펴보자면.

     

    플레이어가 일정 물체랑 충돌 시

     

    뒤로 지정된 값만큼 넉백 되며

     

    이 넉백 되고 일정 시간 동안 다른 물체에게 피해를 입지 않습니다.

    (레이어 교체)

     

    또한 피격 시 하트가 감소되는 부분도 함께 살펴보도록 하겠습니다.

    (하트 감소)

     

    Player의 충돌을 체크하는 부분은 OnCollisionEnter에서 구현하였습니다.

     

    각 충돌된 collision의 태그가 "CatEnemy" 이거나 "Trap" 이거나 "CubeRun" 이거나 "CircleTrap"

    일 때 실행되는 조건문입니다.

    (처음에는 레이어를 통일하거나 태그를 통일해서 적용을 할까..? 하고 잠깐 생각했습니다.

    충돌체의 쓰임새에 따른 넉백의 파워를 다르게 할 필요도 존재했고

    관리하기도 편하기에, 코드가 길어지지만 확실히 만들었습니다.)

    (다른 이들이 접근할 때 태그만 추가해 주시면 됩니다.)

     

    OnPlayerDamageLayer의 함수 실행과

     

    피격(충돌) 시 애니메이션 재생 및 PlayOneShot으로 사운드 재생.

     

    그리고 마지막으로 PlayerHitHeart(하트 감소)를 실행시켜 주는 모습입니다.

     

    isJump를 true로 바꿔준 이유는

    피격 시 점프 판정을 갖게 해 줘서

    피격 시 점프가 안되게 구현을 하기 위함입니다.

     

    우선 OnPlayerDamageLayer 함수부터 보겠습니다.

    OnCollisionEnter에서 충돌 시 실행될 OnPlayerDamageLayer 함수 입니다.

     

    인자로는 Transform pos로 위치를 받아왔으며

     

    현재 충돌된 collision의 transform을 넣어 주었습니다.

     

    가장 먼저 gameObject(플레이어)의 레이어를 12로 바꿔줍니다.

    12번 레이어인 (PlayerDamage)로 바꿔 준 이유는

     

    12번 레이어로 변경됐을 시, CatEnemy의 태그와 충돌 체크를 하지 않기 위함입니다.

     

    즉 플레이어가 12번 레이어가 되어있는 시간 동안에는 CatEnemy와 충돌 체크가 일어나지 않습니다.

     

    이후 시각적인 효과를 주기 위하여

     

    StartCoroutine로 코 루틴 함수 "PlayerRenderer"를 실행해 주었습니다.

    코루틴 함수 PlayerRenderer는 간단히 SkinnedMeshRenderer를 enabled로 true/fase

    즉 활성화/비활성화를 해주는 모습입니다.

    (처음 에는 반복 동장이어서 for문으로 동작을 실행해 보려고 했는데

    지정된 시간을 맞추기가 어려운 점이 있었습니다.

    조금만 두뇌를 활용하면 좀 더 간결한 코드가 나올 것 같은데..

    현재는 이렇게 작성되어 있습니다.)

     

    이어서 OnPlayerDamageLayer 함수 내용을 계속 보겠습니다.

     

    우선 playerX / playerZ를 선언해 주어 날아갈 방향을 정해 주었습니다.

     

    현재 player의 위치에서 - pos(충돌체)의 위치가 0보다 크다면 1을 그렇지 않다면 -1의 방향 값을

     

    3항 연산자로 정해 주었습니다.

    (충돌체의 반대 방향으로 이동되게 하기 위함입니다.)

     

    플레이어에겐 RigidBody가 입혀져 있고

     

    RigidBody의 AddForce를 사용해 구현을 해 주었으며

     

    ForceMode는 Impulse로 사용했습니다.

    (순간적인 힘 & 질량 o)

     

    방향은 new Vector3을 받아

    x, z는 playerX / playerY의 지정된 값을 곱해 주었고

    y는 playerJumpSpeed를 이용해 주었습니다.

     

    이후 Invoke함수로 레이어를 원래 레이어 (11)로 변경시켜줄

     

    함수 OffPlayerDamageLayer를 2.0초 뒤에 실행하였습니다.

     

    2.0초는, 코 루틴 함수 PlayerRenderer의 시간보다 많게 지정하였습니다.

     

    Invoke함수에서 2.0초 뒤에 실행할 OffPlayerDamageLayer함수입니다.

     

    단순히 레이어를 11로 바꿔주는 코드입니다.

     


    다시 OnCollisionEnter 함수로 돌아와서 아랫부분을 보시겠습니다.

     

    playerAni의 애니메이션을 실행시켜 주며 사운드를 재생하는 코드와.

    player의 Animator

    마지막으로 PlayerHitHeart는 지난 시간에 만들었던

     

    PlayerHit스크립트의 

     

    PlayerHitHeart 함수입니다.

     

     

    00 : 29초

    CatEnemy에게 충돌하면 피격되어 날아가는 player의 영상입니다.

     

    다음에는 간단한 맵 디자인과,

     

    플레이어가 하트가 모두 소진되거나

     

    혹은 아래로 추락하면 Die상태가 될 때의 동작 구현을 살펴보겠습니다.

     

    감사합니다.

     

     

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net