Unity3D Canvas

최종 수정일 : 2018-08-13

GameObject Canvas

  • Unity에서 모든 UI Element(텍스트, 이미지, 버튼, 슬라이더 등)는 반드시 이 Canvas 객체 하위에 위치해야만 한다.
  • Rect Transform, Canvas, Canvas Scaler, Graphic Raycaster. 총 4개의 컴포넌트로 구성된 GameObject.
  • 한 Scene에서 여러개 생성하거나 다른 Canvas 객체의 하위로 차일드화 할 수 있다.
  • Hierarchy View에 Canvas를 생성할 경우, Event System도 자동으로 생성된다.

    EventSystem

  • 시스템에서 발생하는 키보드, 조이스틱, 스크린터치 등의 입력 정보를 Canvas 하위에 있는 UI 항목에 전달하는 역할.
  • Standalone Input Module 컴포넌트를 포함하고 있다.
  • First Selected 속성을 통해 처음 포커스를 갖는 UI 항목을 지정할 수 있다.
  • EventSystem이 없다면, UI 항목이 클릭 또는 터치와 같은 이벤트에 반응하지 않는다.

    Rect Transform

  • Canvas 및 UI 항목에 자동적으로 추가되어있다.
  • 앵커(Anchors), 피봇(Pivot), 크기(W, H), 위치(Pos X, Pos Y, Pos Z)와 회전 및 스케일 정보를 저장하고 있다.
  • UI용 Transform 컴포넌트 / 기존 Transform 컴포넌트와 동일한 역할
  • 속성을 직접 수정할 수 없으며, 화면의 크기에 따라 자동으로 설정된다.

    Anchor Point

  • UI 항목 상위의 Canvas 영역을 기준으로 표시하는 것.
  • UI 항목의 정렬(Align)과 크기 조절(Stretch)을 설정한다.
  • 앵커 포인트는 각각 4개의 삼각형으로 구성돼 있으며, 각각 개별적으로 움직일 수 있다.
  • 앵커 포인트는 UI 항목 자기 자신의 Rect Transform이 기준이 아니라 그 상위 객체의 Rect Transform을 기준으로 삼는다.

    Anchors Min & Max

  • 앵커 값의 범위를 나타내며, % float 형식의 값이 들어가며, %로 표현된다.
  • Pivot

    Anchor Preset

  • 각 UI 항목의 정렬과 크기를 미리 정의해놓은 집합.
  • UI 항목의 Inspector View의 Rect Transform의 가장 왼쪽에 있는 것.
  • UGUI의 기본이 되는 개념
  • 앵커 프리셋은 각각 일반 마우스를 클릭했을 때와 Alt 키와 Shift키의 조합에 따라 다른 조합을 볼 수 있다. [Alt + Click] [Shift + Click] [Alt + Shift + Click]

    anchoredPosition

  • Rect Transform 속성 맨 위에 있는 Pos X, Pos Y, Pos Z는 해당 UI 항목의 ‘앵커 포인트를 기준’으로 상대적으로 얼마만큼 떨어져 있는지를 나타내는 anchoredPosition이다.

    Canvas Component

    1. UI 항목을 화면에 배치하고 렌더링하는 역할.
    2. Render Mode 옵션에 따라 UI 항목의 화면 배치 방식을 결정할 수 있다.
    3. Screen Space - Overlay
  • 기본 설정값으로 UI 항목은 씬의 가장 상위 계층에서 표현되며, 화면의 해상도에 맞춰 자동으로 스케일이 조절된다.
    1. Screen Space - Camera
  • 씬의 가장 상위에 UI 항목이 표시되는 것은 Overlay방식과 같지만, UI 항목을 렌더링하는 별도의 카메라를 설정할 수 있다.
  • 씬을 비추는 Main Camera와 UI를 위한 카메라로 이원화할 수 있다.
  • Render Camera 속성에 원하는 카메라를 연결하면 된다.
  • UI Camera의 Projection 속성을 Perspective로 설정
  • UI Camera를 따로 설정할 경우, Main Camera와 충돌이 없도록 반드시 Clear Flag, Culling Mask, Depth속성을 적절히 설정해야 한다.
    1. World Space
  • 씬 내에 있는 다른 게임오브젝트에 직접 UI 항목을 추가한다.
  • 대표적으로 HUD(Head Up Display)를 구현할 때 사용.
  • 특정 게임오브젝트에 Canvas 객체를 추가하고 Render Mode를 World Space로 설정하면 해당 Canvas는 더는 Rect Transform의 영향을 받지 않으며, 해당 게임오브젝트의 위치에 영향을 받는다.
    Canvas Component Render Mode 변경에 따른 내용 Canvas Component Render Mode 변경에 따른 내용 Canvas Component Render Mode 변경에 따른 내용
Read more · 3 min read

Unity3D C# Delegate

최종수정일 : 2018-08-13

Delegate


  1. 메소드에 대한 참조를 나타내는 방
  2. 메소드 대신해서 호출하는 역할
    • 메소드의 대리인 역할을 해주는 변수
    • 메소드를 직접적으로 호출하는 방식이 아닌, 델리게이트를 호출함으로써 해당 메소드를 호출(실행)할 수 있는 방식.
    • 델리게이트를 ‘인스턴스화’ 하면 호환되는 파라미터 타입/개수와 리턴 타입이 같은 모든 메소드를 참조할 수 있게 된다.
  3. C++의 함수 포인터와 동일한 형태로 사용가능하지만, 안전하게 캡슐화하여 사용할 수 있다는 장점이 있다.
  4. 콜백(CallBack) 메소드를 구현할 때 효율적이다.
    • CallBack Method란?
    • A 메소드를 호출할 때 B 메소드를 넘겨줘서 A 메소드로 하여금 B 메소드를 호출하도록 하는 것. 이 때 A 메소드를 콜백 메소드라고 한다.
  5. Delegate Chain : 하나의 델리게이트에 여러개의 메소드를 연결시키는 것. 함수를 멀티캐스트(Multicast)할 때 사용하면 유용하다.
Read more · 2 min read

Unity3D Generic Collection, Boxing and Unboxing

최종 수정일 : 2018-08-13

일반화 컬렉션


  • 종류 : List, Queue, Stack, Dictionary
  • ArrayList, Queue, Stack, HashTable의 일반화 버전
  • using System.Collection.Generic; 네임스페이스 안에 존재하기 때문에 사용 선언 필수.

    일반화 컬렉션(Generic Collection)을 사용하는 이유.

  • C# 언어 내부에서 제공하는 Collection(Stack, Queue, ArrayList, HashTable)에 데이터의 입, 출력이 있으면 그때마다 박싱과 언박싱이 계속해서 발생하게 되고, 데이터가 많아질수록 컴퓨터 성능에 상당한 부하가 발생하게 된다.
  • 부하가 발생하는 원인 : 컬렉션은 데이터의 어떤 타입도 전부 object 타입으로 저장하기 때문에, 데이터에 접근할 때마다 본래 타입으로의 형식변환이 일어나기 때문이다. => Boxing과 UnBoxing.
  • 성능 상의 이슈가 문제가 된다면, 컬렉션보단 일반화 컬렉션(Generic Collection)을 사용하기로 한다.

    Boxing

  • 값(Value) 형식을 Object형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스.
  • 값 형식을 참조 형식으로 바꾸는 것.
  • 메모리의 Stack 영역에서 Heap 영역으로 데이터가 복사되고, 그 복사된 데이터를 object가 참조하게 한다.(값 형식 -> 참조 형식)
  • 암시적이다. Boxing의 예시

    UnBoxing

  • Boxing된 데이터를 Heap 영역에서 Stack영역으로 복사한다.(참조 형식 -> 값 형식)
  • 명시적이다. UnBoxing의 예시
    참고 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing
Read more · 1 min read

Unity3D Quaternion Component

최종 수정일 : 2018-08-13

Quaternion


[ Quaternion 이란 ? ]


  • 유니티에서 사용되는 각도의 단위
  • 유니티에서 회전을 표현하기 위해 사용되는 구조체(Struct)
  • 수학적인 용어로 복소수 4차원 벡터(Four-Deminsional Complex Number)
    1. 각도를 4개의 원소로 표현한 것. ( = 사원수)
    2. x, y, z, w로 표현되어 있음.
  • 우리가 알고 있는 1도, 45도, 90도 등의 표현은 오일러 각(Euler Angle)이라고 한다.


    [ Quaternion이 나오게 된 이유 ]


  • 오일러 각은 3차원 공간의 절대 좌표를 기준으로 물체가 얼마나 회전했는지 측정하는 방식이다.
  • 오일러 각은 회전 시킬 때, X, Y, Z 축을 차례대로 회전 시키는 방식을 사용하고 있다.
  • 이 때 X, Y, Z 축 중 2개의 축이 겹쳐 졌을 때 어느 축으로도 회전되지 않고 잠기는 현상이 발생하는데, 이를 짐벌락(Gimbal Lock)이라고 한다.
  • 유니티에서는 이 짐벌락 현상을 해결하기 위해 Quaternion이 제시되어, 세 축을 차례대로 회전시키는 것이 아닌, 세 축을 동시에 회전시키는 방식을 사용하고 있다.
  • 이렇게 때문에 유니티 게임오브젝트를 회전시킬 때 사용하는 Rotate 함수는 유니티 내부에서 Quaternion으로 자동 변형되며, rotation은 Quaternion의 타입의 속성으로 Quaternion.Euler(x, y, z) 함수를 이용해 오일러 각을 Quaternion 타입으로 변형해서 대입해야 한다.


    [ 참 고 ]


    Quaternion.identity

  • 이것은 Quaternion 타입의 한 속성으로 API 문서에는 “회전 없음” 을 의미한다고 적혀있다.
  • 추가로 월드 좌표 축 또는 부모의 축으로 정렬된다고 나와 있다.
  • 하지만 이는 “회전 없음” 이라고 보기 보다는, “특정 회전 값 없이 생성하려는 프리팹 또는 3D 모델의 원래 회전각도로 적용한다” 라고 보는 것이 좀 더 정확할 것 같다.
  • API문서를 본다면 또 “쿼터니언은 복잡한 수를 기반으로 하고, 직관적으로 이해하기 쉽지 않습니다. 따라서 거의 접근하지 않거나 개별 쿼터니언 컴포넌트(x,y,z,w)를 수정하지 않습니다.” 라고 적혀있는데, 유니티는 다 배운 이후, Quaternion에 대해 좀 더 깊숙하게 공부해 볼 필요성이 있을 것 같다.
Read more · 2 min read

Unity3D Collider Component


최종 수정일 : 2018-08-13

[Collider Component]



  • 충돌을 감지하는 센서 역할을 하는 컴포넌트
  • Box, Sphere, Capsule, Mesh, Wheel, Terrain 의 형태 Collider 제공

    Box Collider


  • 가장 다용도로 사용.
  • Center, Size 속성으로 박스 형태를 조절
    BoxCollider Component

    Sphere Collider


  • 가장 속도 처리가 빠른 Collider.
  • Radius 속성으로 구체의 반지름을 조절
  • 정밀한 충돌 감지를 해야하는 경우를 제외하고서는 대부분 Sphere Collider 사용하는 것을 권장.
    SphereCollider Component

    Capsule Collider


  • 주로 인체 또는 나무, 가로등과 같은 모델의 충돌체로 사용.
  • Height 속성으로 캡슐의 높이 조절 가능.
  • Direction 속성은 Height 값을 변경했을 때 커지는 축을 설정. 기본 Y축.
    CapsuleCollider Component

    Mesh Collider


  • CPU 부하가 가장 높은 Collider
  • 아주 세밀한 충돌 감지에 사용된다.
  • 유니티에서는 Mesh Collider 간의 충돌 감지가 안되도록 기본값 설정.
  • 속도 저하를 방지하기 위함
  • Convex 속성을 체크하면 Mesh 간의 충돌 감지 가능하나, 단순 메쉬로 변경.
    MeshCollider Component

    Wheel Collider


  • 차량의 바퀴에 사용할 목적으로 제공.
  • 바퀴의 서스펜션, 바닥과의 마찰저항과 미끄러지는 저항을 세밀하게 조절 가능.

    Terrain Collider


  • 유니티에 내장된 Terrain Engine을 이용해 생성한 지형에 적용되는 Collider.
  • 지형의 복잡도에 따라 Collider의 부하가 높아진다.
  • 로우폴리 Mesh를 이용해 Mesh Collider로 대체하는 것도 좋은 방법.

    충돌 감지 조건


  • 충돌을 일으키는 양쪽 게임오브젝트 모두 Collider 컴포넌트가 추가돼 있어야 한다.
  • 두 게임오브젝트 중 움직이는 쪽에는 반드시 Rigidbody Component가 있어야한다.

    연산 처리 속도가 빠른 Collider


  • Sphere Collider > Capsule Collider > Box Collider

    충돌 이벤트.


  • Collider 컴포넌트를 포함한 게임오브젝트 간의 충돌이 발생할때 호출되는 이벤트.
  • 모든 Collider Component에는 IsTrigger 속성이 있다.
  • 이 속성을 체크할 경우 충돌은 감지되지만, 물리적인 충돌은 일어나지 않는다.
  • 주로 감지 센서 역할을 하는 게임오브젝트에서 많이 사용하는 속성.

    void OnCollisionEnter


  • IsTrigger UnCheck했을 시,
  • 두 물체 간의 충돌이 일어나기 시작했을 때

    void OnCollosionStay


  • IsTrigger UnCheck했을 시,
  • 두 물체 간의 충돌이 지속될 때

    void OnCollisionExit


  • IsTrigger UnCheck했을 시,
  • 두 물체가 서로 떨어졌을 때

    void OnTriggerEnter


  • IsTrigger Check했을 시,
  • 두 물체 간의 충돌이 일어나기 시작했을 때

    void OnTriggerStay


  • IsTrigger Check했을 시,
  • 두 물체 간의 충돌이 지속될 때

    void OnTriggerExit


  • IsTrigger Check했을 시,
  • 두 물체가 서로 떨어졌을 때
Read more · 2 min read