▼ 지난 시간 복습
클래스(Class)
클래스
: 함수와 변수를 포함할 수 있는 집합
int num = 5; //자료형 이름 = 넣을 값;
자료형
예시)
int a; //정수
float b; //실수
bool c; //참, 거짓
char d; //문자
string e; //문자열
멤버 변수와 지역 변수
- 멤버 변수: 클래스에 존재하는 변수
- 지역 변수: 함수에 존재하는 변수
- 상수: 변하지 않는 수 (Const)
클래스와 객체(인스턴스)
public class Person: MonoBehaviour
{
string personName;
int age;
float height;
float weight;
}
Person person = new Person(); //객체 생성
접근 제한자
- public: 접근 권한이 열려있는 상태
- private: 접근 권한이 막혀있는 상태
- protected: 상속받은 Class에 대해서만 접근 가능한 상태
- SerializeField: 보안 수준은 유지하지만 인스펙터(Inspector)에서 수정할 수 있는 기능
함수의 타입
- 반환 타입이 없는 함수
public class ExampleClass : MonoBehaviour
{
void Start()
{
Jump();
}
void Jump() // void: 반환 값 X
{
// 캐릭터 점프
}
}
- 반환 타입이 있는 함수
public class ExampleClass : MonoBehaviour
{
void Start()
{
AddMethod(1, 2); //매개변수에 값 대입
}
int AddMethod(int a, int b) //매개변수 a, b
{
return a + b; //반환
}
}
스크립트 접근
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using UnityEngine;
namespace ProgrammerA // ProgrammerA 네임스페이스 생성
{
public class ScriptA : MonoBehaviour //ScriptA 클래스 생성
{
int aValue = 2; //접근제한자 생략 시 자동으로 private
public int aPublicValue = 3; //접근제한자 닫힘
private int aPrivateValue = 4; //접근제한자 막힘
[SerializeField] int aSerializeValue = 5; //보안유지, 인스펙터에서 수정 가능
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ProgrammerA;
using ProgrammerB;
public class ExampleClass : MonoBehaviour
{
ScriptA scriptA;
ScriptB scriptB;
void Start()
{
scriptA.aValue = 0; // 접근 X
scriptA.aPublicValue = 0; // 접근 O
scriptA.aPrivateValue = 0; // 접근 X
scriptA.aSerializeValue = 0; // 접근 X
}
}
Type 자료형 예시
- int, float, string 등
- Gameobject, Material, Trasform 등
- 개발자가 직접 만든 클래스 (Person, ScriptA, Example 등)
=> 전부 타입에 포함 할 수 있다.
▼ 오늘 학습한 내용
컴포넌트 (Component) : 게임 오브젝트의 기능
컴포넌트(Component)
: 게임 오브젝트에 붙이는 부품(기능)으로, Unity에서 제작해둔 기능이다.
- 트랜스폼 (Transform): 모든 게임오브젝트에 필수로 들어가있는 컴포넌트로 게임 오브젝트의 위치, 회전, 크기 정보이다.
- 매쉬 필터(Mesh Filter): Mesh 데이터(게임 오브젝트의 형태)를 넣을 수 있다.
- 매쉬 랜더러(Mesh Renderer): 게임 오브젝트의 매쉬를 그리는 컴포넌트이다.
Component 접근
게임 오브젝트에 접근하여 오브젝트의 이름을 바꾸는 코드를 작성해보겠다.
public GameObject targetobj; //어떤 GameObject 타입의 변수 선언
void Start()
{
gameObject.name = "빈 게임 오브젝트"; //자기 자신의 이름 변경
targetObj.name = "Other GameObject"; //어떤 대상의 게임오브젝트 이름 변경
}
this: 현재 객체(인스턴스) 자체를 참조하는 키워드
* gameObject.name 앞에는 this가 생략돼있다.
(this.)gameObject.name = "빈 게임 오브젝트";
GetComponent : 컴포넌트(Component) 가져오는 기능
gameObject.GetComponent<MeshRenderer>().enabled = false;
AddComponent : 컴포넌트(Component) 추가 기능
gameObject.AddComponent<MeshRenderer>().enabled = false;
Transform 이동
이동 구현
// 월드 이동
transform.position += new Vector3(0, 0, speed * Time.deltaTime);
// 로컬 이동
transform.Translate(new Vector3(0, 0, speed * Time.deltaTime));
// 목적지 이동
transform.position = Vector3.MoveTowards(transform.position, endTransform.position, speed * Time.deltaTime);
// 부드러운 감속 이동
transform.position = Vector3.SmoothDamp(transform.position, endTransform.position, ref currentVel, speed);
// 선형 이동
transform.position = Vector3.Lerp(transform.position, endTransform.position, Time.deltaTime);
if 조건문
if 조건문
: 만약 ~라면, 내부의 기능을 실행
특정 조건이 참인지 확인하고, 참일 때만 코드 블록을 실행하는 제어문이다.
if (조건) {
// 조건이 참일 때 실행할 코드
} else if (다른 조건) {
// 위 조건이 거짓이고, 이 조건이 참일 때 실행
} else {
// 모든 조건이 거짓일 때 실행
}
IfStudy Script로 If문 예제를 작성했다.
public class IfStudy : MonoBehaviour
{
public int currentLevel = 1; //현재 레벨 변수 = 1
void Start()
{
if (currentLevel > 0 && currentLevel < 10) //현재 레벨이 10보다 작으면, 초보자 사냥터 사용 가능
{
Debug.Log("초보자 사냥터 사용 O");
}
else if (currentLevel > 10) //현재 레벨이 10보다 크면, 초보자 사냥터 사용 불가능
{
Debug.Log("초보자 사냥터 사용 X");
}
else //currentLevel
{
Debug.Log("레벨이 10이므로, 초보자 사냥터 0");
}
}
}
결과 값이 잘 나오는 것을 확인했다.
[예제] 어몽어스 캐릭터 움직이기
Input.GetKey
: Input은 사용자 입력(키보드, 마우스 등)을 감지하는 기능이고,
GetKey는 특정 키가 눌리고 있는 동안을 감지하는 함수이다.
if (Input.GetKey(KeyCode.키이름)) {
// 키가 눌린 상태일 때 실행할 코드
}
관련함수
- GetKeyDown: 키를 누르는 순간
- GetKey: 키를 누르고 있는 동안 계속 동작
- GetKeyUp: 키를 떼는 순간
[W, A, S, D]를 누르면 [위, 왼, 아, 오]방향으로 캐릭터가 움직이는 코드
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;
}
if (Input.GetKey(KeyCode.S))
{
transform.position += Vector3.back * moveSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A))
{
transform.position += Vector3.left * moveSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.D))
{
transform.position += Vector3.right * moveSpeed * Time.deltaTime;
}
}
}
- Input.GetKey로 특정 KeyCode(W, A, S, D) 입력을 감지한다.
- transform.position에 Vector 값을 더해 프레임 단위로 캐릭터를 이동시킨다.
하지만 이러한 코드는 비효율적이며 유지보수가 어려울 수 있는 코드이다.
이때 Input Manager를 활용해주면 된다.
Input Manager
: Unity의 기본 제공 기능으로, 자주 사용하는 키를 미리 설정하여 코드에서 이름으로 쉽게 참조할 수 있도록 한다.
Input Manager 활용해 수정한 코드
public class ExampleClass : MonoBehaviour
{
public float moveSpeed = 1f; // public으로 선언한 속도 변수
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; // 입력한 값으로 이동 기능
}
}
예시:
- Horizontal: 왼쪽/오른쪽 이동(A, D, 화살표 좌/우 등 여러 입력 지원)
- Vertical: 위/아래 이동(W, S, 화살표 상/하 등)
- Fire1: 기본 공격(마우스 왼쪽 버튼, Ctrl 등)
- Jump: 점프(스페이스바)
정규화(Normalizes)
: 0~1값으로 단위화
Vector3 dir = new Vector3(h, 0f, v).normalized;
- h와 v 값으로 새로운 벡터를 생성.
- .normalized를 사용해 벡터를 정규화, 방향만 남기고 크기를 1로 조정.
- 주로 이동 방향 계산 시 사용되며, 벡터 크기가 고정되어 속도가 일정하게 유지됨.
Frame과 Delta Time
Frame: 화면에 한 장의 화면을 렌더링된 화면
Delta Time: 이전 프레임과 현재 프레임 사이의 시간 간격
FPS (Frame per Second): 초당 몇 개의 프레임이 렌더링되는지 나타냄
Delta Time은 프레임 속도(FPS)에 따라 움직임이나 애니메이션이 일정하게 보이도록 조정하는 데 사용된다.
오늘 들은 실무자 특강
현직 라이엇게임즈에서 재직 중인 강사님이 진행한 실무자 특강을 들었다.
실무 경험이 풍부한 분이 직접 강의해주셔서 실질적인 현업 이야기를 들을 수 있었고,
생각하지 못했던 부분들까지 알게 되는 유익한 시간이었다.
특히, 개발자는 단순히 개발 실력만 좋아서 되는 것이 아니라는 것을 알게 되었다.
개발이외에도 소통 능력, 영어 실력 등 다양한 역량을 함께 갖춰야겠다는 생각이 들었다.
추가로 자기소개 부분을 정리하면
- 두괄식: 오버는 하지 말고 깔끔하게 쓰자
- 간단하게, 그리고 강렬하게 작성하라: 글자 수를 다 채울 필요는 없으며, 핵심을 명확히 전달하는 것이 중요하다.
- 사실에 기반해 과장: 자신을 어필하되 거짓말은 금물이다.
* 면접 시 주의 사항: 대충한 게임을 열심히 한 척 포장하지 않는다.
TIP) 이왕이면 대중적인 게임을 플레이해서 이야기할 소재를 준비하자. (생소한 게임은 면접관들의 흥미를 끌기 어렵다.)
▼ 마무리
오늘, 드디어 첫 블로그를 작성했다.
아직은 블로그 작성이 낯설고 어렵지만 앞으로 매일 꾸준히 글을 쓰며 성장해가는 모습을 기록해보려한다.