ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] Unity 강의 1
    TIL 2024. 5. 8. 20:51

    Unity

    게임 엔진이란?

    게임을 개발할 수 있도록 다양한 기능을 제공하는 프로그램

    그래픽, 물리, 사운드, 애니메이션 , 인공지능 등 다양한 요소 관리 및 통합

    특징

    다양한 플랫폼에서 실행 가능한 게임 개발 (크로스 플랫폼)

    사용자 친화적인 인터페이스와 강력한 기능 제공

    구조

    C++로 구성된 코어 엔진을 연결해주는 C#구현부가 있고

    C# 언어를 통해 스크립트를 작성

     

    유니티는 게임 개발을 위한 통합 개발 환경이다.

     

    주요기능 

    더보기

    프로젝트 관리 : 새로운 프로젝트 생성, 프로젝트 파일 구성 및 관리

    씬(Scene) 관리 : 게임의 각 장면과 화면을 구성하는 요소

    에셋(Asset) 관리 : 게임에 필요한 리소스 관리

    컴파일 및 빌드: 스크립트 코드를 컴파일하여 실행 가능한 게임으로 빌드

    디버깅: 코드 실행 중 오류를 찾고 수정

    에디터 확장 기능: 유니티 에디터를 사용자의 요구에 맞게 확장할 수 있는 기능 제공

     

    Scene

    연극에서 하나의 막과 유사하다 생각하면 편하다

    게임의 각 장면 또는 화면을 의미, 유니티에서는 씬 단위로 오브젝트를 로드하고 언로드 한다

    유니티에서 게임은 하나 이상 씬으로 구성, 각 씬은 게임의 특정 부분을 담당

    ex) 메뉴, 게임플레이, 엔딩 씬 등

    Object

    씬에 배치되는 모든요소, 게임의 동작과 상호작용을 담당 ex) 캐릭터, NPC, 아이템, 장애물 등

    게임 오브젝트는 모드 트랜스폼을 가지고 있으며, 그 트랜스폼을 통해 부모 - 자식 관계를 가진다.

    따라서 게임오브젝트들의 구조는 계층뷰이다.

    Component

    게임오브젝트를 구성하는 부품 ex) Transform. SpriteRenderer 등이 있다.

    각 기능들의 부픔들을 붙여서 게임 오브젝트를 완성한다.

    Asset

    일반적으로 말한는 에셋은 이미지 사운드 모델 등을 말한다

    정확하게는 코드를 포함하여 게임에 필요한 모든 리소스를 의미한다.

    프로젝트의 에셋폴더에 저장, 유니티에 사용가능한 형식으로 가져와 게임에 활용된다.

     

    프로젝트 생성시 이름은 영어를 권장한다.

     

     

    인터페이스

    Herarchy 뷰 : 현재 씬의 게임 오브젝트 계층 구조 표시 및 편집

    Scene 뷰 : 게임 개발자의 관점에서, 현재 씬의 오브젝트들의 배치 등을 관리

    Game 뷰 : 게임 플레이어들의 관점의 뷰로 카메라가 찍은 플레이 화면 확인

    Inspector 뷰 : 선택된 게임 오브젝트의 속성 및 구성 요소 편집

    Project 뷰 : 프로젝트의 에셋 표시 및 관리

    Console 뷰 : 게임 실행중의 로그 및 메시지 표시

     

    유니티 기본 컴포넌트

    1. SpriteRenderer

    2. Rigidbody 2D

    3.  _Collider2D

    더보기

    1. SpriteRenderer

    2d 이미지를 표현하는 컴포넌트

    sprite , 이미지 넣기

    Color , 색상 조절

    Flip, 상하 좌우 반전

    Sorting, Order in Layer  우선순위

     

    2. Rigidbody 2D

    2D 게임에서 유니티 내부 물리엔진을 기반으로 시뮬레이션 하는용도

     

    3. _Collider2D

    충돌 감지나 특정 범위내를 감지하기 위해 활용하는 컴포넌트

    충돌이 일어났는지  충돌이 진행 중인지 충돌이 끝났는지 등을 이벤트로 알려준다.

    ex) Box Collider, Circle Collider 등

    유니티 스크립트 라이프 사이클

    Monobehaviour를 상속받는 클래스는 유니티 이벤트 함수를 활용할 수 있다.

    이벤트 함수의 실행 순서

    더보기

    실행순서

    Awake -> OnEnable -> Start 

    FixedUpdate-> OnTrigger -> OnCollosion ->Update -> LateUpdate

    -> OnDisable -> OnDestroy -> OnApplicationQuit

    1. Awake: 게임 오브젝트가 생성될 때 호출되는 메서드
    2. OnEnable: 게임 오브젝트가 활성화될 때 호출되는 메서드
    3. Start: 게임 오브젝트가 활성화되어 게임 루프가 시작될 때 호출되는 메서드, 초기 설정 및 시작 작업을 수행
    4. FixedUpdate: 물리 엔진 업데이트 시 호출되는 메서드. 물리적인 시뮬레이션에 관련된 작업을 처리할 때 사용
    5. Update: 매 프레임마다 호출되는 메서드로, 게임 로직의 주요 업데이트가 이루어짐.
    6. LateUpdate: Update 메서드 호출 이후에 호출되는 메서드. 다른 오브젝트의 업데이트가 완료된 후에 작업을 수행
    7. OnDisable: 게임 오브젝트가 비활성화될 때 호출되는 메서드.
    8. OnDestroy: 게임 오브젝트가 파괴될 때 호출되는 메서드. 자원 정리 및 해제 작업이 수행

     

     참고

    https://docs.unity3d.com/kr/2021.3/Manual/ExecutionOrder.html

     

    이벤트 함수의 실행 순서 - Unity 매뉴얼

    Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.

    docs.unity3d.com

     

     

    유니티에서 쓰이는 개념들

    1. Pixel Per Unit(PPU)
    2. 계층 구조(Transform 구조)
    3. 로컬 좌표계(Local Coordinate System)와 월드 좌표계(World Coordinate System)
    4. Input.GetAxis
    5. Time.deltaTime
    더보기

    1. Pixel Per Unit(PPU)

    스프라이트의 픽셀수와 해당 스프라이트가 게임 세계에서 차지하는 공간의 관계

    ex) PPU가 100이라면 스프라이트 100픽셀은 게임 세계에서 1 유니티 단위를 나타낸다.

    PPU값이 클수록 스프라이트는 작아진다.

    높은 PPU 값은 더 자근 스프라이트를 생성하므로 더 높은 해상도의 물리 시뮬레이션을 가능하게 한다.

    높은 PPU값은 더 많은 연산을 필요로 한다. 성능에 영향을 미칠 수 있다.

    모든 스프라이트에 대해 일관된 PPU 값을 사용하는 것이 좋다.

     

    2. 계층 구조(Transform 구조)

    각 오브젝트는 Transform 컴포넌트를 가지고, 그 컴포넌트는 오브젝트의 위치, 회전, 크기를 정의

    오브젝트는 다른 오브젝트의 자식이 될 수 있다.

    부모 오브젝트의 Transform이 변경되면, 그 자식 오브젝트의 Transform도 동일하게 적용된다.

    이런 게임오브젝트들 사이에 계층적인 관계가 형성되고 이를 트리구조라고도 부른다.

     

    3. 로컬 좌표계(Local Coordinate System)와 월드 좌표계(World Coordinate System)

    로컬좌표계

    인스펙터 창에서 볼 수 있는 position, sacle, rotation등이 해당

    부모에 대한 좌표를 말한다.

    ex) localPostion, localRotation, localScale 를 통해 스크립트에서 참조 가능

    월드 좌표계

    월드 좌표계의 위치는 게임 환경 내에서 오브젝트의 절대적인 위치를 나타낸다.

    변하지 않고 일정하게 유지된다.

    ex) position, rotation, lossyScale 를 통해 스크립트에서 참조 가능

     

    4. Input.GetAxis

    유니티의 입력 시스템에서 사용되는 메서드

    -` 부터 1 사이의 값을 반환한다. 0에 가까울수록 입력이 없거나 중립 상태를 나타내며

    양수 값은 양 방향 입력, 음수 값음 음 방향 입력을 나타낸다.

    주로 플레이어의 움직임, 회전, 점프 등을 처리하는데 사용 된다.

     

    5. Time.deltaTime

    이전 프레임 부터 현재 프레임까지의 경과 시간을 나타낸다.

    게임 프레임 속도에 상관없이 일정한 시간 간격으로 동작하는 게임을 만들 때 유용하다.

    주로 움직임, 애니메이션, 물리 시뮬레이션 등에서 시간에 따른 변화를 조정하는 데 사용

    Time.deltaTime은 초 단위의 값을 반환하며, 1초에 1에 가까운 값을 가진다.

    이를 통해 게임이 일정한 속도로 동작하고, 다양한 기기나 환경에서도 일관된 경험을 제공할 수 있다.

     

     

    접근제한자와 직렬화 속성

    Public 

    변수나 메서드가 외부에서 접근 가능하도록 공개

    다른 클래스나 스크립트에서 해당 멤버에 접근하여 값을 설정하거나 호출

    Private 

    변수나 메서드가 같은 클래스 내에서만 접근 가능하도록 제한

    다른 클래스나 스크립트에서 접근 불가능

    보통 내부 사태를 관리, 내부 구현에 사용

    [SerializeField]

    private로 선언된 변수를 인스펙터에서 접근 가능

    [HideInspector]

    public으로 선언된 변수를 인스펙터 창에서 숨겨준다.

     

    InputManager

    Window - PackageManager- UnityRegistry - InputSystem검색 후 설치

    New Input System

    더보기

    핵심 개념

    1. Input Action  : 입력 행동을 정의. 예를 들어 점프, 공격 등의 행동을 정의하고 키 또는 버튼 지정 가능

    2. Input Action Asset: 여러 개의 행동을 그룹화 한다. 재사용 가능한 입력 설정을 만들어 적용 가능

    3. Player Input Component: 자동으로 입력 행동을 처리하고 해당 오브젝트에 메시지를 보낸다

    장점

    1. Cross-Platform Compatibility: 다양한 플랫폼과 입력 장치에 대해 일관된 방식으로 작동

    2. Rebinding: 플레이어가 게임 내에 자신의 입력 설정을 변경할 수 있도록 지원

    3. Multiplayer Support: 여러 플레이어가 동일한 장치에서 플레이하거나 각각의 장치에서 할 때 입력을 쉽게 처리

     

    playerInput 컴퍼넌트

    SendMessage : 같은 게임 오브젝트의 모든 컴포넌트에 메시지를 뿌림

    Broadcast Messages : 같은 게임 오브젝트와 그 자식 게임 오브젝트의 모든 컴포넌트에 메시지 뿌림

    Invoke Unity Event : OnClick 처럼 Unity Event 형태로 관리 된다.

    Invoke C Sharp Events : PlayerInput.OnActionTriggered에 호출하고 등록해 어떤 이벤트인지 확인 가능

     

     

    충돌과 각 컴포넌트의 이해

    unity에서 충돌과 관련하여 중요한 개념은 ColliderRigidbody 컴포넌트다.

    더보기

    1. Collider

    게임오브젝트에 물리적 형태를 부여한다. 이는 충돌을 감지하게 해준다.

    2. Rigidbody

    게임 오브젝트에 물리 법칙을 적용한다. 

    Rigidbody가 있는 오브젝트는 중력에 영향을 받고, 힘과 토크를 통해 움직일 수 있다.

     

    충돌이 되는 대상 중 한 쪽에는 Rigidbody가 있어야 Collision (or Trigger)이 작동한다.

     

     

    타일맵(TileMap)

    타일 기반 게임 환경을 쉽게 만들어 주는  시스템

    구성요소

    더보기

    Tilemap GameObject : 타일맵 구조를 구성하는 데 사용, Grid의 자식으로 위치하고 특정 타일의 배치 관리

    Grid GameObject: 모든 타일맵이 위치하는 기본 격자를 나타낸다.

    Tilemap Renderer: Tilemap모양을 실제로 그리는 역할

    Tilemap Collider 2D: 필요한 경우, Tilemap에 콜라이더 추가

    Tile Assets : 개별 타일의 모양과 동작을 정의, 여러개 타일을 묶어서 Tileset이라 부르기도 한다.

     

     

    유니티의  각도 개념

    1. 쿼터니언(Quaternion)

    2. 아크탄젠트(ArcTangent)

    더보기

    1. 쿼터니언(Quaternion)

    유니티 인스펙터 창에서 나오는 회전은 Vector3으로 표현되고 이런 바법을 오일러각(Euler Angle)이라 한다

    하지만 많은 3D소프트웨어는 내부적으로 쿼터니언을 사용한다.

    쿼터니언 사용시 짐벌락(Gimbal Lock) 문제를 피할 수 있다.

    Gimbal Lock = 극단적인 각도로 회전할 경우 한 축의 회전을 잃어버리는 것

    수학적으로는 4차원 복소수를 이용한 회전 표현 방법이다.

    ex) Quaternion.Euler, Quaternon.LookRotation Quaternion.Slerp 등을 이용

     

    Quaternion.Euler : 오일러 각을 쿼터니언으로 변경  {Quaternion.Euler(0f, 0f, degree)}

    Quaternion.LookRotation : 앞과 위를 특저한 방향으로 하는 회전 쿼터니언 생성

    Quaternion.Slerp : 쿼터니언과 다른 쿼터니언 사이의 내분점 확인 

     

    2. 아크탄젠트(ArcTangent)

    삼각함수에서 아크(arc)가 붙으면 역삼각함수를 말한다.

    아크 탄젠트는 탄젠트의 역함수로 가로와 세로 비에 따른 각도를 계산하는데 사용한다.

    2D에서 점 또는 벡터에 대한 각도를 찾는 데 아크탄젠트 함수가 종종 사용된다.

    Atan2를 활용해 객체가 특정 방향을 향하게 만들거나 두 점 사이의 각도를 계산할 때 유용하다.

     

    참고

    https://docs.unity3d.com/Manual/QuaternionAndEulerRotationsInUnity.html

     

    Unity - Manual: Rotation and orientation in Unity

    Rotation and orientation in Unity Unity uses a left-handed coordinate system. In Unity, you can use both Euler angles and quaternions to represent rotations and orientation. These representations are equivalent but have different uses and limitations. Typi

    docs.unity3d.com

     

    유니티 잡다한 팁

    F2 : 오브젝트 이름 바꾸는 단축기

    [Hearder] 

    엔진상에서 카테고리같이 뜬다. Public으로 엔진상에서 받아야할 오브젝트가 많은경우 정리할 때 유용할 것 같다.

     

    'TIL' 카테고리의 다른 글

    [TIL] Unity 3 + 알고리즘 문제  (0) 2024.05.10
    [TIL] Unity 강의 2  (0) 2024.05.09
    [TIL] 게임 특강  (0) 2024.05.07
    [TIL] 2024-05-03 팀 프로젝트 마무리  (0) 2024.05.03
    [TIL]C# Json 리스트 저장  (0) 2024.05.02
Designed by Tistory.