https://www.youtube.com/watch?v=QxsH5fE0iAo&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=19
1. 추가 캐릭터 버튼
기존 캐릭터 버튼을 Ctrl + D 로 복사하여 2개 생성 및 이름 변경
각각 새로운 캐릭터 버튼으로 편집(Icon, Text, Color 등)
OnClick 이벤트의 게임 시작 함수 매개변수를 캐릭터에 맞게 변경
Spacing와 크기 조정
2. 잠금과 해금
새로운 캐릭터 버튼 하나를 Ctrl + D로 추가 (Character 2 (Lock))
미해금인 Character 2,3 를 비활성화
잠금일 땐 누를 필요가 없으므로 Button 컴포넌트 제거
이미지 색 회색으로 변경
실루엣처럼 보이기 위해 아이콘 이미지의 색상을 검은색으로 지정
캐릭터 이름 제거
특성 텍스트는 해금 달성 조건으로 변경
Line Spacing, Out line, Pos Y 조정
Ctrl + D로 복사후 Character 3의 Lock 버전 생성 및 수정
업적, 해금을 관리하는 스크립트 생성 (AchiveManager)
빈 오브젝트 추가하여 업적 매니저로 편집
잠금, 해금 버튼들을 담을 변수 추가 및 초기화
public class AchiveManager: MonoBehaviour
{
public GameObject[] lockCharacter;
public GameObject[] unlockCharacter;
}
- 여러개의 버튼이 들어가기 때문에 배열로 선언
- 까먹기 전에 2개씩 만들어서 버튼들을 할당
업적 데이터와 같은 열거형 enum 작성
public class AchiveManager: MonoBehaviour
{
enum Achive { UnlockPotato, UnlockBean }
Achive[] achives;
void Awake()
{
achives = (Achive[])Enum.GetValues(typeof(Achive));
}
}
- Enum.GetValues : 주어진 열거형의 데이터를 모두 가져오는 함수
- Enum.GetValues 앞에 타입을 명시적으로 지정하여 타입 맞추기
저장 데이터 초기화 함수 작성
void Init()
{
PlayerPrefs.SetInt("MyData", 1);
foreach (Achive achive in achives)
{
//초기화 설정
PlayerPrefs.SetInt(achive.ToString(), 0);
}
}
- PlayerPrefs : 간단한 저장 기능을 제공하는 유니티 제공 클래스
- SetInt 함수를 사용하여 Key와 연결된 int형 데이터를 저장
- 업적 데이터와 동일한 이름의 key로 0을 저장
- foreach를 활용하여 순차적으로 데이터 저장
- C언어는 0,1 bool연동 되지만 C#은 불가능
게임을 처음 실행할 때만 초기화 하게 하기
void Awake()
{
achives = (Achive[])Enum.GetValues(typeof(Achive));
//데이터가 없다면 초기화
if (!PlayerPrefs.HasKey("MyData"))
{
Init();
}
}
- HasKey 함수로 데이터 유무 체크 후 초기화 실행
캐릭터 버튼 해금을 위한 함수 새롭게 작성 (UnlockCharacter)
void Start()
{
UnlockCharacter();
}
void UnlockCharacter()
{
for (int index=0; index<lockCharacter.Length; index++)
{
string achiveName = achives[index].ToString();
bool isUnlock = PlayerPrefs.GetInt(achiveName) == 1;
lockCharacter[index].SetActive(!isUnlock);
unlockCharacter[index].SetActive(isUnlock);
}
}
- 잠금 버튼 배열을 순회하면서 인덱스에 해당하는 업적 이름 가져오기
- GetInt 함수로 PlayerPrefs에 저장된 업적 상태를 가져와서 버튼 활성화에 적용
Edit > Clear All PlayersPrefs 메뉴로 데이터 지우고 테스트
3. 업적 달성 로직
AchiveManager.cs
void LateUpdate()
{
foreach(Achive achive in achives)
{
CheckAchive(achive);
}
}
- 한타임 늦게 실행하기 위해서 LateUpdate에서 실행
- 모든 업적 확인을 위한 반복문을 LateUpdate에 작성
업적 달성을 위한 함수 새롭게 작성
void CheckAchive(Achive achive)
{
bool isAchive = false;
switch (achive)
{
case Achive.UnlockPotato:
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);
for (int index = 0; index<uiNotice.transform.childCount; index++)
{
bool isActive = index == (int)achive;
uiNotice.transform.GetChild(index).gameObject.SetActive(isActive);
}
}
}
- switch ~case문으로 각 업적 달성 조건을 작성
- 해당 업적이 처음 달성 했다는 조건을 if문에 작성
4. 해금 알려주기
알람 UI의 바탕 이미지 생성
- Canvas에서 Image생성 (Panel) , 크기 50 20, Anchor 우상단, Pos x -30 y -20, 이름 Notice, Shadow
Empty만들고
각 업적 정보를 넣을 자식 오브젝트 추가
- Shift + Alt 눌러서 전체 확장
- 이미지(캐릭터, 텍스트 자식으로 추가)
이미지 Anchor 좌측, Pos x,y : 1,1
텍스트 Anchor 좌측, 여백 왼20 오1, 내용 변경, 글꼴 변경
업적 정보 Ctrl + D해서 콩농부용 Notice 완성
모든 자식 오브젝트와 무보 오브젝트 비활성화\
알림 오브젝트를 저장할 변수 선언 및 초기화 (AchiveManager.cs)
public class AchiveManager: MonoBehaviour
{
...
public GameObject uiNotice;
...
}
- 인스펙터에서 바로 초기화 하기 (Notice 드래그)
CheckAchive 함수 안에서 활성화 기능 만들기
(알림 창을 활성화했다가 일정 시간 이후 비활성화하는 코루틴 생성)
IEnumerator NoticeRoutine()
{
uiNotice.SetActive(true);
yield return new WaitForSecond(5);
uiNotice.SetActive(false);
}
yield return new WaitForSecond(5) 대신에 최적화를 위해 선언부에서 초기화 해주기
public class AchiveManager: MonoBehaviour
{
...
WaitForSecondsRealtime wait;
...
void Awake()
{
...
wait = new WaitForSecondsRealtime(5f);
...
void CheckAchive(Achive achive)
{
...
StartCoroutine(NoticeRoutine());
}
}
IEnumerator NoticeRoutine()
{
uiNotice.SetActive(true);
yield return wait;
uiNotice.SetActive(false);
}
}
- WaitForSecondsRealtime 변수 선언 및 초기화
-- WaitForSecondsRealtime 은 현실 기반 시간을 기준으로 작동한다 (시간 흐름 멈춰도 계산됨)
void CheckAchive(Achive achive)
{
...
if (isAchive && PlayerPrefs.GetInt(achive.ToString()) == 0)
{
PlayerPrefs.SetInt(achive.ToString(), 1);
//각각 Active로 바꿔서 알림창 뜨게 해줌
for (int index = 0; index<uiNotice.transform.childCount; index++)
{
bool isActive = index == (int)achive;
uiNotice.transform.GetChild(index).gameObject.SetActive(isActive);
}
StartCoroutine(NoticeRoutine());
}
}
- childCount로 자식의 수를 계산
- transform이기 때문에 .gameObject를 적어줘야 SetActive()를 사용할 수 있다. //공부가 필요하다.
- 알림 창의 자식 오브젝트를 순회하면서 순번이 맞으면 활성화 (int 명시적 형변환)
깃허브 올리기
Commit : ver 1.13
Description : Play Character Unlock //하지만 Character 2,3번의 애니메이션을 아직 구현하지 않았습니다.
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 15 (편리한 오디오🔊시스템 구축) (0) | 2023.05.25 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14 (플레이 캐릭터🧑🤝🧑선택 ) (0) | 2023.05.11 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 13 (게임 시작과 종료) (0) | 2023.05.11 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 12 (레벨업🥳시스템) (0) | 2023.05.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기) (0) | 2023.05.10 |