[unity]-2d 기초 [ 몹에 맞으면 튕기도록 만들기]
>layer에 Enemy를 추가
몹과 가시의 레이어를 Enemy로 설정한다.
저 둘사이에는 충돌이 일어나지 않도록 설정하는 방법은 아래 방법이다.
project settings->physics 2d-> layer collision-> Enemy와 Enemy가 만나는지점 체크를 해제해준다.
그리고 PlayerDamaged는 무적상태로 무적상태일때는 Enemy와 충돌하지 않게 체크를 해제 해준다.
>코드로 구현
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Enemy")
{
OnDamaged(collision.transform.position);
}
}
OnCollisionEnter2D는 현재 오브젝트의 콜라이더2D가 다른 오브젝트의 콜라이더2D와 닿을때마다 유니티 엔진을 호출한다.
만약 충돌한 오브젝트의 tag가 Enemy이면 OnDamaged가 실행된다. 인수는 충돌되어 변경된 위치이다.
void OnDamaged(Vector2 targetPos) //무적상태일때
{
gameObject.layer = 9; //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);
//에니메이션
anim.SetTrigger("doDamaged");
Invoke("OffDamaged", 2);
}
OnDamaged는 Enemy에게 맞아서 튕겨나가고 무적상태가 되는것을 나타낼것이다.
맨처음 gameObject.layer=9;는 이 함수가 시행될때 9번 레이어로 바꾼다는뜻이다.
9번레이어가 PlayerDamaged이다. 즉 충돌하고나서는 Enemy랑 충돌이 일어나지 않는 상태가된다.
color의 맨뒤에 0.4f는 투명도를 뜻한다. 40퍼센트로 설정하였다.
dirc에서 transform.position.x는 게임오브젝트의 중심 x위치, targetPos.x는 충돌지점의 중심x위치로, 두개의 차가 0보다 크다는 말은 게임오브젝트가 충돌지점보다 오른쪽에 있다는 말이다.
오른쪽에 있을때는 오른쪽으로 튕겨나가야하므로 1, 왼쪽이면 -1으로 설정한다.
AddForce의 x,y위치를 (dirc,1)로 설정하고 7을 곱해준 이유는 위와 옆으로 같은 위치에 튕겨지도록 하기 위해서이다. 만약 x만 건들이고싶으면 (dirc*7, 1)으로 하면된다. (현재 플레이어가 y 가 1인 위치에 있다.
그다음으로 Trigger은 방아쇠 역할을 하는 매개변수로 값이 없다.
이름을 doDamaged로 하고 애니메이션에 착지하는 sprite를 추가해주었다. 이름을 Damaged로 해주었다.
Any State->Exit는 현재 상태에 상관없이 실행 후 복귀이다.
Any State-> Damaged의 conditions에 doDamaged를 주었다.
코드로는 SetTrigger("doDamaged")로 트리거를 실행했다.
void OffDamaged()
{
gameObject.layer = 8;
spriteRenderer.color = new Color(1, 1, 1, 1);
}
OffDamaged는 무적상태가 해제되는 함수이다.
다시 레이어를 8번으로 돌려놔주었다.
color의 투명도도 다시 1로 돌려준다.
OnDamaged함수의 마지막에 Invoke로 2초후에 실행되게 해준다.