[24/11/25 멋쟁이사자처럼 부트캠프 TIL 회고 ] - 5일차 Unity 게임개발 3기

2024. 11. 25. 21:21·TIL

 

▼ 지난 시간 복습

클래스(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");
        }
    }
}

currentLevel = 1일때

결과 값이 잘 나오는 것을 확인했다.

 

 

[예제] 어몽어스 캐릭터 움직이기

지난수업시간에 만든 어몽이 캐릭터

 

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)에 따라 움직임이나 애니메이션이 일정하게 보이도록 조정하는 데 사용된다.

 

 

오늘 들은 실무자 특강

현직 라이엇게임즈에서 재직 중인 강사님이 진행한 실무자 특강을 들었다.

 

실무 경험이 풍부한 분이 직접 강의해주셔서 실질적인 현업 이야기를 들을 수 있었고,

생각하지 못했던 부분들까지 알게 되는 유익한 시간이었다.

 

특히, 개발자는 단순히 개발 실력만 좋아서 되는 것이 아니라는 것을 알게 되었다.

개발이외에도 소통 능력, 영어 실력 등 다양한 역량을 함께 갖춰야겠다는 생각이 들었다.

 

추가로 자기소개 부분을 정리하면

  1. 두괄식: 오버는 하지 말고 깔끔하게 쓰자
  2. 간단하게, 그리고 강렬하게 작성하라: 글자 수를 다 채울 필요는 없으며, 핵심을 명확히 전달하는 것이 중요하다.
  3. 사실에 기반해 과장: 자신을 어필하되 거짓말은 금물이다.

* 면접 시 주의 사항: 대충한 게임을 열심히 한 척 포장하지 않는다.

   TIP) 이왕이면 대중적인 게임을 플레이해서 이야기할 소재를 준비하자. (생소한 게임은 면접관들의 흥미를 끌기  어렵다.)

 

 

 

▼ 마무리

오늘, 드디어 첫 블로그를 작성했다.

아직은 블로그 작성이 낯설고 어렵지만 앞으로 매일 꾸준히 글을 쓰며 성장해가는 모습을 기록해보려한다.

 

 

 

'TIL' 카테고리의 다른 글
  • [24/12/02 멋쟁이사자처럼 부트캠프 TIL 회고] - 10일차 Unity 게임개발 3기
  • [24/11/28 멋쟁이사자처럼 부트캠프 TIL 회고] - 8일차 Unity 게임개발 3기
  • [24/11/27 멋쟁이사자처럼 부트캠프 TIL 회고] - 7일차 Unity 게임개발 3기
  • [24/11/26 멋쟁이사자처럼 부트캠프 TIL 회고] - 6일차 Unity 게임개발 3기
앵발자
앵발자
초보 개발자의 게임 개발 일지
  • 앵발자
    앵발자
    앵발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (13)
      • TIL (13)
      • 일상 (0)
      • 개념정리 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    liked list
    오블완
    delta time
    quere
    부트캠프
    티스토리챌린지
    unity
    Input System
    ANIMATION
    이진 트리
    animator
    unity 게임개발
    unity 게임 개발
    유니티UI
    유니티
    2d 게임개발
    노드
    자료구조
    Canvas
    멋쟁이사자처럼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
앵발자
[24/11/25 멋쟁이사자처럼 부트캠프 TIL 회고 ] - 5일차 Unity 게임개발 3기
상단으로

티스토리툴바