210922 toDoList
Updated:
210922 toDoList
210922 toDoList
해야하는 일과 배운 것들 정리
해야하는 일
- GitHub 폴더 정리
- GitHub와 Unity 연동하고 실제 사용하는 방법 익히기
- GitHub 관련 기본 명령어 숙지하기
- Unity Tutorial: Among Us #1 보면서 따라 만들어보기
- 게임 속 시스템 분석하기 (간단한거라도 자세하게)
모르는점
enum EControlType 변수 선언
- enum EControlType를 선언하는 과정이 이해되지 않는다. 열거형 변수 선언인가?
public static 변수 선언 (정적 변수로서의 선언)
- 정적 변수는 무엇인가? 그리고 왜 정적 변수로 선언해야 되는가? 정적 변수의 특징을 정리해보자.
[SerializeField]의 기능
- SerializeField는 매번 찾아보지만 항상 까먹는다. 적어두는 것이 유용할 것 같다. 아마, Interface 창에 private 변수를 띄어 조작가능하게 하는 것일텐데?
GetComponent<>()의 기능
- 초기화 과정이라고 쉽게 알고는 있지만 (그래서 Awake 함수에 할당하는 경우가 많다.) 자세히 알아본 적은 없다. 이에 대해서 정리해보자.
Coroutine 사용법
- Coroutine은 대개 딜레이를 주어 애니메이션 또는 함수를 실행할 때 사용한다. 하지만 정확한 사용법을 모르고 있는 것 같다.
즉, 문법만 알지 활용방법을 모른다는 것이다. 이에 대한 예제들을 찾아보며 학습해보자.
배운점
GitHub 기본 5 Tool
- commit
github 폴더에 업로드할 부분을 선택한다.
특정 부분(줄 단위)만 commit 할 수 있다. - discard
변경사항을 지우고 파일의 상태를 마지막 commit을 한 상태로 돌려준다.
마찬가지로 특정 부분(줄 단위)만 discard 할 수 있다. - push
local 폴더 → github 폴더 (Upload)
commit 한 내용을 github 폴더에 올린다. - pull
github 폴더 → local 폴더 (Download)
github 폴더에서 변경된 사항을 local 폴더에 다운로드 한다. - merge
push와 pull 과정 중 충돌하는 파일이 있을 경우, 충돌을 해결하고 파일을 합쳐준다.
Unity와 GitHub 연동 시 주의사항
- unity 프로젝트의 버전을 통일하자.
패치버전까지 모두 통일하는 것을 추천한다. - 에셋 직렬화 방식 (Prefeb & Scene 관리)을 텍스트 방식으로 통일하자.
텍스트 방식은 사람이 읽을 수 있기 때문에 개발자가 수정한 사항을 찾기 쉽다.
(Edit - Project Settings - Editor - Asset Serialization - Force Text) - .meta 파일의 관리: guid를 가져와서 사용한다.
모든 오브젝트는 프로젝트 뷰에서 관리하는 것이 권장된다.
불가피하게 탐색기에서 파일을 조작해야 한다면 export package를 이용하여 보내야 한다.
meta 파일의 갱신을 위해서 Scene 자동저장을 켜두는 것이 권장된다.
Hierarchy에서 순서를 주의하라
- SettingUI가 닫히는 함수를 Background에 할당했는데, 이는 Panel을 제외한 다른 부분을 클릭했을 때 UI가 닫히기 때문이다.
다만, Cancel을 클릭해도 이와 같아야 하는데 Hierarchy 창에서 Cancel이 Background보다 더 높은 층에 존재한다면,
Cancle을 클릭했을 때, 이와 같은 행동이 일어나지 않는다. 즉, Hierarchy 상에서 더 낮은 층에 존재해야 한다.
Project View에서 폴더를 구분하라
- Project View에서 Scene별로 혹은 기능별로 폴더를 구분하여 정리하는 것이 편리하다.
예시로 UI와 관련된 스크립트, 애니메이션은 UI 폴더를 만들어 구분하자.
Unity Tutorial: Among Us #1 분석
- #1에서는 메인메뉴의 UI와 기본적인 기능들을 구현했다.
- 메인메뉴 UI의 버튼들을 배치하고, 버튼에 마우스를 올렸을 때, 초록색으로 되도록 하였다.
버튼에서 Transition - Highlight의 색상을 초록색으로 바꾸면 된다. - 해상도에 따라서 대응하기 위해서 기본 해상도 (1024 x 768)와 Canves Scale을 맞추었다.
Canves Scaler에서 UI Scale Mode를 Scale With Screen Size로 바꾼 뒤, 해당 값을 기본 해상도 값으로 대응했다.
Match의 경우 어떤 축을 기반으로 다른 축이 늘어나는 것인지 구분하기 위해서 사용하는 것인데, 이 게임은 세로 축을 기반으로 가로 축이 늘어나기에 1로 할당했다. - 다만, 이렇게 UI 해상도 대응을 하는 경우 게임종료 버튼이 우하단에 고정되지 않는 문제가 발생한다.
이 문제는 UI 앵커를 이용하여 우하단에 고정하고 일정 간격 띄어줌으로서 다른 해상도에서도 우하단에 고정할 수 있다. -
SettingsUI의 애니메이션을 주기 위해서 (SettingsButton 클릭 시 나올 수 있도록) 애니메이터와 애니메이션을 사용하였다.
UI는 Rect Transform을 이용하여 애니메이션을 만들었다. Scale: 0 → 1로 가도록 설정하였으며,
반대로 닫히는 경우에는 애니메이터 뷰에서 Speed 값을 -1로 조정하였다.
또한, Trigger로 close를 만들어 해당 Trigger가 발생하면 닫히는 것으로 설정하였다. - SettingsUI 스크립트 (SettingsUI에 부착)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SettingsUI : MonoBehaviour
{
// Button과 SettingsUI의 애니메이션을 컨트롤 해 줄 Animator를 선언
[SerializeField]
private Button MouseControlButton;
[SerializeField]
private Button KeyboardMouseControlButton;
private Animator animator;
// 초기화 과정
private void Awake()
{
animator = GetComponent<Animator>();
}
// OnEnable: 오브젝트 활성화 시 호출되는 함수 (즉, 처음에는 비활성화, 버튼 클릭 시 활성화 되도록 연결한다.)
private void OnEnable()
{
switch (PlayerSettings.controlType) // Switch 문을 사용하여 버튼의 색을 초록, 흰색(기본)으로 설정 관리
{
case EControlType.Mouse:
MouseControlButton.image.color = Color.green;
KeyboardMouseControlButton.image.color = Color.white;
break;
case EControlType.KeyboardMouse:
MouseControlButton.image.color = Color.white;
KeyboardMouseControlButton.image.color = Color.green;
break;
}
}
// 기존에 설정된 모드 값을 가져온다. 즉, 창을 닫아도 설정은 유지할 수 있도록 한다.
public void SetControlMode(int controlType) // Mouse: 0, KeyboardMouse: 1로 할당하여 사용
{
PlayerSettings.controlType = (EControlType)controlType;
switch (PlayerSettings.controlType)
{
case EControlType.Mouse:
MouseControlButton.image.color = Color.green;
KeyboardMouseControlButton.image.color = Color.white;
break;
case EControlType.KeyboardMouse:
MouseControlButton.image.color = Color.white;
KeyboardMouseControlButton.image.color = Color.green;
break;
}
}
// SettingsUI의 애니메이션을 관리하는 함수, 그 중에서도 Close()
public void Close()
{
StartCoroutine(CloseAfterDelay()); // Coroutine 호출
}
private IEnumerator CloseAfterDelay()
{
animator.SetTrigger("close"); // Trigger 작동
yield return new WaitForSeconds(0.5f); // 0.5초 뒤
gameObject.SetActive(false); // 해당 오브젝트 비활성화
animator.ResetTrigger("close"); // Trigger 리셋
}
}
- MainMenuUI (MainMenuUI에 부착)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MainMenuUI : MonoBehaviour
{
// Online 버튼 클릭 시, 다음에 기능 구현
public void OnClickOnlineButton()
{
Debug.Log("Click Online"); // 임시 로그
}
// Quit 버튼 클릭 시
public void OnClickQuitButton()
{
#if UNITY_EDITOR // Editor 상에서
UnityEditor.EditorApplication.isPlaying = false;
#else // Bulid 상에서
Application.Quit();
#endif
}
}
- PlayerSettings (Player의 정보를 담는 스크립트)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 열거형으로 변수 선언
public enum EControlType
{
Mouse,
KeyboardMouse
}
// 정적 변수로 선언
public class PlayerSettings
{
public static EControlType controlType;
}
게임 속 시스템 분석
- 게임 속에서 볼 수 있는 간단한 시스템(예를 들어, 플레이어 이동, 강화 시스템 등)을 분석하고자 하였다.
다만, 매번 게임 시스템을 선정하고 그 게임만의 독특한 시스템을 발견하는 것이 쉽지만은 않다고 판단하였다.
왜냐하면 직접 그 게임을 해보아야 하고 그에 따른 시간이 투자되기 때문이다. - 하지만 게임 속 시스템을 분석하는 것은 중요하다고 생각한다. 따라서 이러한 공부는 일주일에 1개에서 2개 정도만 해보는 것이 좋다고 판단했다.
일주일에 1번 게임 속 시스템을 분석하고 어떤 식의 코드가 사용되었을 지 또는 왜 이런 식으로 만들었는지 플레이어로 하여금 기대효과는 무엇인지 분석하고자 한다. - 당장 생각해둔 것은 없지만 마인크래프트의 조합 시스템 정도를 생각하고 있다.
조합이라는 시스템을 분석해서 따로 글을 써보자.
개선점
- 24:00 전에 모든 일과를 마치는 것이 중요하다. 졸려도 버티면서 해보자.
- 모르는 것은 사소한 것이라도 다 적어두자. 또 찾아보려면 그것도 일이다.
- 흥미가 떨어지기 때문에 당장 모르는 것을 깊게 파고들 필요는 없다. 다만, 무엇을 모르는 지, 핵심은 무엇인지 정도는 파악하는 것이 중요하다.
- 따라하는 것은 크게 중요하지 않다. 중요한 것은 따라하는 과정에서 내가 무엇을 얻어가고, 이를 어떤 식으로 활용할 지 생각하는 과정이다.
즉, 이번 따라 만들기에서 얻어갈 것은 기초 세우기와 다른 게임에서는 어떻게 활용되었는지 생각해보는 것이다.
Leave a comment