https://www.youtube.com/watch?v=Lt2Q9glJlw0&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=17&t=1634s
1. 게임 시작
isLive를 버튼을 눌러서 켜지게끔
UI의 새로운 빈 오브젝트를 생성
- Canvas > Create Empty (Game Start)
Game Start 아래 이미지 생성
Title 0를 이미지에 넣고 Set Native Size 클릭
+세부 조정(위치, Title)
Shadow : UI 그래픽을 기준으로 그림자를 생성하는 컴포넌트
게임 시작을 담당하는 버튼 추가
- UI > Legacy > Button (Button Start)
+세부 조정(60,20)
컬러 선택 창의 스포이드로 자유로운 색상 선택 가능
버튼의 Navigation 속성을 Non을 변경
아래의 자식 Text의 폰트 변경 + 세부 조정
Outline : UI 그래픽을 기준으로 외각선을 그리는 컴포넌트
- 0.5로 설정
+ 세부 조정
Button Start의 On Click에 GameStart 객체를 집어넣고 GameObject의 SetActive 클릭
게임 오브젝트의 함수 SetActive는 OnClick 이벤트에 바로 사용 가능
Canvax > 우클릭 > Create Empty (HUD)
HUD 관련된 5가지 오브젝트를 새로운 오브젝트에 넣어두기
Button Start의 On Click에 GameStart 객체를 집어넣고 GameObject의 SetActive 클릭하고 체크활성화
HUD 오브젝트는 미리 비활성화
게임매니저의 기존 Start 함수를 GameStart로 변경
public void GameStart()
{
maxHealth = 100;
health = maxHealth;
isLive=true;
}
- public 선언
- isLive=true;
Button Start의 On Click에 GameManager 객체를 집어넣고 GameManager의 StartGame클릭하고
2. 플레이어 피격
Player.cs의 OnCollisionStay2D 이벤트 함수 작성
private void OnCollisionStay2D(Collision2D collision)
{
if (!GameManager.instance.isLive)
return;
GameManager.instance.health -= Time.deltaTime * 10;
if (GameManager.instance.health<0)
{
for(int index = 2; index < transform.childCount; index++)
{
transform.GetChild(index).gameObject.SetActive(false);
}
anim.SetTrigger("Dead");
GameManager.instance.GameOver();
}
}
- Time.deltaTime을 활용하여 적절한 피격데미지 계산
- 게임매니저의 생명력 관련 변수를 float형으로 변경
- 생명력이 0보다 작다를 if로 작성
- childCount : 자식 오브젝트의 개수
- GetChild : 주어진 인덱스의 자식 오브젝트를 반환하는 함수
- 애니메이터 SetTrigger 함수로 죽음 애니메이션 실행
3. 게임 오버
완성된 게임시작 오브젝트를 복사하여 게임결과로 활용
게임시작 버튼도 게임재시작 전용으로 변경
+세부 설정()
게임 매니저에 게임 재시작 함수 작성
using UnityEngine.SceneManagement;
public void GameRetry()
{
SceneManager.LoadScene(0);
}
- 장면 관리를 사용하기 위해 SceneManagement 네임스페이스 추가
- LoadScene : 이름 혹은 인덱스로 장면을 새롭게 부르는 함수
-- 씬의 이름이나 숫자로 넣을 수 있다.
--- File>Build Setting 에 들어가서 숫자를 볼 수 있다.
게임오버 담당 함수 작성
public void GameOver()
{
StartCoroutine(GameOverRoutine());
}
IEnumerator GameOverRoutine()
{
isLive = false;
yield return new WaitForSeconds(0.5f);
Stop();
}
- 딜레이를 위해 게임오버 코루틴도 작성
- 게임 결과에 따른 분기점이 필요하다
GameManager에 게임 결과 UI 오브젝트를 저장할 변수 선언 및 초기화
[Header("# Game Object")]
public Player player;
public PoolManager pool;
public LevelUp uiLevelUp;
public Result uiResult;
- 까먹기 전에 uiResult를 GameResult로 드래그해서 초기화
GameOver()
IEnumerator GameOverRoutine()
{
isLive = false;
yield return new WaitForSeconds(0.5f);
uiResult.gameObject.SetActive(true);
Stop();
}
Player
private void OnCollisionStay2D(Collision2D collision)
{
//...
GameManager.instance.GameOver();
}
}
- 게임오버 함수를 플레이어 스크립트에의 사망 부분에서 호출하도록 작성
- Button Retry에서 OnClick 초기화(할당) 해주기(GameRetry)
게임 실행 중, 인스펙터를 수정하면 게임 종료시 원래대로 돌아와요
4. 게임 승리
몬스터 정리 전용 빈 오브젝트 생성 (UI가 아니에요)
위치 (0,0,0)
박스 콜라이더 2D 추가(크기,1000*1000)
Bullet 스크립트 추가 후 엄청난 데미지(10000000) 설정 (Per -1로 설정 or -100)
총알 태그와 콜라이더의 IsTrigger설정
적 클리너 오브젝트도 미리 비활성화
GameResult에서 게임승리를 위한 이미지 추가 + 세부 설정()
게임 결과를 보여주는 스크립트를 새롭게 생성 및 컴포넌트로 등록(Result.cs)(GameResult에 추가)
Result.cs
public class Result : MonoBehaviour
{
public GameObject[] titles;
public void Lose()
{
titles[0].SetActive(true);
}
public void Win()
{
titles[1].SetActive(true);
}
}
- 이미지 오브젝트를 활성화하는 승리, 패배 함수 하나씩 작성
게임매니저의 기존 변수의 타입을 스크립트로 변경
public Result uiResult;
//...
IEnumerator GameOverRoutine()
{
isLive = false;
yield return new WaitForSeconds(0.5f);
uiResult.gameObject.SetActive(true);
uiResult.Lose();
Stop();
}
- SetActive를 하기 위해 uiResult에서 gameobject로 한단계 올라가야 한다.
- 게임매니저의 인스펙터를 다시 확인하여 변수 초기화
게임 결과 스크립트이 인스펙터에서도 변수 초기화
게임 승리할 때 적을 정리하는 클리너 변수 선언 및 초기화
[Header("# Game Object")]
//...
public GameObject enemyCleaner;
- 까먹기 전에 EnemyCleaner 인스펙터에서 할당
게임 승리 로직은 게임오버 로직을 복사해서 편집
public void GameVictory()
{
StartCoroutine(GameVictoryRoutine());
}
IEnumerator GameVictoryRoutine()
{
isLive = false;
enemyCleaner.SetActive(true);
yield return new WaitForSeconds(0.5f);
uiResult.gameObject.SetActive(true);
uiResult.Win();
Stop();
}
- 게임 승리 코루틴의 전반부에 적 클리너를 활성화
게임 시간이 최대 시간을 넘기는 때에 게임승리 함수 호출
void Update()
{
if (!isLive)
return;
gameTime += Time.deltaTime;
if (gameTime > maxGameTime)
{
gameTime = maxGameTime;
GameVictory();
}
}
게임 시작 함수 내에 시간 재개 함수 호출
public void GameStart()
{
maxHealth = 100;
health = maxHealth;
uiLevelUp.Select(0); //임시 스크립트 (첫번째 캐릭터 선택)
Resume();
}
죽일 때 경험치 얻는 함수에도 isLive 필터 추가
public void GetExp()
{
if (!isLive)
return ;
exp++;
if (exp == nextExp[Mathf.Min(level,nextExp.Length-1)])
{
level++;
exp = 0;
uiLevelUp.show();
}
}
게임 결과의 타이틀 오브젝트, 에너미 클리너는 모두 비활성화
깃허브 올리기
Commit : ver 1.13
Description : Game Start and End
'게임개발 > 언데드서바이벌_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14+ (캐릭터 해금🔓시스템) (0) | 2023.05.25 |
---|---|
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 14 (플레이 캐릭터🧑🤝🧑선택 ) (0) | 2023.05.11 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 12 (레벨업🥳시스템) (0) | 2023.05.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11+ (플레이어 무기 장착 표현하기) (0) | 2023.05.10 |
[클론코딩_유니티_골드메탈] 뱀서라이크 따라만들기 11 (능력 업그레이드💪구현) (0) | 2023.05.10 |