본문 바로가기
Unity/2D

[Unity 2D] 2D게임만들기 #8_스테이지를 넘나드는 게임 완성하기

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

#1_ 플레이어 이동


오른쪽과 왼쪽키를 동시에 누르면 문워크하는 현상이 발생하는데

이는 GetButtonDown을 사용할경우 키 입력이 겹치는 구간에서 문제가 발생한다.

이 부분을

GetButton으로 바꾸어준다.

 

#2_몬스터 잡기


몬스터보다 위에 있음 + 아래로 낙하 중 = 밟음. --> 몬스터 die의 로직을 짜볼 것이다.

 

우선 player 클래스는

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            // 공격 --> 낙하 중이면서 플레이어의 위치가 enemy의 위치보다 높을 때 
            if (rigid.velocity.y < 0 && transform.position.y > collision.transform.position.y)
            {
                OnAttack(collision.transform);
            }
            else //데미지입음
            {
                OnDamaged(collision.transform.position);//충돌했을때 x축,y축 넘김
            }
        }
    }
    void OnAttack(Transform enemy)
    {
        //reaction force
        rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse);
        // enemy die
        EnemyMove enemyMove = enemy.GetComponent<EnemyMove>();
        enemyMove.OnDamaged(); //enemy입장에서 데미지 입은거
    }
cs

 

enemy 클래스는

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public void OnDamaged()
    {
        // 투명하게 변함
        spriteRenderer.color = new Color(1110.4f);
        //방향 바꿔주기
        spriteRenderer.flipY = true;
        //콜라이더 비활성화
        capsuleCollider.enabled = false;
        //die effect jump
        rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse);
        //5초 뒤에 사라짐
        Invoke("DeActive"5);
 
 
    }
 
    void DeActive()
    {
        gameObject.SetActive(false);
    }
cs

 

여기서 capsuleCollider는 위에서 capsuleCollider2D를 GetComponent 한것이다.

 

몬스터가 투명해지면서 떨어지게 된다. 

 

#3_아이템


동전 아이템을 먹었을 때 투명해지면서 사라지는 효과를 줘볼 것이다.

 

아이템들의 tag를 다 Item으로 설정한다.

동전 아이템들이 반짝반짝 돌아가는 효과는 애니메이션으로 주면된다.

콜라이더+스프라이트+애니메이션 작업으로 구현하면되는데

isTrigger 꼭 켜줘야한다. 안그러면 플레이어가 아이템을 먹는 효과가 나지 않는다.

(OnTriggerEnter2D 메서드로 동전과 플레이어가 충돌할 때 동전이 사라질 것이기 때문에..!)

 

1
2
3
4
5
6
7
8
9
10
11
12
    //동전
 
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Item")
        {
            //point
 
            //사라짐
            collision.gameObject.SetActive(false);
        }
    }
cs

 

플레이어 클래스에 위 코드를 넣어준다.

 

#4_결승선


결승선과 플레이어가 충돌하면 다음단계로 넘어가는 로직을 작성해준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Item")
        {
            //point
 
            //사라짐
            collision.gameObject.SetActive(false);
        }
        else if (collision.gameObject.tag == "Finish")
        {
            //next stage
        }
    }
cs

 

#5_ 게임 매니저 


매니저는 점수와 스테이지를 관리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class GameManager : MonoBehaviour
{
    public int totalPoint;
    public int stagePoint;
    public int stageIndex;
    void Start()
    {
        
    }
 
    // Update is called once per frame
    void Update()
    {
        
    }
}
 
cs

 

위 코드 처럼 GameManager 스크립트를 만들어야한다.

 

플레이어 클래스에서 매니저 변수를 만들어 게임 매니저의 점수 변수에 접근하게 한다. 

 

하이어라키 창의 GameManager를 Player의 GameManager 변수에 집어 넣는다

이렇게 되면 Player클래스에서도 게임 매니저에 점수 변수에 접근할 수 있게 됐다.

맨 위에 GameManager 객체 가져오고,

이렇게 동전과 충돌했을 때 100점을 먹는다.

근데 동전마다 차등으로 점수를 더해주고 싶으면 어떻게 할까?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Item")
        {
            //point
            bool isBronze = collision.gameObject.name.Contains("CoinB");
            bool isSilver = collision.gameObject.name.Contains("CoinS");
            bool isGold = collision.gameObject.name.Contains("CoinG");
            if (isBronze)
            {
                gameManager.stagePoint += 50;
            }else if (isSilver)
            {
                gameManager.stagePoint += 100;
            }
            else if (isGold)
            {
                gameManager.stagePoint += 300;
            }
 
cs

 

 

Contains(비교문)

: 대상 문자열에 비교문이 있으면 true

 

동전을 먹었을 때 게임 매니저의 stage point가 늘어남을 확인할 수 있다.

 

게임 매니저에서 NextStage()라는 메서드를 만들고

플레이어 클래스에서

NextStage 로 이동할 수 있게끔한다. 

728x90
반응형

댓글