Development/Unity Engine

[Retro유니티] 발판 밟을 시 점수+=1 구현

사이바 미도리 2024. 11. 27. 00:38

목표

- Prefabs를 통한 발판구현

- OnEnable() 메서드

- 발판Generator 구현

- Object Pooling

- 미리 생성된 발판 재사용

 

 

발판만들기

지금은 StartPlatform 게임오브젝트의 발판(시작지점 발판) 뿐이다.

발판은 두 종류로 나뉘며, feature도 다르다.

1. 시작지점 발판

-> 별 기능 없다.

2. 그 이후 발판

-> 밟을 때마다, Scored를 +=1 한다.

 

Prefabs의 Platrofm을 Hierarchy로 드래그.

그 이후,

Platform 전체는 Sorting Layer를 Foreground로, 각 Obstacle들은 Middleground로 설정해준다.

 

(Prefab 만드는 법은, Bullet Prefab 생성하는 글을 참고하라)

 

Platform Prefab으로부터 생성한 Platform 게임오브젝트는, 아래 Component를 갖는다.

- Sprite Renderer

- Box Collider 2D

- Scrolling Object C# Script

그리고 자식으로, 3개 장애물 게임오브젝트를 가진다.

장애물은 배경보다는 앞에, Player와 발판보다는 뒤에 나와야 하므로, MiddleGround로 한다.

장애물 Game Object는 Deadzone과 마찬가지로 Dead 태그를 가진다.

 

발판 스크립트 작성

생성된 발판은 2개 feature가 필요하다.

1. 밟히면 Score증가

2. 일정확률로, 장애물 Game Object를 활성화.

해당 feature를, Platform 게임 오브젝트에 Platform C# Script로 구현해보자.

 

 

private void OnEnable(){ ... }

- OnEnable 메서드는, Awake나 Start처럼, Unity Event Method이다.

- Start 메서드처럼, Component가 활성화될 때, 자동으로 1번 실행된다.

- 최초 1회만 실행되는 Start와 달리, OnEnable 메서드는 컴포넌트가 활성화 될 때마다 매번 다시 실행된다.

  - Game Object 자체가 비활성화되면 당연히 OnEnable 메서드도 재실행된다(해당 Game Object의 모든 Component가 비활성회되므로). 따라서, 개별 Component를 끄거나 켜지 않고, Game Object를 끄고 켜는 방식으로 Component의 OnEnable 메서드를 재실행하는것도 가능하다.

- OnEnable 메서드는 주로, 게임 오브젝트 활성화때마다 상태를 리셋하는 기능용으로 사용된다.

 

우리는 발판 리셋코드를 OnEnable에 넣을 것이고, 리셋이 필요할 때마다 발판 Game Object를 끄고 다시 켤 것이다.

 

 

using UnityEngine;

// 발판으로서 필요한 동작을 담은 스크립트
public class Platform : MonoBehaviour {
    public GameObject[] obstacles; // 장애물 오브젝트들
    private bool stepped = false; // 플레이어 캐릭터가 밟았었는가

    // 컴포넌트가 활성화될때 마다 매번 실행되는 메서드
    private void OnEnable() {
        // 발판을 리셋하는 처리
        stepped = false;

        for(int i = 0; i < obstacles.Length; i++)
        {
            // 1/3 확률로 장애물 활성화
            if (Random.Range(0, 3) == 0) 
            {
                obstacles[i].SetActive(true);
            }
            else
            {
                obstacles[i].SetActive(false);
            }
        }
    }

    void OnCollisionEnter2D(Collision2D collision) {
        // 플레이어 캐릭터가 자신을 밟았을때 점수를 추가하는 처리
        if(collision.collider.CompareTag("Player") && !stepped)
        {
            // 중복 점수 추가를 방지하기 위해 stepped 변수를 사용
            stepped = true;
            GameManager.instance.AddScore(1);
        }
    }
}

그리고, public으로 선언한 obstacles에, obstacle left mid right 를 드래그해서 넣어주자.

 

장애물에 닿으면 죽는걸 확인할수있다.

 

 

TextMeshPro에 Score 연동하기

Score가 GameManager의 Score를 참조하여 숫자를 띄우게 하자.

초기값은

에 넣고,

GameManager에서

    // 점수를 증가시키는 메서드
    public void AddScore(int newScore) {
        if(!isGameover)
        {
            score += newScore;
            scoreText.text = "Score : " + score;
        }
    }

로 scoreText를 조작해준다.

매 frame마다 Update()에서 조작해도 되지만, AddScore시에만 업데이트하는게 성능상 더 좋으니까.

 

 

그 후, ScoreText를 드래그해주고(이미 했겠지만)

 

이걸 까먹었는데, Player에 Tag를 달아줘야한다. 아니면 isCollision이 with Player인지 알지를 못하니까.

 

여태까지의 Platform Prefab의 변경사항을 저장하자.

Apply All을 누르고, Hierarchy상의 Platform은 Delete한다.

 

 

이제, 이 발판을 반복생성해야한다.

이건 다음 공부때 하자.