GameDev/Cubidom

Cubidom 적 난이도 선택

SMNNMN 2026. 3. 19. 02:06

이번엔 만들 기능은 적의 난이도를 선택할 수 있는 화면을 만들 것이다. 

먼저 저번에 만든 Start 버튼을 눌렀을 때 적의 난이도를 고르는 화면으로 전환되고, 난이도를 선택한 뒤에 Play버튼을 누르면 해당난이도로 게임이 시작되게끔 할 것이다. 

먼저 난이도를 선택할 떄, 보일 화면의 비출 카메라 전환을 위해서 Cinemahcine을 사용한다. 

난이도 선택 화면의 경우 가운데 적의 코어가 보이고, 중요한건 Projection을 기존 Orthographic에서 Perspective로 바뀌기 때문에, Cinemachine Brain에 Lens Mode Override를 체크한뒤, 따로 덮어쓰지 않을 것이기 때문에 None으로 해주었다. 

이후 각각의 Cinemachine 카메라의 Mode Override를 설정해준다.

게임 대기화면, 게임 시작화면의 경우 Orthographic으로, 난이도 선택화면은 Perspective로 설정한다. 

 

 

게임 대기화면 -> 난이도 선택화면

public event Action enemySelete;

   
   public void EnemySelete() // 적 난이도를 선택하는 단계
    {
        enemySelete?.Invoke();
    }

그 이후 enemySelete라는 델리게이트를 만들어 주고,  기존 Start 버튼이 호출하는 함수를 EnemySelete함수로 바꾸어준다.

 

 

CameraMovement


    [SerializeField] List<CinemachineCamera> cams = new List<CinemachineCamera>();
    [SerializeField] CinemachineCamera standbyCam;
    [SerializeField] CinemachineCamera playingCam;
    [SerializeField] CinemachineCamera enemyCam;
    private CinemachineCamera controllCam;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {

        GameManager.Instance.enemySelete += enemySeleteCam;
        GameManager.Instance.gameStart += gameStartCam;
        // GameManager.Instance.gameStart += ChangeCamera;
    }

    void enemySeleteCam()
    {
        ChangeCamera(enemyCam);
    }
    void gameStartCam()
    {
        ChangeCamera(playingCam);
        pitch = transform.rotation.eulerAngles.x;
        yaw = transform.rotation.eulerAngles.y;
    }
    public void ChangeCamera(CinemachineCamera myCam)
    {
        Debug.Log(myCam);
        foreach(var cam in cams)
        {
            cam.Priority = 0;
        }
        myCam.Priority = 10;
        controllCam = myCam;

        // playingCam.Priority += 10;
        // controllCam = playingCam;
    }

전환되는 카메라 수가 많아졌기 때문에, 카메라 전환 구현 코드를 새롭게 작성한다. 

cams라는 Cinemachine 카메라 리스트를 만들어서 관리하고, ChangeCamera 함수로 리스트에 있는 모든 카메라의 우선순위를 바꾸고, 원하는 가장 높은 카메라의 우선순위를 높혀서 전환 기능을 구현한다. 

 

 

UIManager

    void Start()
    {
        GameManager.Instance.enemySelete += enemyLevel;
        GameManager.Instance.gameStart += playStart;
    }

    private void OnDisable()
    {
        GameManager.Instance.enemySelete -= enemyLevel;
        GameManager.Instance.gameStart -= playStart;
    }
    void enemyLevel() // 적 난이도 UI
    {
        enemyLevels.SetActive(true);
        nextButton.SetActive(true);
    }

여기선 난이도 버튼 UI를 생성시킨다. 

 

난이도 버튼의 경우 Vertical LayOut Group을 사용하여 만들어주었다. 

 

난이도 선택화면 -> 게임시작 화면

UIManager

    void playStart() // 게임시작 시 UI
    {
        enemyLevels.SetActive(false);
        nextButton.SetActive(false);

        resourceValue_T.gameObject.SetActive(true);
    }

그리고 만든건 NextButton이라는 버튼을 통해서 클릭시 게임이 시작되게끔 하였다. 저번에 만든 Start버튼과 동일한 시스템이다. 

 

 

전체적으로 델리게이트를 사용해서 흐름을 제어했다.

 

난이도에 따른 적 Material색 바꾸기

 

GameManager

    public event Action changeMaterial;


    public int enemyLevel = 1;

    public void EnemyLevel(int level)
    {
        enemyLevel = level;
        changeMaterial?.Invoke();
    }

먼저 난이도 버튼을 눌렀을 때, EnemyLevel 함수를 호출해서 현재 적의 난이도값을 넣는다.

 

 

using UnityEngine;

public class EnemyVisual : MonoBehaviour
{
    private MeshRenderer render;

    private void Awake()
    {
        render = GetComponent<MeshRenderer>();
    }
    private void Start()
    {
        GameManager.Instance.changeMaterial += ChangeMaterial;
    }
    void ChangeMaterial()
    {
        render.material = Resources.Load<Material>("Materials/Enemy_Level/EnemyCore_M " + GameManager.Instance.enemyLevel);
    }
    private void OnDisable()
    {
        GameManager.Instance.changeMaterial -= ChangeMaterial;

    }
}

이후 EnemyVisual이라는 스크립트를 통해 GameManger의 changeMaterial에 material 변경함수를 구독한다.

오브젝트의 Material 변경은 MeshRenderer를 통해 변경한다. 

Material을 변경할 때 사용한 방법은 Resources.Load를 사용해서 프로젝트에 있는 "Resources"파일에 접근해서 안에 있는 오브젝트를 사용할 수 있게한다. 

각 난이도 Material 이름을 통일시키고 끝에 숫자를 적어 GameManager의 enemyLevel를 사용해서 material을 가져온다. 

 

완성본

 

다음 해야할 것은 각 난이도에 따른 적 Ai의 행동을 만들 것이다. 이 부분은 ScriptableObject로 만들것이다. 

 

'GameDev > Cubidom' 카테고리의 다른 글

Cubidom 게임 종료 UI  (0) 2026.03.20
Cubidom 적 난이도 세팅  (0) 2026.03.20
Cubidom 게임 시작 시스템  (0) 2026.03.18
Cubidom 카메라 컨트롤  (0) 2026.03.16
Cubidom 설치 UI 시스템  (0) 2026.03.11