추가적인 캐릭터 버튼을 2개 더 만든다. 화면에 잘 들어오도록 위치를 살짝 조정해주었다. 이 때 버튼별 OnClick 이벤트의 게임 시작 함수 매개변수를 캐릭터에 맞게 변경한다.
2번 버튼을 Ctrl+D 해준후 Character 2 (Lock)으로 이름 설정 후 Button 컴포넌트를 삭제해준다. 기존 Character 2 버튼은 비활성화
동일한 방법으로 Character 3 (Lock)도 만들어준다.
이제 잠금 해금을 관리할 AchiveManager을 하나 만들어준다.
public GameObject[] lockCharacter; //잠금된 캐릭터 버튼
public GameObject[] unlockCharacter; //해제된 캐릭터 버튼
다음과 같이 선언 후 인스펙터에서 (Lock)버전 버튼과 해제버전 버튼을 각각 추가해준다.
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 : 간단한 저장 기능을 제공하는 유니티 제공 클래스
Edit > Clear All PlayerPrefs 메뉴로 데이터 지우고 테스트
이제 업적 조건을 확인하도록 로직을 AchiveManager에서 확인한다.
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를 추가해보자.
각 업적 정보를 넣을 자식 오브젝트 추가
UnlockPotato 자식으로 Image 오브젝트 생성
UnlockPotato 자식으로 Text 오브젝트 생성
다 만들었으면 해당 UnlockPotato를 Ctrl+D로 하나 더 만들고 UnlockBean을 하나 만들어준다.
이제 모든 자식 업적 오브젝트들을 비활성화 해준 후 Notice 오브젝트 까지 비활성화 시켜준다.
알림 오브젝트를 저장할 변수을 AchiveManager안에 선언해 준후 인스펙터에서 초기화 해준다.
public GameObject uiNotice;
이제 checkAchive에서 해당 업적을 달성하면 Notice가 활성화되도록 로직을 작성한다. 이 때 노티스가 뜨고 몇 초 있다가 사라져야 하므로 코루틴을 사용한다.
enum의 업적 순서들과 Notice의 업적 오브젝트들의 배치 순서가 동일해야 로직이 잘 동작한다.