1-1. 장애물 설치(타일맵을 이용한 장애물 설치)
- 먼저, 또다른 Tilemap을 생성하여 Spikes라는 장애물 전용 타일맵을 생성.
- 원하는 위치에 장애물 설치.
- Tilemap에 Tilemap Collider 2D 추가.
1-2. 물리 레이어 설정
- 우선, Layer에 Enemy라는 이름을 추가하여 장애물과 몬스터 레이어 설정.
- 피격당하지 않은 상태와 피격당한 상태를 나타내는 Player 와 PlayerDamaged라는 Layer을 따로 생성.
- GameObject - Project Settings - Physics 2D에서 PlayerDamaged와 Enemy와의 충돌효과를 false.
- (피격시, 잠시 동안의 무적상태를 구현하기 위해)
- Enemy와 Enemy 끼리의 충돌효과 또한 false.
- (장애물과 몬스터가 서로 부딪히지 않도록 겹치지않도록 설정하기위함.)
(장애물과 몬스터가 서로 겹치지 않는 모습, 겹칠 때 몬스터가 보이도록 z축을 마이너스로 설정. -> z축 위치가 작을수록 카메라에 가까움.)
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-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의 애니메이션 동작.
(피격 및 애니메이션 적용한 모습)
사용한 텍스처 소스 : http://u3d.as/2mvJ (by골드메탈님)