컴퓨터 기초
컴퓨터의 구성
- CPU
- RAM (주기억장치) ( 2^nGB단위로 설치하는것이 좋다. 휘발성)
- 보조저장장치 (HDD, SSD등. 비휘발성)
- 그래픽카드/VGA/GPA
- 메인보드
- 입출력장치
+) 유니티용 컴퓨터 사양 추천
최소 GTX1660Ti ~ 권장 RTX3060
CPU는 i5/rygen5
2진수와 10진수와 16진수
컴퓨터는 0과 1로 모든 것을 표현하는 기계이다.
- 2진수 : 0~1 (e.g. 11010)
- 10진수 : 0~9 (e.g. 26)
- 16진수 : 0~E (e.g. 1A)
🎓 새로운 지식 :: const 상수(리터럴)
const int a=10; 선언 후 a=5; 하면 에러가 발생한다.
이유 : const는 상수화 키워드기때문에 처음 한 번만 초기화 가능하기 때문이다.
이렇게 상수로 초기화 된 변수를 리터럴이라고 한다.
클래스와 상속 (복습)
클래스
- 클래스는 설계도면과 같다.
- 데이터 참조방식이다.
- 선언 방법 : (접근제어자) class (클래스네임)
e.g. public class Animal{ }
- 인스턴스화 방법 : (변수 선언부) (객체*명) = (메모리를 할당)
e.g. Animal j = new Animal();
(* 객체 = 오브젝트 = 인스턴스)
주의❗ 클래스의 이름을 지을 때 띄어쓰기를 넣거나 맨앞에 숫자를 넣으면 안됩니다!
클래스의 상속과 오버라이드
- 정보은닉(캡슐화)과 다형성을 위해 사용된다.
class Animal { //부모클래스 virtual void function(){~~} } class Cat : Animal { //자식클래스 override void function(){~~} } |
유니티 설치
유니티 설치하기
유니티 허브 설치 후 로그인 → Installs 탭 클릭 → Unity Editor 설치 (LTS권장) |
유니티 에셋 추가하기
Unity assetstore에서 무료 에셋을 추가 (Unity-Chan! Model,RPG Poly Pack) → Unity에서 열기 → Download → Import |
- Sample Scene의 모습
유니티 인터페이스 이해
유니티 씬 기본 조작법
- 오른쪽 버튼을 누른 채로 움직이면 회전하고 WASD로 앞뒤좌우로 이동할 수 있다.
- 추가 단축키들 설명 링크 - https://www.evercast.us/blog/unity-hotkeys-shortcuts
유니티에서의 좌표축
- X 가로방향
- Y 높이방향
- Z 깊이
카메라 조작
- Field of View(FOV) : 시야각. 숫자가 커질수록 더 많은 범위의 모습을 카메라에 담게 된다. - Camera Speed : 카메라의 이동속도를 조정할 수 있다. |
① 카메라를 이동시킬 수 있다. ② 오브젝트를 선택하여 Global 또는 Local(오브젝트 기준) 축으로 이동시킬 수 있다. ③ 오브젝트를 회전시킬 수 있다. |
+) ctrl + shift + f 누르면 현재 보고있는 뷰 위치로 카메라(오브젝트)를 이동시킬 수 있다.
Hierarchy
- 현재 배치되어있는 오브젝트들을 보여주는 정보창.
- 하이어라키 창에서 오브젝트를 선택하여 더블클릭 또는 F키를 누르면 오브젝트의 현재 위치로 카메라를 이동할 수 있다.
Inspector
- 선택한 오브젝트의 속성, 즉 컴포넌트(Transform 위치/회전/스케일 정보, Material 재질 등)와 설정값을 보여준다.
- Component(기능 단위의 클래스)를 추가할 수 있다.
- Active/Deactive 체크박스를 클릭하여 오브젝트를 활성화/비활성화 할 수 있다.
🎓 새로운 지식 :: 엔티티 컴포넌트 시스템 (ECS; Entity Component System)
게임 개발에 주로 사용되는 소프트웨어 아키텍처 패턴. 컴포넌트를 조합해 만드는 엔티티와 그 컴포넌트에 대해 작동하는 시스템으로 구성된다. 엔티티(오브젝트)에 컴포넌트를 추가, 제거, 수정하여 엔티티의 동작을 변경할 수 있다. 이를 통해 객체지향 프로그래밍에서 이해, 유지보수, 확장을 어렵게 만드는 상속 계층구조의 모호성 문제를 제거할 수 있다.
💡질문 :: Active/Deactive와 Enable/Disable의 차이가 뭔가요? ★★★★★
⇒ 오브젝트를 활성화/비활성화 하는 것이 Active/Deactive이고, 오브젝트 내의 컴포넌트를 활성화/비활성화 하는 것이 Enable/Disable입니다. 체크박스를 클릭하지 않고도 스크립트에서 오브젝트를 gameObject.SetActive( true|false ); 를 통해 활성화/비활성화 할 수 있습니다.
Component
- Inspector 창에서 Add Component를 누른 후 해당 Component를 검색하면 찾을 수 있다.
- 해당 명의 Component가 없는 경우 Create and Add가 가능하며 이후 Script를 작성하여 원하는 사용자기능을 추가할 수 있다.
Tip👍 :: 스크립트를 수정하려는데 Visual Studio가 켜지지 않을 때
Edit -> Preferences -> External Script Editor 를 Visual Studio 2022로 변경하면 스크립트를 열 때 기본적으로 VS2022가 켜집니다.
유니티의 기본 함수
유니티 스크립트(C#) 작성시 사용되는 기본 함수들
(기본 제공 API 또는 Function 또는 Method 라고도 함)
void Awake(){
//생성자는 클래스가 인스턴스화 될 때 초기에 제일 먼저 불리는 함수같은 역할을 하는데,
//유니티에서는 생성자를 사용하지 않는 대신 void Awake(){ } 를 사용한다.
//자기 자신의 데이터를 초기화하는 용도!
//(생성자 안에서 Awake를 호출하는 형식)
}
void Start(){
//오브젝트가 Loop, 즉 매번 틱(frame)마다 도는데
//맨처음 틱의 Update함수가 불리기 직전에 불리는 함수.
//사용예시) 각 오브젝트끼리 데이터를 상호 교환하거나 첫 동작상태를 지정할 때
}
void OnEnable(){
//컴포넌트가 켜졌을 때 호출된다.
//당연히 생성시에 컴포넌트가 켜져있다면 이 함수도 호출된다.
//토글될 때 한번만 동작
}
void OnDisable(){
//컴포넌트가 꺼졌을 때 호출된다.
}
void OnDestroy(){
//컴포넌트가 파괴될 때 호출된다.
//Remove Component(메모리에서 삭제) 또는 오브젝트가 삭제될 때
//코드에서 Destroy 함수 호출시 작동 (아래 Update 참고)
Debug.Log("OnDestroy");
}
void Update(){
//매 틱마다 연산을 수행하는 함수이다.
if (Input.GetKeyDown(KeyCode.Space))
{
GameObject.Destroy(this.gameObject);
}
}
void LateUpdate(){
//Update보다 느리지만 늦은 업데이트가 하고 싶을 때 쓰는 함수.
//Update된 오브젝트들에 대한 새 연산결과를
}
void FixedUpdate(){
//물리시간마다 한번씩 연산한다.
//Edit > Project Setting > Time 설정에서 지정한 Fixed Timestep 간격으로 연산.
//프레임드랍에도 관계없이 정해진 시간마다 작동.
}
💡질문 :: 프레임(frame)이 뭔가요??
30프레임 : 30 frame per second(fps)
즉, 0.033333*30 = 0.9999.. 이므로 약 0.3초마다 한번씩 Update가 된다.
60프레임 : 0.016666초마다 한번씩 Update 된다.
(+코멘트) 모바일의 경우 프레임이 너무 높으면 발열이 많이 발생하기 때문에 제한을 두는 경우가 많습니다.
(실습) Visible ↔ Invisible 함수 작성해보기
public class VisibleComponent : MonoBehaviour
{
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
MeshRenderer renderer = GetComponent<MeshRenderer>();
//GetComponent : 동료 컴포넌트중에 하나를 가져오기
if (renderer != null) //장착된 컴포넌트가 있으면 컴포넌트가 반환되고 없으면 null이반환됨..
{
//(전통적인 조건문 방식의 enable disable)
//if(renderer.enabled)
// renderer.enabled = false;
//else
// renderer.enabled = true;
//(위를 한문장으로 표현한 것.)
renderer.enabled = !renderer.enabled;
}
}
}
}
🎓 이벤트 함수의 실행 순서
Awake > OnEnable > Reset(not in Playmode) > Start > FixedUpdate > Update > LateUpdate ..
참고 문서 : https://docs.unity3d.com/kr/2023.2/Manual/ExecutionOrder.html
Tip👍 유니티 한글 주석 인코딩 깨지는 경우 해결하기
다음 사이트 참고 : https://rito15.github.io/posts/unity-editorconfig-encoding/
💡질문 :: VS에서 함수 자동 작성이 되지 않아요..
⇒ 멘토님 코멘트 : VS community랑 유니티 바인딩이 안되어있을 가능성이 높아요
Edit > Preferences > External tools에서 External Script Editor가 Visual Studio로 되어있는지 확인!
+ 멘토님 코멘트 : 코드 수정시 핫리로딩은 compiler의 동작 방식과 관련이 있어요. 찾아보시는 것도 좋을 것 같아요.
디버그 방법
○ 방법 1. 디버그 로그를 활용한다.
e.g. Debug.Log(renderer);
○ 방법 2.중단점을 활용한다. (강제로 브레이크를 거는 방법이라 위험할수도 있음)
🎓 중단점에 대한 단축키 모음.
- F9 :원하는 위치에 대고 F9를 누르면 중단점이 생김.
play▷를 누르지 않은 상태에서 Unity에 연결(플레이 눌려있으면 유니티가 Reloading을 계속해서 메모리가 꼬임.)
이후 유니티에서 play를 누르면 중단점까지만 실행되고 그때의 변수 값을 관찰할 수 있다.
- F10 : 다음 줄로 넘어가려면 F10을 누른다.
- F11 : F11를 누르면 내부까지 더욱 상세하게 들여다 볼 수 있다.
- F5 : 중단점을 빠져나온다.
콜라이더 만들기
- 우선 캐릭터 Prefab을 꺼내어 Transform의 Position 좌표를 적절한 위치로 옮겨준다.
(+ Main Camera 오브젝트를 MyCharacter 아래로 넣으면 캐릭터를 따라 카메라가 움직이게 만들 수 있다.) - 콜라이더와 리지드바디를 추가한다.
Capsule Collider
다른 Collider와의 충돌을 일으키는 캡슐모양 콜라이더.
- Center : 콜라이더 중심이 오브젝트의 어디에 위치하는지를 지정.
- Radius : 충돌을 감지할 콜라이더의 두께
- Height : 콜라이더의 길이
Rigidbody
물리를 적용시켜주는 역할을 하는 컴포넌트
- Mass : 물체의 질량. 높으면 무거워서 조금움직인다.
- Drag : 중력에 대한 저항값. 중력에 의해 내려올 때 드래그 수치가 클수록 느리게 떨어짐.
- Angular Drag : 각도에 대한 드래그.
- Use Gravity : 중력 적용
- is Kinematic : 물리현상 적용 유무
- Constraints : 위치 변경이나 회전되지 않도록 제한함.
- Freeze Position X, Y, Z : 위치가 변경되지 않도록 고정.
- Freeze Rotation X, Y, Z : 회전이 되지 않도록 고정.
Mesh Collider
충돌을 일으키는 메시 콜라이더를 바닥 오브젝트에 추가한다.
- Convex : 충돌(collision)을 일으키는 convex mesh collider를 생성한다.
(추가 내용) Character Controller
- Slope Limit : 캐릭터가 올라갈 수 있는 경사 제한(경사로 등)
- Step Offset : 올라갈 수 있는 높이 제한(계단 등)
- Skin Width : 피부 두께
- Min Move Distance : 얼만큼 이동해야 Move로 인식할 것인지
- Center : 센터 위치 조정
- Radius : 두께 조정
- Height : 길이 조정
*리지드바디, 콜라이더 기능이 이미 있으므로 오늘은 어태치X
(실습) 캐릭터를 움직이는 스크립트 작성해보기
public class CharacterController_Me : MonoBehaviour
{
// Update is called once per frame
void Update()
{
// Vector : 포지션, 방향을 담기 위해 사용됨
Vector3 direction = Vector3.zero;
if(Input.GetKey(KeyCode.W)){
direction += transform.forward;
}
if(Input.GetKey(KeyCode.S)){
direction += -transform.forward;
}
if(Input.GetKey(KeyCode.A)){
direction += -transform.right;
}
if(Input.GetKey(KeyCode.D)){
direction += transform.right;
}
GetComponent<Rigidbody>().velocity = direction;
}
}
질문💡Input.GetKeyDown과 Input.GetKey의 차이가 뭔가요?
키가 눌리는 한 번만 동작하도록 하려면 GetKeyDown, 키를 입력하고 있는 동안 계속 동작하려면 GetKey를 사용한다.
Transform
- forward : 오브젝트가 바라보는 앞쪽방향
- -forward : 뒤쪽 방향
- -right : 왼쪽
- right : 오른쪽
- up : 위쪽
- -up : 아래쪽
'UNITY > 유니티게임스쿨' 카테고리의 다른 글
[유니티게임스쿨 TIL] 유니티 기본 :: 캐릭터 애니메이션 설정하기, 트리거 활용하기 (0) | 2024.06.05 |
---|---|
[유니티게임스쿨 TIL] C# 기초 문법 이해 :: 파일 입출력, Collection, LINQ (0) | 2024.06.04 |
[유니티게임스쿨 TIL] 유니티 기본 :: 프리팹과 오브젝트, 캐릭터 이동, 점프 기능 추가하기 (1) | 2024.06.03 |
[유니티게임스쿨 TIL] C# 기초 문법 이해 :: 재귀 함수, 연산자, 클래스와 인터페이스 (0) | 2024.05.30 |
[유니티게임스쿨 TIL] C# 기초 문법 이해 :: 데이터 타입과 반복문 (0) | 2024.05.29 |