[TIL] Unity - day 9

뭉크의 개발·2023년 7월 31일
0

Unity - Pre-Camp

목록 보기
5/9
post-thumbnail

🐧 들어가기 앞서

주말 푹 쉬었다.
다시 열심히 달리기!

고박사님의 유니티 강의를 들으며, 복습을 할 예정!


🐧 오늘 배운 것

  1. 제작할 게임 스토리 및 오브젝트 설정
  2. 게임 오브젝트 이동 방법
  3. 게임 오브젝트 물리와 충돌
  4. Instantiate( )
  5. 회전

🐧 기억할 것

transform.position

  • 새로운 위치 = 현재 위치 + (방향 * 속도)
// 오른쪽 방향으로 1의 속도만큼 이동.
transform.position = transform.position + new Vector3(1, 0, 0) * 1;

// 축약형, 같은 의미.
transform.position += Vector3.right * 1;

Vector3 구조체

  1. 2D/3D 공간에서 이동, 회전, 크기를 표현하기 위해 (x, y) or (x, y, z)의 좌표 체계를 나타내는 단위, Unity에서 제작한 Struct

  2. 방향, 각도, 두 점 사이의 거리 등 연산을 위한 다양한 메소드 제공.

Time.deltaTime

Update는 컴퓨터의 사양에 따라 호출되는 횟수가 달라진다.

즉 같은 Update 코드 중 이동거리에 대한 코드를 작성하면

좋은 컴퓨터는 더 멀리갈 수 있다.(FPS 높기 때문)

이를 방지하기 위해 Time.deltaTime을 설정하면,

이전 Update( ) 종료부터 다음 Update( ) 시작까지의 시간, 업데이트 사이의 시간.

즉, Time.deltaTime을 넣어 이동거리가 달라짐을 방지한다.

e.g.,
1. 성능 좋음 -> FPS 60에 Update( ) 120번 호출
2. 성능 낮음 -> FPS 60에 Update( ) 60번 호출

이동거리 표현 가능!

이동거리 표현

이동 거리 = 방향(Direction) X 속도(Speed) X Time.deltaTime

e.g.,
Update 함수가 한번 호출될 때, 5만큼 이동한다 가정,

  1. 이동 거리 = 5m X FPS 120 X 0.5 = 300m
    -> Time.deltaTime = 0.5

  2. 이동 거리 = 5m X FPS 60 X 1 = 300m
    -> Time.deltaTime = 1

Input

Input

Input은 키보드, 마우스, 터치, 자이로센서, 가속도센서 등

입력 메소드, 마우스 좌표와 같은 각종 프로퍼티 정보를 제공한다.

충돌 이벤트 함수

  • OnCollisionEnter2D( ) : 두 오브젝트가 충돌하는 순간 1회 호출
  • OnCollisionStay2D( ) : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
  • OnCollisionExit2D( ) : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출

매개변수 (Collision2D collision)

  • 현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보

[SerializeField]

Inspector View에서 변수의 옵션을 조절할 수 있게 해준다.

[SerializeField]
private Color color;
// Color의 변수의 옵션을 조절할 수 있다.

rivate SpriteRenderer spriteRenderer;

색상 표시 주의!

컬러에서 투명도 설정을 해주지 않으면, 색상이 투명하게 나온다!

Instantiate

original 게임 오브젝트(Prefab) 복제, 생성
(복제되는 오브젝트의 모든 컴포넌트 정보는 원본과 동일)

Instantiate(GameObject original);

e.g.,

private GameObject boxPrefabs;

private void Awake()
{
	Instantiate(boxPrefabs);
}

회전

오일러 (Euler)

3차원의 3개 각도를 표현하기 위해 사용하는 3X3 크기의 행렬.

회전 순서에 따라 결과가 달라지므로 회전 순서에 주의.(유니티에서는 따로 계산할 일 없음 -> 걱정X)

  • 장점
    0 ~ 360의 각도 표현 가능
  • 단점
    지속적으로 회전하는 연산 시, Quaternion보다 연산속도 느리고, 짐벌락 현상 발생할 수 있음.

짐벌락 : 세 개의 축이 서로 종속적인 관계를 가지고 있기 때문에 회전 연산 도중 축이 하나 사라져 3차원 오브젝트가 일그러지는 현상

쿼터니온 (Quaternion)

사원수(x, y, z, w) -> 3개의 벡터 요소 (x, y, z) + 1개의 스칼라 요소 (w, 0~1)

q = w + ix + jy + kz
-> q = (w,x,y,z)
-> q = (w,v) // (v = (x, y, z))

  • transform.rotation
    쿼터니온 회전 정보

  • transform.localScale
    오일러 회전 정보

    Inspector View에 보이는 Transform의 rotation 은 사용자 편의를 위해 오일러

Quaternion q = Quaternion.Euler(0, 0, 0); // 오일러 회전 정보를 입력해 쿼터니온 회전 값으로 변경

쿼터니온은 짐벌락 없나?

-> 쿼터니온은 임의의 축을 기준으로 회전을 표현할 수 있다. (오일러는 각 축에 대한 회전을 따짐)
따라서 축 의존성이 없기에, 짐벌락 현상이 발생하지 않는다.

e.g.,

transform.Roate(new vector3(1, 0, 0); // x축으로 계속 회전

clone

original 게임오브젝트를 복제해서 생성, 생성된 복제 오브젝트의 정보를 클론에 저장.
(아래 코드에서 clone과 방금 생성된 박스 오브젝트는 동일)
(지역변수이기 때문에, 함수 종료되는 시점에 데이터 삭제)

GameObject clone = Instantiate(GameObject original, Vector3 position, Quaternion rotation);

e.g.,

GameObject clone = Instantiate(boxPrefab, Vector3.zero, rotation);

        clone.name = "Box001"; // 이름 변경
        clone.GetComponent<SpriteRenderer>().color = Color.black; // 색상 변경
        clone.transform.position = new Vector3(2, 1, 0); // 위치 변경
        clone.transform.localScale = new Vector3(3, 2, 1); // 크기 변경

격자

for( int y = 0; y < 10; ++y)
        {
            // 내부 반복문 -> 격자의 x축 계산용
            for (int x = 0; x < 10; ++x)
            {
                Vector3 position = new Vector3(-4.5f + x, 4.5f - y, 0);

                Instantiate(boxPrefabs, position, Quaternion.identity);
            }
        }

for (int y = 0; y < 10; ++y)
        {
            for (int x = 0; x < 10; ++x)
            {
                if (x == y)
                {
                    continue;
                }

                Vector3 position = new Vector3(-4.5f + x, 4.5f - y, 0f);

                Instantiate(boxPrefabs, position, Quaternion.identity);
            }

        }


🐧 게임에 구현한다면?

Reference

0개의 댓글