프로젝트 경량화
게임 프로젝트에서
리소스 관리를 위해 3D, 2D, 사운드, 영상은 신중히 선택해야 함
멀리 있어서 보이지도 않는데 고화질 텍스쳐를 가져온다던가
무겁게 느껴지면 해당 프로젝트의 경량화가 필요
타입
유니티에서 사용하는 유니티 타입들이 존재함
ex. GameObject, Material, Transform 등

컴포넌트 Component
모든 게임오브젝트GameObject에 컴포넌트Component를 붙일 수 있음
게임오브젝트에 붙이는 부품/기능
3D Object엔 기본적으로 4개의 컴포넌트가 있음

존재 Active

SetActive true : 존재 on
SetActive false : 존재 off
그리는 기능 Render
투명벽 같은 처리 시 사용

컴포넌트 추가
빈GameObject에 Mesh Filter 추가

Renderer가 없어서 안보임
Mesh Renderer 추가하면 보임
하지만 Magenta 색상으로 보임 = 렌더가 깨졌음
→ Materials이 None(없음)이기 때문

따라서 넣어줘야 함

넣어보면 잘 뜸

스크립트 넣기


스크립트에서 gameObject 속성 값 접근
void Start()
{
Debug.Log(gameObject.name); // = this.gameObject.name, this 생략
}
Play하면 로그가 잘 찍힘

스크립트에서 gameObject 이름 변경
void Start()
{
gameObject.name = "빈 게임 오브젝트";
Debug.Log(gameObject.name);
}
Play하면 Hierachy에도 반영 되어 있고, 로그에도 변경한 이름으로 찍혀 있음
컴포넌트 접근
this.gameObject = 자기자신
GetComponent<컴포넌트명>() ~ : 컴포넌트에 접근
public class ComponentStudy : MonoBehaviour
{
// 어떤 대상을 담는 접시
// 어떤 GameObject 타입의 변수를 생성(선언)
public GameObject targetObj;
//public으로 접근제한자를 설정하면 Unity Editor에서 수정 가능
void Start()
{
// 유니티에서는 GameObject 기본 단위
gameObject.name = "빈 게임 오브젝트";
this.gameObject.GetComponent<MeshRenderer>().enabled = false;
targetObj.name = "Other GameObject";
// 어떤 오브젝트가 갖고 있는 Component 접근하는 방법
// 어떤 대상.GetComponent<컴포넌트명>().함수 or 변수
targetObj.GetComponent<MeshRenderer>().enabled = false;
}
}

해당 코드를 실행하면 targetObj에 할당이 안되어 있다고 에러 뜸

Capsule 3D object 생성하여 할당해줌

다시 실행해보면 이름이 바뀌고 MeshRenderer가 off된 것을 확인 가능

Capsule Collider라고 하는 컴포넌트 비활성화
// Capsule Collider라고 하는 컴포넌트 비활성화
targetObj.GetComponent<CapsuleCollider>().enabled = false;

컴포넌트 추가
// 자기 자신한테 Box Collider 컴포넌트 추가
gameObject.AddComponent<BoxCollider>();
추가한 기능 바로 수정
// 자기 자신한테 Box Collider 컴포넌트 추가
gameObject.AddComponent<BoxCollider>();
gameObject.GetComponent<BoxCollider>().enabled = false;
실행해보면 추가된 Box Collider과 off 된 것까지 확인 가능

빈 게임 오브젝트가 Transform 컴포넌트를 가진 이유
씬 상에 존재하기 위해 위치와 크기가 필요하기 떄문
→ 모든 오브젝트가 갖고 있는 컴포넌트
⇒ 따라서 transform은 스크립트 상에서도 GetComponent 할 필요 없이 transform 변수로 만들어져 있어 그냥 사용 가능
Transform 수정
void Start()
{
// Transform 접근해서 이동 시키기
/// 1. 자기 자신 이동 시키기 -> 위치 변경 필요
/// 자기 자신의 Transform에 접근해서 position 값 변경
gameObject.transform.position = Vector3.forward;
// gameObject : Scene상에 존재하는 오브젝트
// 모든 gameObject는 무조건 Transform을 갖고 있음
// 따라서 아래처럼 사용 가능
transform.position = Vector3.forward;
}
실행하면 앞으로 한 칸 이동함
= z축으로 1만큼 이동함


OnEnable()
존재를 On할 때마다 실행되는 유니티 기본 함수
void OnEnable()
{
transform.position += Vector3.forward;
// 존재를 On할 때마다 현재 위치에서 한칸씩 앞으로 감
}
실행 순서는 Awake() → OnEnable() → Start() 순으로 실행됨
따라서 아래 코드를 처음 실행하면 두 칸 이동한 후(OnEnabled 실행 - 1칸 + Start 실행 - 1칸) 존재를 on/off 할 때마다 1칸씩 이동함
public class ComponentStudy : MonoBehaviour
{
public GameObject targetObj;
void Start()
{
transform.position += Vector3.forward;
}
void OnEnable() // 존재를 On할 때마다 실행되는 유니티 기본 함수
{
transform.position += Vector3.forward;
}
}


on할 때마다 이동함

원하는 목적지로 이동
public class ComponentStudy : MonoBehaviour
{
public Transform destination; // 목적지 오브젝트
void Start()
{
// 자기 자신의 Transform의 위치를 destination의 위치로 할당
//this.gameObject.transform.position = destination.position;
transform.position = destination.position;
}
}

destination 빈게임오브젝트 생성 후 할당

destination 위치 수정

play하면 destination object로 이동함 = 순간이동 가능

Vector 기준 포지션 이동 키워드

해당 키워드에 스피드를 곱해서 속도 조절 등 사용 가능

Input
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputStudy : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
Debug.Log("W");
}
if (Input.GetKeyDown(KeyCode.S))
{
Debug.Log("S");
}
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("Space");
}
if (Input.GetKeyDown(KeyCode.Return)) // Enter키
{
Debug.Log("Return");
}
if (Input.GetMouseButtonDown(0)) // 마우스 왼쪽 버튼을 누르는 순간
{
Debug.Log("마우스 왼쪽 버튼을 누르는 순간");
}
if (Input.GetMouseButton(0)) // 마우스 왼쪽 버튼을 누르는 중
{
Debug.Log("마우스 왼쪽 버튼을 누르는 중");
}
}
}

저번에 했던 캐릭터 인풋 받아 움직이기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float moveSpeed = 1f;
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.position += Vector3.forward * moveSpeed;
}
else if (Input.GetKey(KeyCode.S))
{
transform.position += Vector3.back * moveSpeed;
}
else if (Input.GetKey(KeyCode.A))
{
transform.position += Vector3.left * moveSpeed;
}
else if (Input.GetKey(KeyCode.D))
{
transform.position += Vector3.right * moveSpeed;
}
}
}
캐릭터는 프레임마다 실행되는 Update 메서드에서 입력을 받기 때문에 프레임이 좋으면 더 빠름
따라서 Delta Time을 사용하여 프레임이 달라도 속도를 일정하게 유지하도록 보정해줘야함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float moveSpeed = 1f;
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.position += Vector3.forward * moveSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.S))
{
transform.position += Vector3.back * moveSpeed * Time.deltaTime;
}
else if (Input.GetKey(KeyCode.A))
{
transform.position += Vector3.left * moveSpeed* Time.deltaTime;
}
else if (Input.GetKey(KeyCode.D))
{
transform.position += Vector3.right * moveSpeed* Time.deltaTime;
}
}
}


정확히는 Delta time = 프레임당 사이 시간

FixedUpdate()
컴퓨터 자체 FPS를 따르는 Update와 달리 프로젝트에 설정한 고정 FPS를 따름
50FPS 정도로 실행 됨(수정 가능)
물리연산할 때 사용함 ex.캐릭터 이동
Input Manager
WASD : 이동
화살표 : 이동
마우스 왼쪽 버튼 : 공격
스페이스바 : 점프
등
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{
public float moveSpeed = 1f;
void Update()
{
float h = Input.GetAxis("Horizontal");// 좌우 이동
float v = Input.GetAxis("Vertical"); // 앞뒤 이동
Vector3 dir = new Vector3(h, 0, v); // 입력한 값으로 Vector3 선언 및 할당
Debug.Log(dir);
transform.position += dir * moveSpeed * Time.deltaTime; // 입력한 값으로 이동 기능
}
}

로그를 보면 키 조작에 따라 각 값이 1 ~ -1까지 나오는 것을 알 수 있음

따라서 대각선 이동은 루트2가 나와 값이 더 큼(속도가 더 빠름)

⇒ 정규화로 보완
프로젝트 설정에서 직접 확인 가능(Services > Project Settings > InputManager)

정규화 Nomalized
0 - 1 값으로 단위화
W, D → (1, 0, 1) ⇒ (0.7, 0, 0.7) 정도로 수정
자주 사용함
Vector3 dir = new Vector3(h, 0, v).normalized; // 입력한 값으로 Vector3 선언 및 할당
정규화를 거친 Vector = 방향벡터
사담
단축키 적응 중
이러다 vscode 돌아가면 또 헷갈릴 것 같은데;
vscode로 할까;; 고민중;;
Ctrl + k + f : 자동 정렬
Ctrl + Space, Tab : 자동 완성
Ctrl + d : 한 줄 복사
Ctrl + k + c : 주석 처리
Ctrl + k + u : 주석 해제
Ctrl + u : 소문자 변환
Ctrl + Seift + u : 대문자 변환
Ctrl + Shift + f : 문자 찾기
Alt + ↑/↓: 한 줄 올리기, 내리기
Alt + 마우스, Alt + Seift + ↑/↓: 열 단위 편집
아직까진 할만하다
강사님이 복습 계속 시켜주셔서 게임 개발 세계에 들어가는 그런 느낌?
ㅋㅋㅋㅋㅋㅋㅋ
이해에는 사실 반복 노출도 중요하다고 생각해서 좋은 것 같다!