[Unity][2D-Game] Undead Survivor (14+)

suhan0304·2023년 11월 11일
0

유니티 - Undead Survivor

목록 보기
18/21
post-thumbnail
post-custom-banner

Review

  • 캐릭터 선택 UI를 구현했다.
  • 기존 게임 시작 버튼을 그대로 2개 사용하여 캐릭터 별로 시작 버튼을 만들었다.
  • 이 때 플레이어 아이디를 매개변수로 넘겨줘 아이디에 맞는 캐릭터가 선택되도록 구현했다.
  • 캐릭터의 특성이 적용되도록 Character.cs를 만들어서 로직을 구현했다.

강의영상 (14+) - 캐릭터 해금 시스템


개발

추가 캐릭터 버튼

추가적인 캐릭터 버튼을 2개 더 만든다. 화면에 잘 들어오도록 위치를 살짝 조정해주었다. 이 때 버튼별 OnClick 이벤트의 게임 시작 함수 매개변수를 캐릭터에 맞게 변경한다.


잠금과 해금

2번 버튼을 Ctrl+D 해준후 Character 2 (Lock)으로 이름 설정 후 Button 컴포넌트를 삭제해준다. 기존 Character 2 버튼은 비활성화

  • Panel의 색을 회색으로 설정
  • icon의 색을 검정으로 설정
  • Text Name은 삭제
  • Text Adv의 문구 설정, 색 검정, OutLine 컴포넌트 삭제, Pos Y = -12로 설정

동일한 방법으로 Character 3 (Lock)도 만들어준다.

이제 잠금 해금을 관리할 AchiveManager을 하나 만들어준다.

public GameObject[] lockCharacter;      //잠금된 캐릭터 버튼
public GameObject[] unlockCharacter;    //해제된 캐릭터 버튼

다음과 같이 선언 후 인스펙터에서 (Lock)버전 버튼과 해제버전 버튼을 각각 추가해준다.

AchiveManager.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AchiveManager : MonoBehaviour
{
    public GameObject[] lockCharacter;      //잠금된 캐릭터 버튼
    public GameObject[] unlockCharacter;    //해제된 캐릭터 버튼

    enum Achive { UnlockPotato, UnlockBean }

    Achive[] achives;

    void Awake()
    {
        //Achive 열거형을 achives 리스트에 저장
        achives = (Achive[])Enum.GetValues(typeof(Achive));
        if (!PlayerPrefs.HasKey("MyData")) // MyData가 없으면 처음 실행을 의미
        {
            Init(); 
        }
    }

    void Init()
    {
        //PlayerPrefs는 유니티에서 제공하는 저장 기능

        PlayerPrefs.SetInt("MyData", 1); //MyData라는 키에 1을 저장

        //모든 업적을 초기화
        foreach (Achive achive in achives)
        {
            PlayerPrefs.SetInt(achive.ToString(), 0);
        }
    }

    void Start()
    {
        UnlockCharacter();
    }

    void UnlockCharacter()
    {
        for(int i = 0; i < lockCharacter.Length; i++)
        {
            string achiveName = achives[i].ToString();//업적 이름 가져오기
            bool isUnlock = PlayerPrefs.GetInt(achiveName) == 1; //업적 이름에 해당하는 데이터 가져오기

            lockCharacter[i].SetActive(!isUnlock); //해금이 된 잠금 버튼은 비활성화
            unlockCharacter[i].SetActive(isUnlock); //해금이 된 캐릭터 버튼은 활성화
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Enum.GetValues : 주어진 열거형의 데이터를 모두 가져오는 함수
PlayerPrefs : 간단한 저장 기능을 제공하는 유니티 제공 클래스

만약 저장된 PlayerPrefs를 지우고 싶다면?

Edit > Clear All PlayerPrefs 메뉴로 데이터 지우고 테스트


업적 달성 로직

이제 업적 조건을 확인하도록 로직을 AchiveManager에서 확인한다.

AchiveManager.cs

void LateUpdate()
{
    foreach (Achive achive in achives)
    { //업적 배열안에 있는 업적들 확인
        CheckAchive(achive);
    }
}

void CheckAchive(Achive achive) //업적 달성을 위한 함수
{
    bool isAchive = false;

    switch (achive)
    {
        case Achive.UnlockPotato://킬수가 10 이상이면
            isAchive = GameManager.Instance.kill >= 10;
            break;

        case Achive.UnlockBean: // 게임시간이 최대까지 버티면 (생존)
            isAchive = GameManager.Instance.gameTime == GameManager.Instance.maxGameTime;
            break;
    }
    //업적 달성 + 해금이 안된 상태이면 해금 진행
    if (isAchive && PlayerPrefs.GetInt(achive.ToString()) == 0)
    {
        PlayerPrefs.SetInt(achive.ToString(), 1);//업적 해금
    }
}


해금 알려주기

이제 해금이 됐다는 사실을 알려주기 위해 UI를 추가해보자.

  • Notice로 설정
  • Shadow 컴포넌트 추가
  • Panel 이미지로 설정
  • Width / Height = 50 / 27로 설정
  • Pos X / Pos Y = -3 / -20으로 설정
  • 오른쪽 상단으로 앵커 설정

각 업적 정보를 넣을 자식 오브젝트 추가

  • 이름을 UnlockPotato로 설정
  • 앵커를 꽉 채우게 설정

UnlockPotato 자식으로 Image 오브젝트 생성

  • 이름을 icon으로 설정
  • 이미지 Stand 0 ( 감자 농부 ) 설정
  • Pos X / Pos Y = 1 / 1로 설정

UnlockPotato 자식으로 Text 오브젝트 생성

  • 앵커를 좌우 꽉차게 설정
  • 글자를 세로로 가운데 정렬
  • Left = 20으로 설정
  • 글꼴 nedogm, 사이즈를 5, Line Spacing = 1.2, 문구를 다음 사진과 같이 수정

다 만들었으면 해당 UnlockPotato를 Ctrl+D로 하나 더 만들고 UnlockBean을 하나 만들어준다.

이제 모든 자식 업적 오브젝트들을 비활성화 해준 후 Notice 오브젝트 까지 비활성화 시켜준다.

알림 오브젝트를 저장할 변수을 AchiveManager안에 선언해 준후 인스펙터에서 초기화 해준다.

public GameObject uiNotice;

이제 checkAchive에서 해당 업적을 달성하면 Notice가 활성화되도록 로직을 작성한다. 이 때 노티스가 뜨고 몇 초 있다가 사라져야 하므로 코루틴을 사용한다.

enum의 업적 순서들과 Notice의 업적 오브젝트들의 배치 순서가 동일해야 로직이 잘 동작한다.


결과물

profile
Be Honest, Be Harder, Be Stronger
post-custom-banner

0개의 댓글