본문 바로가기
Unity/2D

[Unity] 2D게임 만들기 #7_플레이어 피격이벤트 구현

by Meaning_ 2021. 9. 26.
728x90
반응형

#1_ 함정(가시) 추가


타일 팔레트에 Sprites에 있는 가시 모양을 드래그 드롭 해준다.

 

그리고 가시를 놓을 타일맵을 하나더 생성한다. 나는 Spike로 이름을 지어줬다.

 

 

이런식으로 Grid라는 큰 타일맵 안에 Spike와 Platform(아까 처음 만든 타일맵)을 각각 넣어준다. 

가시 모양을 브러쉬를 이용해서  타일맵 위 원하는 부분에 놓아주면된다.

 

적에 대한 태그와 레이어를 각각 설정해주어 Spike에 적용해준다. 

몬스터 또한 태그와 레이어를 enemy로 설정해준다. 

 

플레이어의 경우 2가지 레이어 (Player와 PlayerDamaged)를 사용할 것이다. 

 

#2_ 물리 레이어 설정


edit ->project settings ->physics 2D에 가장 밑에는

위의 사진처럼 물리 레이어가 있다.

enemy와 enemy 끼리는 충돌하지 않아야 하므로 체크박스를 꺼준다. 

그럼 몬스터가 가시를 무시하고 지나가게된다. 

무적시간 설정을 위해서 PlayerDamaged 일때는 Enemy를 무시하기 위해 체크박스를 꺼준다. 

 

레이어를 PlayerDamaged로 놓은 결과 

플레이어가 가시(enemy)를 무시하고 지나가는 것을 볼 수 있다. 

 

 

#3_몬스터와의 충돌 이벤트


몬스터와의 충돌을 감지하는 OnCollisionEnter2D 메서드를 만들어준다.

 

1
2
3
4
5
6
7
void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            Debug.Log("플레이어가 맞았습니다!");
        }
    }
cs

 

 

몬스터와의 충돌도 잘 감지하는 것을 확인했다!

 

#4_ 무적시간


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            OnDamaged(collision.transform.position);//충돌했을때 x축,y축 넘김
        }
    }
 
    //무적시간
    void OnDamaged(Vector2 targetPos)
    {
        //gameObject는 자기자신을 의미
        //충돌시 플레이어의 레이어가 PlayerDamaged 즉,11번 레이어로 변해야 
        gameObject.layer = 11;
        spriteRenderer.color = new Color(1110.4f);//무적시간일 때 플레이어가 투명하게
        //한대 맞으면 튕겨나가게
        int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
        //오른쪽으로 맞으면 오른쪽으로 튕겨나가고 왼쪽으로 맞으면 왼쪽으로 튕겨나가고
        rigid.AddForce(new Vector2(dirc, 1)*7, ForceMode2D.Impulse);
    }
cs

 

if (collision.gameObject.tag == "Enemy")

        {

            OnDamaged(collision.transform.position);//충돌했을때 x축,y축 넘김

        }

-->  충돌했을때 Vector2 를 OnDamaged 함수에 넘겨준다.

 

gameObject.layer = 11;

 

--> 무적시간이 됐을때는 레이어를 PlayerDamaged에 해당하는 11번으로 바꿔줌으로써 enemy를 무시한다. 

 

spriteRenderer.color = new Color(1110.4f);/

 

--> 플레이어의 색깔을 투명색으로 해준다. 

 

충돌했을 때 플레이어가 튕겨나가게 하려면

 

int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;

--> 현재위치랑 충돌했을 때 위치가 0보다 크면 1, 아니면 -1 

 

rigid.AddForce(new Vector2(dirc, 1)*7, ForceMode2D.Impulse);

-->전자는 오른쪽으로 튕겨나가고, 후자는 왼쪽으로 튕겨나간다.

 

#4_ 무적시간 해제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void OnDamaged(Vector2 targetPos)
    {
        //gameObject는 자기자신을 의미
        //충돌시 플레이어의 레이어가 PlayerDamaged 즉,11번 레이어로 변해야 
        gameObject.layer = 11;
        spriteRenderer.color = new Color(1110.4f);//무적시간일 때 플레이어가 투명하게
        //한대 맞으면 튕겨나가게
        int dirc = transform.position.x - targetPos.x > 0 ? 1 : -1;
        //오른쪽으로 맞으면 오른쪽으로 튕겨나가고 왼쪽으로 맞으면 왼쪽으로 튕겨나가고
        rigid.AddForce(new Vector2(dirc, 1)*7, ForceMode2D.Impulse);
 
        Invoke("OffDamaged"3);
    }
 
    void OffDamaged()
    {
        gameObject.layer = 10;
        spriteRenderer.color = new Color(1111);
    }
cs

 

무적시간 해제하는 함수는 OffDamaged이고

무적시간을 3초 정도 주고 싶으면 Invoke함수를 이용하면된다.

 

 

 

#5_애니메이션


플레이어가 enemy를 만났을 때 튕겨나가는데 거기에도 애니메이션을 넣어보겠다.

 

얘네 두개를 player에 넣어준다음 이름은 PlayerDamaged로 지어준다.

 

 

playerDamaged 의 애니메이션의 경우 2동작 밖에 없어서 0.0초부터 0.02초까지 동작하는데

Alt+마우스휠로 줌아웃 하면서 0.01초부터 0.03초까지 동작하게 바꿔준다. 

+) Alt + 마우스 휠 : 타임라인 줌인, 줌아웃 

 

Animaotr의 AnyState와 Exit는 무엇일까?

 

우선 Trigger의 파라미터를 하나 생성해준다.

 

Trigger

:방아쇠 역할의 매개변수, 값이 없다는 것이 특징

 

이런식으로 셋을 연결해준다.

 

AnyState -> Exit 

 

: 현재 상태와 상관없이 실행 후 복귀하는 것을 의미한다. 

AnyState 설정은

1.겹치는 부분 제거 2. HasExitTime제거 3.doDamaged 설정해주기

 

Exit의 설정은

 

 

1. HasExitTime 그대로 두기 ! 끄지 않을 것! 2, doDamaged 설정하지 않음

 

이렇게 하면 플레이어가 enemy들과 충돌했을 때 꽈당 하면서 튕겨나가는 효과를 준다.

 

+) HasExitTIme

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gold_metal&logNo=220491375543 

 

[유니티 기초] 10. 애니메이터 다루기

안녕하세요. 어느새 유니티 강좌가 10장까지 나가게 되었군요. 이번에는 메카님을 사용하여 애니메이터를 ...

blog.naver.com

 

728x90
반응형

댓글