오늘의 학습 키워드
1. Asset 없이 Sprite에 애니메이션 부여하기
Animation의 녹화 기능을 활용해 특정 시간에 Sprite가 어떤 형태(색, 모양 등)를 가져야 하는지 지정할 수 있다.
2. 마우스 포인터로 요소 움직이기
< Logic >
1) 지금 마우스의 위치가 어디인가?
= mouse의 좌표계를 카메라 좌표계로 바꾸고, 요소의 위치에 넣어주기
2) 마우스의 위치를 요의 위치와 동일시하기
= 요소의 위치를 변경시키는 방법 : transform.position 과 벡터값 활용
void Update()
{
Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = new Vector3(mousePos.x, mousePos.y, 0);
}
위 코드에서는 ScreenToWorld 가 핵심 키워드!
코드 전체를 암기하기보다 키워드 중심으로 외우면 효율적이다.
3. 게임 종료시키기 / 종료 시 상황 만들기
1) 게임 종료시키기
balloon에 square가 닿으면 게임이 종료된다. => balloon에 태그를 걸어준다.
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "balloon")
{
gameManager.I.gameOver();
}
}
2) 게임이 종료될 때 무슨 일이 일어나는가?
2-1) 시간 정지 : 더 이상 새로운 요소가 발생하지 않는다. => Time.timeScale = 0.0f
2-2) endPanel 띄우기 : endPanel.Setactive(true)
public GameObject endPanel;
public void gameOver()
{
Time.timeScale = 0.0f;
endPanel.SetActive(true);
}
4. 게임종료 시 기록된 시간과 실제 기록된 시간의 차이를 없애는 방법
* 왜 오차가 발생하는가?
= 게임종료 시에도 Update가 계속 이루어지고 있기 때문에 시간 기록에 오차가 발생한다.
* 해결방법
bool isRunning = true; 를 먼저 선언하고
Update를 if (isRunning) 상태일 때만 가동하도록,
그리고 void gameOver 상황에서 즉시 isRunning 을 false 로 만들면 된다.
bool isRunning = true;
void Update()
{
if (isRunning)
{
alive += Time.deltaTime;
timeTxt.text = alive.ToString("N2");
}
}
public void gameOver()
{
isRunning = false;
Time.timeScale = 0.0f;
thisScoreTxt.text = alive.ToString("N2");
endPanel.SetActive(true);
}
이를 통해 Update()와 gameOver() 간의 시간차를 없앨 수 있다.
5. 최고 점수 기록하는 방법 (새 게임이 실행되어도 유지되도록)
PlayerPrefs 를 활용해 Unity 내에 특정 값을 계속 기록하고 저장할 수 있다.
PlayerPrefs 는 데이터를 항상 key-value 페어로 저장한다.
이는 내가 저장하고 싶은 값에 라벨을 붙여 나중에 불러올 수 있게 하는 매커니즘이다.
<Logic>
if 최고 점수가 없으면 : 지금 점수 = 최고 점수
else
if 최고 점수 < 지금 점수 이면 : 지금 점수 = 최고 점수
public void gameOver()
{
isRunning = false;
Time.timeScale = 0.0f;
thisScoreTxt.text = alive.ToString("N2");
endPanel.SetActive(true);
if (PlayerPrefs.HasKey("bestScore") == false)
{
PlayerPrefs.SetFloat("bestScore", alive);
}
else
{
if (PlayerPrefs.GetFloat("bestScore") < alive)
{
PlayerPrefs.SetFloat("bestScore", alive);
}
}
}
* 함수 이해하기
1) bestScore가 존재하는가?
PlayerPrefs.HasKey("bestScore") == false 이면 bestScore가 없기 때문에 지금 점수 = 최고 점수 로 기록
2) PlayerPrefs.HasKey("bestScore") == false 가 아닐 때
bestScore < alive 라면 지금 점수 = 최고점수 로 기록
Unity 기능 복습
1) rigidbody : 요소를 위에서 아래로 떨어지게 만든다.
2) collider : 다른 요소와 만나면 충돌시킨다.
3) target graphic : 특정 상황에서 해당 요소의 그래픽에 변화를 주겠다.
C# 기능 복습
1) public : 여러 곳에서 부를 수 있는 존재를 선언할 때 사용한다.
ex) public static gameManager I; 의 뜻 : 여러 곳에서 부를 수 있는 게임매니저 I 라는 것이 있다.
(주의) gameManager를 싱글톤화 하지 않으면 viod Awake 했을 때마다 새로운 gameManager가 등장할 것.
오늘의 회고
Unity 게임개발 부트캠프 1일차
17조 팀원들과 팀명 정하기, 팀장 정하기, 팀 노션 작성, 계획표 작성을 했다.
게임개발 종합반 2주차 강의를 듣고 3주차로 넘어갔는데 프로젝트가 중간에 먹통이 돼서 힘들었다.
Play 버튼을 누르는 데 약간의 공포심이 생겼다. 영문 에러 창이 뜰 때 무척 당황스러웠다.
구글 검색, 질문게시판 검색 등 찾아봐도 결국 어디서 꼬인건지 직접 찾아야만 했기에..
결국 리셋시키고 처음부터 다시 했다.
교훈 : 유니티와 스크립트 그 어디에서도 오타를 내선 안 된다.. 특히 대소문자랑 부호!!
리셋시킨 이후로는 집중력이 조금 떨어졌다.
오늘 계획한 2주차 강의는 깔끔하게 끝내서 다행이다.
이번 주 안으로 모든 강의를 흡수해야 해서 마음이 좀 급하다.
집중력을 올려서 공부 시간을 최대한 활용해야겠다.
내일 계획
오전 ) 3주차 강의 끝내기
오후 2시 ) 튜터님의 Git 특강
오후 ) 4주차 강의 도전
'게임 개발 일지 > 내일배움캠프 TIL' 카테고리의 다른 글
변수 선언과 초기화 / 3항 연산자 / switch문의 특징 (0) | 2023.11.06 |
---|---|
일정한 간격으로 카드 배치하기 (1) | 2023.11.03 |
배경음악 종료하기 / 다시 시작 버튼 만들기 (0) | 2023.11.02 |
카드에 랜덤으로 이미지 넣기 / 카드 2장만 열게 하기 (0) | 2023.11.01 |
게임 스테이지(난이도) 구현 / git 기초 학습 (2) | 2023.10.31 |
댓글