티스토리 뷰

드디어 유니티를 들어갔다 유니티에 들어가니 정말 강의에 계속 집중을 해야 따라갈 수 있다.. 그리고 유니티허브 + 비주얼스튜디오 + 검색, 디스코드용 웹 이렇게 키다보니 듀얼모니터로도 부족해서 앞으로 강의는 패드로 켜놓으려고 한다

그리고 켜야하는 창이 많아지다 보니 윈도우를 쓰는게 너무 불편하다 ㅜㅜ 맥북으로 갈아타야지..


💻 Unity

Unity 좌표계

X축 왼쪽(-) ↔ 오른쪽(+) 빨강
Y축 아래(-) ↔ 위(+) 초록
Z축 뒤(-) ↔ 앞(+) 파랑

 

월드 축, 로컬 축

월드 축 (World Space) Unity 전체 공간에서의 절대적인 축 방향
로컬 축 (Local Space) 특정 개체의 기준으로 한 상대적인 축 방향

 

📌 예제

  • transform.position → 월드 좌표 기준 위치
  • transform.localPosition → 부모 개체(Local Space) 기준 위치
  • transform.forward → 개체의 Z축 방향(로컬 축 기준)
  • transform.up → 개체의 Y축 방향(로컬 축 기준)
  • transform.right → 개체의 X축 방향(로컬 축 기준)

Object

게임 내에서 존재하는 모든 것을 의미

📌 예시

  • GameObject (게임 오브젝트)
  • Transform (위치, 회전, 크기 정보)
  • MeshRenderer (3D 모델을 표시)
  • Rigidbody (물리 적용)
  • Collider (충돌 감지)
  • AudioSource (소리 재생)
  • Camera, Light, Player

📌 특징

  • 게임에 배치할 수 있는 요소
  • Hierarchy 창에서 확인 가능
  • GameObject는 여러 컴포넌트(Component) 를 가질 수 있음
  • 기본적으로 Transform 컴포넌트를 포함함

Script

Object를 제어하는 코드 파일. 게임 오브젝트의 동작을 프로그래밍 할 수 있다

📌 특징

  • .cs 파일 (C# 언어 사용)
  • MonoBehaviour를 상속받음
  • GameObject에 추가해야 동작함
  • Start(), Update() 같은 기본 함수 포함

📌 스크립트의 역할

  • 캐릭터 이동, 점프 등 제어
  • 충돌 감지 및 이벤트 처리
  • UI 업데이트
  • 오브젝트 생성 및 삭제

Object와 Script의 관계

Script는 Object에 컴포넌트(Component) 형태로 추가돼야 실행할 수 있음

Object 게임 내에서 존재하는 물리적 요소 (캐릭터, 배경, 적 등)
Script Object의 동작을 정의하는 코드 (이동, 애니메이션, 이벤트 등)

Vector

public Vector2 v2 = new Vector2(5.0f, 5.0f);
public Vector3 v3 = new Vector3(5.0f, 5.0f, 7.0f);
public Vector4 v4 = new Vector4(1.0f, 0.5f, 0.0f, 1.0f); // 좌표보다 색상에 많이 씀 (RGBA)

Unit Vector 단위 벡터

  • Vector3.zero: (0, 0, 0) 벡터
  • Vector3.up: (0, 1, 0) 벡터, 위쪽 방향
  • Vector3.down: (0, -1, 0) 벡터, 아래쪽 방향
  • Vector3.left: (-1, 0, 0) 벡터, 왼쪽 방향
  • Vector3.right: (1, 0, 0) 벡터, 오른쪽 방향
  • Vector3.forward: (0, 0, 1) 벡터, 앞쪽 방향
  • Vector3.back: (0, 0, -1) 벡터, 뒤쪽 방향

Vector 연산

덧셈

Vector3 vector1 = new Vector3(1, 2, 3);
Vector3 vector2 = new Vector3(4, 5, 6);
Vector3 result = vector1 + vector2; // (5, 7, 9)

 

뺄셈

Vector3 vector1 = new Vector3(5, 7, 9);
Vector3 vector2 = new Vector3(1, 2, 3);
Vector3 result = vector1 - vector2; // (4, 5, 6)

A-B는 A를 바라보고 B-A는 B를 바라보는 방향으로 나온다

 

스칼라 곱

Vector3 vector = new Vector3(1, 2, 3);
float scalar = 2.0f;
Vector3 result = vector * scalar; // (2, 4, 6)

벡터에 스칼라(상수 값)를 곱하는 연산. 벡터의 크기는 스칼라 값만큼 확장되거나 축소된다.

 

벡터 크기

벡터가 나타내는 방향의 길이. 크기는 피타고라스 정리를 사용하여 계산된다.

Vector3 vector = new Vector3(3, 4, 0);
float magnitude = vector.magnitude; // 5

 

벡터 정규화

벡터의 크기를 1로 만드는 과정. 이 과정을 통해 벡터의 방향은 그대로 유지하면서, 크기가 1인 단위 벡터(unit vector)로 변환된.

Vector3 vector = new Vector3(3, 4, 0);
Vector3 normalizedVector = vector.normalized; // normalizedVector는 (0.6, 0.8, 0)이며, 크기는 1

 

내적

두 벡터의 내적은 두 벡터가 얼마나 동일한 방향으로 향하는지를 나타내는 값. 내적 값이 클수록 두 벡터의 방향이 유사하고, 내적 값이 0이면 두 벡터는 수직이다.

Vector3 vector1 = new Vector3(1, 2, 3);
Vector3 vector2 = new Vector3(4, 5, 6);
float dotProduct = Vector3.Dot(vector1, vector2); // 32

 

외적

3D 벡터에서만 사용할 수 있는 연산으로, 두 벡터의 외적은 새로운 벡터를 생성한다. 이 벡터는 원래 두 벡터에 수직인 벡터로, 외적을 통해 두 벡터가 이루는 평면에 수직인 벡터를 구할 수 있다.

Vector3 vector1 = new Vector3(1, 2, 3);
Vector3 vector2 = new Vector3(4, 5, 6);
Vector3 crossProduct = Vector3.Cross(vector1, vector2); //(-3, 6, -3)

키 입력받아 움직이기

public float speed = 5.0f;

void Update()
{
    //float move = Input.GetAxis("Horizontal");
		//transform.Translate(Vector3.right * move * speed * Time.deltaTime);
		
		var move2D = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);
		var move3D = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
		//transform.position += move3D * speed * Time.deltaTime;
		transform.Translate(move3D * speed * Time.deltaTime);
}

Time.deltaTime 는 프레임에 의존하지 않고 부드럽게 움직이게 하기 위해 사용

RigidBody

물리 엔진을 적용할 수 있는 컴포넌트. 중력(gravity), 힘(force), 충돌(collision) 등의 물리적 효과를 적용할 수 있다

public Rigidbody rigidBody;

public float jumpForce = 5.0f;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        // Rigidbody : 물리효과를 추가해 중력을 적용한다
        // AddForce : 점프를 위해 오브젝트에 힘을 준다
        // ForceMode.Impulse : 순간적으로 힘을 가하는 옵션
        rigidBody.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

Collider

충돌 판정을 담당한다. 이 컴포넌트를 추가하면 오브젝트가 다른 오브젝트와 충돌했을 때 감지할 수 있다


🕹️ 게임 실습

DragonFlight

Background

Background용 Quad 오브젝트를 만들고 이 오브젝트에 씌울 넣을 머테리얼을 만든다. 머테리얼에 넣을 이미지를 연결하고, 오브젝트에 머테리얼을 연결한다

  1. Quad Object 추가
  2. Material 추가 후 Shader를 Unlit/Texture로 변경 후 이미지 파일 연결
  3. 이미지 파일 설정
  4. Main Camera Object에 배경음악 추가

💫 Tip!

.gitignore 파일 수정

# Get latest from <https://github.com/github/gitignore/blob/main/Unity.gitignore>
**/[Ll]ibrary/
**/[Tt]emp/
**/[Oo]bj/
**/[Bb]uild/
**/[Bb]uilds/
**/[Ll]ogs/
**/[Uu]ser[Ss]ettings/

프로젝트용이 아니라 공부용이기 때문에 하위폴더에 유니티 프로젝트가 있어서 이렇게 바꿔주어야 한다

 

Unity 기본 메서드 불러오기

Ctrl + Shift + M


📝 과제

간단한 게임

https://github.com/yh97yhyh/likelion-unity-study/tree/main/BasicGame

using UnityEngine;
using UnityEngine.SceneManagement;

public class SphereController : MonoBehaviour
{
    public Rigidbody rb;
    public float moveSpeed = 5f;
    public float jumpForce = 5f;

    private Vector3 startPosition; 
    public Transform mainCamera;
    private Vector3 cameraStartPosition;

    void Start()
    {
        rb = GetComponent<Rigidbody>();

        startPosition = transform.position;

        if (mainCamera != null)
        {
            cameraStartPosition = mainCamera.position;
        }
    }

    void Update()
    {
        transform.position += Vector3.right * moveSpeed * Time.deltaTime;
        
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }

        // print($"Sphere 위치 : {transform.position}");
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Barriar"))
        {
            RestartGame();
        }
    }

    private void RestartGame()
    {
        transform.position = startPosition;
        rb.angularVelocity = Vector3.zero;

        if (mainCamera != null)
        {
            mainCamera.position = cameraStartPosition;
        }
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함