경일 메타버스 20220707 14주차 4일 수업내용. 유니티 - 매뉴얼, 인터페이스, 컴포넌트, 로그, 씬 편집 툴, 컴포넌트 패턴, 이벤트 함수의 실행 순서, Unity를 위한 C# 프로그래밍, 오답노트
https://docs.unity3d.com/Manual/UnityManual.html
유니티 패키지(Package) : 외부 라이브러리
에셋(Asset) :
Unity 프로젝트에서 무언가를 만들 때 사용하는 모든 것, 모든 아이템.
입력(Input) :
유니티는 입력을 두 가지 방법으로 제공한다.
인풋 매니저(Input Manager) / 인풋 시스템(Input System)
2D
그래픽스(Graphics) :
그래픽 관련 툴
월드 빌딩(World Building) :
가상 세계를 만들기 위한 툴, 에셋
스크립팅(Scripting) :
프로그래밍, 유니티 아키텍쳐 전까지 필수, 그 이후는 심화
유니티 네트워킹은 아직 충분히 쓸만하지 못하다. 참고하지 말 것.
오디오(Audio)
동영상(Video)
애니메이션(Animation) :
애니메이션은 알아두는 것이 좋다.
유저 인터페이스(User Interfaces, UI) :
UI 툴킷(tool kit) / uGUI(Unity UI) / IMGUI
내비게이션과 경로 탐색(Navigation and Pathfindinf) :
Unity에서 제공하는 길찾기 알고리즘
XR : VR & AR 관련
에셋스토어(Asset Store) :
유명한 무료 에셋 ex) Unity chan!
플랫폼 개발(Platform devleopment) :
다양한 플랫폼에서 프로그램을 빌드할 때 참고.
스크립팅 API :
스크립팅에 관한 내용.
씬(Scene) 창 :
게임 월드인 씬을 시각적으로 편집하는 창
하이어라키(Hierarchy) 창 :
씬에 존재하는 모든 게임 오브젝트가 나열되는 창
인스펙터(Inspector) 창 :
선택한 게임 오브젝트의 정보가 표시되는 창
게임(Game) 창 :
플레이어가 실제로 보게 될 화면을 띄우는 창
프로젝트(Project) 창 :
프로젝트에 사용될 에셋들이 표시되는 창
콘솔(Console) 창 :
로그나 에러가 표시되는 창
트랜스폼(Transform) :
오브젝트의 3차원 좌표와 크기, 회전을 지정한다.
메시 필터(Mesh Filter) :
3D 메시 파일을 받아 오브젝트의 외곽선을 지정한다.
메시 렌더러(Mesh Renderer) :
메시를 따라 색을 채워 그래픽 외형을 그린다.
박스 콜라이더(Box Collider) :
다른 물체가 부딪칠 수 있는(충돌 처리) 물리적인 표면을 만든다.
일반 로그(회색) :
일반적인 기록 정보
경고 로그(노란색) :
권장할 만한 수정 사항이 존재할 때 표시
에러 로그(빨간색) :
잘못된 문법, 접근 등으로 명령을 실행할 수 없는 문제가 생기면 표시
Clear :
모든 로그를 지운다. 해결되지 않은 코드 문법 에러 로그는 사라지지 않는다.
Clear on Play :
씬을 플레이할 때 직전까지 쌓여 있던 모든 로그를 지운다.
Clear on Build :
빌드시 직전까지 쌓여 있던 모든 로그를 지운다.
Clear on Recompile :
코드가 수정되어 반영될(재컴파일) 때 쌓여 있던 모든 로그를 지운다.
Collapse :
같은 내용의 로그끼리 보기 쉽게 묶는다.
Error Pause :
플레이 도중 에러가 발생하면 씬을 일시 정지한다.
Editor :
유니티 에디터 외부의 기기로부터 원격 로그를 받을 수 있다.
핸드(Hand) 툴 : 단축키 Q
씬 카메라를 움직인다.
평행이동(Translate) 툴 : 단축키 W
오브젝트를 이동시킨다.
회전(Rotate) 툴 : 단축키 E
오브젝트를 회전시킨다.
스케일(Scale) 툴 : 단축키 R
오브젝트의 크기를 조정한다.
렉트(Rect) 툴 : 단축키 T
UI와 2D 오브젝트의 크기를 조정한다.
트랜스폼(Transform) 툴 : 단축키 Y
평행이동, 회전, 스케일 툴을 하나로 합친 툴이다.
전후 x 상하 y 좌우 z
왼손 좌표계로 기억하자. 엄지 y
씬 기즈모.
시점을 조정하는 부분. 오른쪽 위의 3축 표시
투영 전환 :
원근(Perspective) 또는 등각(Isometric)으로 전환 가능.
플레이 : 단축키 Ctrl + P
일시 정지: 단축키 Ctrl + Shift + P
스텝 : 단축키 Ctrl + Alt + P
오히려 코드 재사용이 힘든 경우가 생길 수 있다.
새로운 오브젝트의 생성이 힘들다.
컴포지션(Composition) 패턴.
미리 만들어진 부품을 조립해 완성된 오브젝트를 만든다.
유연한 재사용이 가능하다.
새로운 오브젝트의 생성이 쉽다.
독립성 덕분에 기능 추가와 삭제가 쉽다.
게임 오브젝트는 단순한 컨테이너
컴포넌트는 스스로 동작하는 독립적인 부품
Initialization ⇒ Physics ⇒ Input Events
⇒ Game Logic ⇒ Scene Rendering ⇒ Decommissioning
가장 초기에 호출되는 함수
Awake
OnEnable
Reset은 playmode가 아닐 때, 스크립트가 부여되면 호출된다.
더 정확히는, 처음 스크립트가 연결될 때나 Reset 커맨드를 사용할 때 호출된다.
FixedUpdate(Physics)가 필요한 이유 :
각 컴퓨터마다 성능이 달라, Update의 호출 속도가 다르다.
그래서 물리 연산이 Update에서 일어나면, 컴퓨터마다 다른 결과가 나올 수 있다.
이를 피하기 위해 고정된 프레임마다 호출되는 FixedUpdate로 더 정밀히 물리 연산을 실행한다.
FixedUpdate는 기본적으로 어떤 환경이어도 1초에 50번(50fps) 호출되도록 설정되어있다.
LateUpdate :
모든 업데이트가 끝나고 마지막으로 호출된다.
주로 카메라 연산을 위해 사용된다.
플레이어의 위치를 따라가는 등, 모든 업데이트 후 마지막으로 카메라를 이동시켜준다.
FixedUpdate
주로 물리 연산이 이루어진다.
고정된 프레임마다 호출된다.
Update
게임 로직이 실행된다.
프레임마다 호출된다.
업데이트를 위한 주요 작업 함수이다.
LateUpdate
모든 업데이트가 끝나고 마지막으로 호출된다.
카메라의 이동 등이 이루어진다.
주요 이벤트 함수와 그 순서
void Awake()
오브젝트가 활성화되어있을 때, Start 함수가 호출되기 전에 호출된다.
즉, 가장 먼저 호출된다.
void OnEnable()
스크립트가 활성화될 때마다 호출된다.
void Start()
스크립트가 활성화되어있을 때, Update의 첫 프레임 바로 전에 호출된다.
즉, 단 한번 시작할 때 호출된다.
void FixedUpdate()
고정된 프레임마다 호출된다.
void Update()
프레임마다 호출된다.
void LateUpdate()
Update가 다 끝나고 호출된다.
void OnDisable()
스크립트가 비활성화될 때마다 호출된다.
void OnDestroy()
스크립트가 제거될 때 호출된다.
// 정수
byte b = 16; // 10진수
int i = 0x64; // 16진수
long l = 0b_0010_1010; // 2진수
// _는 사람이 구분하기 위한 것으로, 수치로써 읽히지 않는다.
부동소수점은 float만 지원한다.
char는 2byte이며, 기본적으로 UTF-16을 지원한다.
System.String으로 제공된다.
C++과 다르게 C#에서 문자열 타입은 불변(Immutable) 타입이라 항상 새로운 인스턴스를 생성한다.
⇒ 성능에 주의!
C++에서는 문자열을 수정하면 기존 메모리에 공간을 확보해서 추가한다.
C#에서는 문자열을 수정하면 새로운 메모리에 할당하므로, C++보다 훨씬 많은 메모리를 차지한다.
왜 그런가?
참고 : https://www.pluralsight.com/guides/understanding-string-immutability-csharp
문자열 보간
문자열””의 앞에 $기호를 넣고, {} 중괄호 안에 변수를 넣는 것으로
문자열을 편하게 형식화할 수 있다.
int id = 1234;
s = $"ID는 {id}입니다.";
문자열의 활용
제공되는 속성, 메소드로 여러가지 연산을 할 수 있다.
string s에 대하여,
s.Length :
**문자열의 길이**
s.ToLower :
문자열 전체를 소문자로 변환
s.ToUpper :
문자열 전체를 대문자로 변환
s == “Hello World!”
연산자로 비교가 가능하다.
s.Trim() :
**문자열의 앞뒤 공백**을 지워준다.
s.StartsWith(”Hello”) :
문자열이 매개변수의 문자열로 시작하는지 판별하고 bool 값을 반환한다.
s.EndsWith(”World”) :
**문자열이 매개변수의 문자열로 끝나는지** 판별하고 bool 값을 반환한다.
코드 예시
char ch = '要';
Debug.Log($"Awake{ch}");
string s = "Hello World!";
Debug.Log($"length{s.Length}");
int j = s.Length;
Debug.Log($"length{j}");
s = s.ToLower();
Debug.Log(s);
s = s.ToUpper();
Debug.Log(s);
if(s=="HELLO WORLD!")
{
Debug.Log("same");
}
s = " HELLO WORLD! ";
s = s.Trim(); // s == "HELLO WORLD!"
Debug.Log(s);
if (s.StartsWith("HELLO"))
{
Debug.Log("start");
}
if (s.EndsWith("!"))
{
Debug.Log("end");
}
조건식은 모두 bool 타입만을 받는다.
즉, C++과 달리 조건식 내부에서 암시적 형변환이 일어나지 않는다.
switch문에 문자열을 넣어줄 수 있다.
// 문자열도 사용 가능
string s = "Hello";
switch (s)
{
case "Hello":
Debug.Log("switch 문에서는 문자열 비교 가능!");
break;
case "World":
break;
default:
break;
}