본문 바로가기
UNITY/유니티게임스쿨

[유니티게임스쿨 TIL] 유니티 기본 :: 유니티 설치와 인터페이스 이해

by 램플릿 2024. 5. 31.

컴퓨터 기초


컴퓨터의 구성

  • CPU
  • RAM (주기억장치) ( 2^nGB단위로 설치하는것이 좋다. 휘발성)
  • 보조저장장치 (HDD, SSD등. 비휘발성)
  • 그래픽카드/VGA/GPA
  • 메인보드
  • 입출력장치

+) 유니티용 컴퓨터 사양 추천

최소 GTX1660Ti ~ 권장 RTX3060

CPU는 i5/rygen5

 

 

2진수와 10진수와 16진수

 컴퓨터는 0과 1로 모든 것을 표현하는 기계이다.

  • 2진수 : 0~1   (e.g. 11010)
  • 10진수 : 0~9   (e.g. 26)
  • 16진수 : 0~E   (e.g. 1A)

 

🎓 새로운 지식 :: const 상수(리터럴)
const int a=10; 선언 후 a=5; 하면 에러가 발생한다.
이유 : const는 상수화 키워드기때문에 처음 한 번만 초기화 가능하기 때문이다.
이렇게 상수로 초기화 된 변수를 리터럴이라고 한다.

 

 


 

클래스와 상속 (복습)


클래스

  • 클래스는 설계도면과 같다.
  • 데이터 참조방식이다.

- 선언 방법 : (접근제어자) class (클래스네임)

 e.g.  public class Animal{ }

 

- 인스턴스화 방법 : (변수 선언부) (객체*명) = (메모리를 할당)

 e.g.  Animal j = new Animal();

 

(* 객체 = 오브젝트 = 인스턴스)

주의❗ 클래스의 이름을 지을 때 띄어쓰기를 넣거나 맨앞에 숫자를 넣으면 안됩니다!

 

 

클래스의 상속과 오버라이드

  • 정보은닉(캡슐화)과 다형성을 위해 사용된다.
class Animal {    //부모클래스
  virtual void function(){~~}
}

class Cat : Animal {    //자식클래스
  override void function(){~~}
}

 

 

 


 

 

유니티 설치


 

유니티 설치하기

유니티 허브 설치 후 로그인
→ Installs 탭 클릭
→ Unity Editor 설치 (LTS권장)

 

(실습을 위해 2022.3.30f1버전 설치하였음)

 

 

 

유니티 에셋 추가하기

Unity assetstore에서 무료 에셋을 추가 (Unity-Chan! Model,RPG Poly Pack)
→ Unity에서 열기
→ Download
→ Import

 

 

 

  • Sample Scene의 모습

 


 

유니티 인터페이스 이해


 

유니티 씬 기본 조작법

 

유니티에서의 좌표축

  • X 가로방향
  • Y 높이방향
  • Z 깊이

 

카메라 조작

- Field of View(FOV) : 시야각. 숫자가 커질수록 더 많은 범위의 모습을 카메라에 담게 된다.
- Camera Speed : 카메라의 이동속도를 조정할 수 있다.

 

 

① 카메라를 이동시킬 수 있다.
② 오브젝트를 선택하여 Global 또는 Local(오브젝트 기준) 축으로 이동시킬 수 있다.
③ 오브젝트를 회전시킬 수 있다.

+) ctrl + shift + f 누르면 현재 보고있는 뷰 위치로 카메라(오브젝트)를 이동시킬 수 있다.

 

 

Hierarchy

  • 현재 배치되어있는 오브젝트들을 보여주는 정보창.
  • 하이어라키 창에서 오브젝트를 선택하여 더블클릭 또는 F키를 누르면 오브젝트의 현재 위치로 카메라를 이동할 수 있다.

 

 

Inspector

  • 선택한 오브젝트의 속성, 즉 컴포넌트(Transform 위치/회전/스케일 정보, Material 재질 등)와 설정값을 보여준다.
  • Component(기능 단위의 클래스)를 추가할 수 있다.
  • Active/Deactive 체크박스를 클릭하여 오브젝트를 활성화/비활성화 할 수 있다.

 

🎓 새로운 지식 :: 엔티티 컴포넌트 시스템 (ECS; Entity Component System)
게임 개발에 주로 사용되는 소프트웨어 아키텍처 패턴. 컴포넌트를 조합해 만드는 엔티티와 그 컴포넌트에 대해 작동하는 시스템으로 구성된다. 엔티티(오브젝트)에 컴포넌트를 추가, 제거, 수정하여 엔티티의 동작을 변경할 수 있다. 이를 통해 객체지향 프로그래밍에서 이해, 유지보수, 확장을 어렵게 만드는  상속 계층구조의 모호성 문제를 제거할 수 있다.
💡질문 :: Active/Deactive와 Enable/Disable의 차이가 뭔가요? ★★★★★
⇒ 오브젝트를 활성화/비활성화 하는 것이 Active/Deactive이고, 오브젝트 내의 컴포넌트를 활성화/비활성화 하는 것이 Enable/Disable입니다. 체크박스를 클릭하지 않고도 스크립트에서 오브젝트를 gameObject.SetActive( true|false ); 를 통해 활성화/비활성화 할 수 있습니다.

 

 

Component

  • Inspector 창에서 Add Component를 누른 후 해당 Component를 검색하면 찾을 수 있다.
  • 해당 명의 Component가 없는 경우 Create and Add가 가능하며 이후 Script를 작성하여 원하는 사용자기능을 추가할 수 있다.
Tip👍 :: 스크립트를 수정하려는데 Visual Studio가 켜지지 않을 때
Edit -> Preferences -> External Script Editor 를 Visual Studio 2022로 변경하면 스크립트를 열 때 기본적으로 VS2022가 켜집니다.

 

 

 


 

 

유니티의 기본 함수


 

유니티 스크립트(C#) 작성시 사용되는 기본 함수들

   (기본 제공 API 또는 Function 또는 Method 라고도 함)

void Awake(){
	//생성자는 클래스가 인스턴스화 될 때 초기에 제일 먼저 불리는 함수같은 역할을 하는데,
	//유니티에서는 생성자를 사용하지 않는 대신 void Awake(){ } 를 사용한다.
    //자기 자신의 데이터를 초기화하는 용도!
    //(생성자 안에서 Awake를 호출하는 형식)
}

void Start(){
	//오브젝트가 Loop, 즉 매번 틱(frame)마다 도는데
    //맨처음 틱의 Update함수가 불리기 직전에 불리는 함수.
    //사용예시) 각 오브젝트끼리 데이터를 상호 교환하거나 첫 동작상태를 지정할 때
}

void OnEnable(){
	//컴포넌트가 켜졌을 때 호출된다.
    //당연히 생성시에 컴포넌트가 켜져있다면 이 함수도 호출된다.
    //토글될 때 한번만 동작
}
void OnDisable(){
	//컴포넌트가 꺼졌을 때 호출된다.
    }

void OnDestroy(){
	//컴포넌트가 파괴될 때 호출된다.
    //Remove Component(메모리에서 삭제) 또는 오브젝트가 삭제될 때
    //코드에서 Destroy 함수 호출시 작동 (아래 Update 참고)
    
        Debug.Log("OnDestroy");
}

void Update(){
	//매 틱마다 연산을 수행하는 함수이다.
    
    if (Input.GetKeyDown(KeyCode.Space))
        {
            GameObject.Destroy(this.gameObject);
        }
}

void LateUpdate(){
	//Update보다 느리지만 늦은 업데이트가 하고 싶을 때 쓰는 함수.
    //Update된 오브젝트들에 대한 새 연산결과를 
}

void FixedUpdate(){
	//물리시간마다 한번씩 연산한다.
    //Edit > Project Setting > Time 설정에서 지정한 Fixed Timestep 간격으로 연산.
    //프레임드랍에도 관계없이 정해진 시간마다 작동.
}

초기화 위치의 차이

💡질문 :: 프레임(frame)이 뭔가요??
 30프레임 : 30 frame per second(fps)
   즉, 0.033333*30 = 0.9999.. 이므로 약 0.3초마다 한번씩 Update가 된다.
 60프레임 : 0.016666초마다 한번씩 Update 된다.
(+코멘트) 모바일의 경우 프레임이 너무 높으면 발열이 많이 발생하기 때문에 제한을 두는 경우가 많습니다.

 

 

 

(실습) Visible ↔ Invisible 함수 작성해보기

public class VisibleComponent : MonoBehaviour
{
	// Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            MeshRenderer renderer = GetComponent<MeshRenderer>();
            //GetComponent : 동료 컴포넌트중에 하나를 가져오기
            if (renderer != null) //장착된 컴포넌트가 있으면 컴포넌트가 반환되고 없으면 null이반환됨..
            {
                //(전통적인 조건문 방식의 enable disable)
                //if(renderer.enabled)
                //  renderer.enabled = false;
                //else
                //  renderer.enabled = true;

                //(위를 한문장으로 표현한 것.)
                renderer.enabled = !renderer.enabled;
            }
        }            
    }
}

 

🎓 이벤트 함수의 실행 순서
  Awake > OnEnable > Reset(not in Playmode) > Start > FixedUpdate > Update > LateUpdate ..

  참고 문서 : https://docs.unity3d.com/kr/2023.2/Manual/ExecutionOrder.html
Tip👍 유니티 한글 주석 인코딩 깨지는 경우 해결하기
다음 사이트 참고 : https://rito15.github.io/posts/unity-editorconfig-encoding/
💡질문 :: VS에서 함수 자동 작성이 되지 않아요..
⇒ 멘토님 코멘트 : VS community랑 유니티 바인딩이 안되어있을 가능성이 높아요
Edit > Preferences > External tools에서 External Script Editor가 Visual Studio로 되어있는지 확인!

 

+ 멘토님 코멘트 : 코드 수정시 핫리로딩은 compiler의 동작 방식과 관련이 있어요. 찾아보시는 것도 좋을 것 같아요.

 

 

디버그 방법

 

○ 방법 1. 디버그 로그를 활용한다.

      e.g. Debug.Log(renderer);

 

○ 방법 2.중단점을 활용한다. (강제로 브레이크를 거는 방법이라 위험할수도 있음)

🎓 중단점에 대한 단축키 모음.
- F9 :원하는 위치에 대고 F9를 누르면 중단점이 생김.
  play▷를 누르지 않은 상태에서 Unity에 연결(플레이 눌려있으면 유니티가 Reloading을 계속해서 메모리가 꼬임.)
  이후 유니티에서 play를 누르면 중단점까지만 실행되고 그때의 변수 값을 관찰할 수 있다.
- F10 : 다음 줄로 넘어가려면 F10을 누른다.
- F11 : F11를 누르면 내부까지 더욱 상세하게 들여다 볼 수 있다.
- F5 : 중단점을 빠져나온다.

 

 


 

 

콜라이더 만들기


 

  • 우선 캐릭터 Prefab을 꺼내어 Transform의 Position 좌표를 적절한 위치로 옮겨준다.
    (+ Main Camera 오브젝트를 MyCharacter 아래로 넣으면 캐릭터를 따라 카메라가 움직이게 만들 수 있다.)
  • 콜라이더와 리지드바디를 추가한다.

Capsule Collider

     다른 Collider와의 충돌을 일으키는 캡슐모양 콜라이더.

  • Center : 콜라이더 중심이 오브젝트의 어디에 위치하는지를 지정.
  • Radius : 충돌을 감지할 콜라이더의 두께
  • Height : 콜라이더의 길이

Rigidbody

     물리를 적용시켜주는 역할을 하는 컴포넌트

  • Mass : 물체의 질량. 높으면 무거워서 조금움직인다.
  • Drag : 중력에 대한 저항값. 중력에 의해 내려올 때 드래그 수치가 클수록 느리게 떨어짐.
  • Angular Drag : 각도에 대한 드래그.
  • Use Gravity : 중력 적용
  • is Kinematic : 물리현상 적용 유무
  • Constraints : 위치 변경이나 회전되지 않도록 제한함.
    • Freeze Position X, Y, Z : 위치가 변경되지 않도록 고정.
    • Freeze Rotation X, Y, Z : 회전이 되지 않도록 고정.

 

Mesh Collider

     충돌을 일으키는 메시 콜라이더를 바닥 오브젝트에 추가한다.

  • Convex : 충돌(collision)을 일으키는 convex mesh collider를 생성한다.

 

(추가 내용) Character Controller

 

  • Slope Limit : 캐릭터가 올라갈 수 있는 경사 제한(경사로 등)
  • Step Offset : 올라갈 수 있는 높이 제한(계단 등) 
  • Skin Width : 피부 두께
  • Min Move Distance : 얼만큼 이동해야 Move로 인식할 것인지
  • Center : 센터 위치 조정
  • Radius : 두께 조정
  • Height : 길이 조정

*리지드바디, 콜라이더 기능이 이미 있으므로 오늘은 어태치X

 

(실습) 캐릭터를 움직이는 스크립트 작성해보기

public class CharacterController_Me : MonoBehaviour
{
    // Update is called once per frame
    void Update()
    {
    	// Vector : 포지션, 방향을 담기 위해 사용됨
        Vector3 direction = Vector3.zero;

        if(Input.GetKey(KeyCode.W)){
            direction += transform.forward;
        }
        if(Input.GetKey(KeyCode.S)){
            direction += -transform.forward;
        }
        if(Input.GetKey(KeyCode.A)){
            direction += -transform.right;
        }
        if(Input.GetKey(KeyCode.D)){
            direction += transform.right;
        }

        GetComponent<Rigidbody>().velocity = direction;
    }
}
질문💡Input.GetKeyDown과 Input.GetKey의 차이가 뭔가요?
키가 눌리는 한 번만 동작하도록 하려면 GetKeyDown, 키를 입력하고 있는 동안 계속 동작하려면 GetKey를 사용한다.

 

 

Transform

  • forward : 오브젝트가 바라보는 앞쪽방향
  • -forward : 뒤쪽 방향
  • -right : 왼쪽
  • right : 오른쪽
  • up : 위쪽
  • -up : 아래쪽