Unity C# > 컴포넌트 : Transform 와 프로퍼티/함수 모음

Date:     Updated:

카테고리:

태그:

공부하면서 알게된 것만 정리합니다.😀

👩‍🦰 Transform

오브젝트의 위치, 회전, 크기를 나타내는 컴포넌트다.

  • 오브젝트를 생성하면 기본으로 붙어있는 디폴트 컴포넌트다.
    • Transform myTransform하고 변수 선언을 해준 후 myTransform.Rotate() 이런식으로 쓰는 일반적인 방법도 있긴 하지만 Transform 컴포넌트는 모든 오브젝트들이 디폴트로 갖고 있는 컴포넌트기 때문에 그냥 변수 선언 없이 transform 소문자 transform으로 바로 사용하는게 가능하다. transform.Rotate() 이런 식으로.

      • 함수 SetParent(부모 Transform) 로 부모 오브젝트를 지정해줄 수 있다.
        effect.transform.SetParent(parent);
        
  • image

  • 만약 오브젝트가 회전해 있는 상태여서 위치 축이 월드 좌표 축과 일치하지 않는다면 오브젝트의 위쪽 방향과 절대 적인 위쪽 방향은 다르다.

Transform 타입의 오브젝트를 대상으로 하면 그 오브젝트의 자식들을 순회할 수 있다.

foreach(Transform tf_Child in transform)
{
      Material [] newMaterials = new Material[tf_Child.GetComponent<Renderer>().materials.Length];

      for (int i = 0; i < newMaterials.Length; i++)
      {
          newMaterials[i] = mat;
      }

      tf_Child.GetComponent<Renderer>().materials = newMaterials;
}

이 스크립트가 붙은 오브젝트를 Transform 타입으로 참조(transform)한 후 이를 순회하면 Transform 타입으로 자식 오브젝트들에게 접근할 수 있다.

이렇게 transform을 foreach 문에서 순회할 수 있는 이유는, 그리고 자식 오브젝트들을 순회할 수 있는 이유는 Transform 컴포넌트가 enumerator를 지원하기 때문이다. foreach문을 객체에 대해서 순회하려면 그 객체는 GetEnumerator() 함수를 지원해야 한다. 자세한 이유는 링크 참고

🚀 변수/프로퍼티

✈ position, rotation, scale

  • 오브젝트의 position, rotation, scale 는 월드 좌표계 위치, 회전, 크기를 담당한다.
    • transform.position = Vector3(...) 이런 식은 현재 위치와 상관 없이 오브젝트의 월드 좌표계 위치를 바꿔버리는 셈이 된다.


✈ localPosition, localRotation, localScale

  • localPosition, localRotation, localScale은 Local좌표계에서의 위치. 부모로부터 떨어진 거리. 부모를 기준으로 한 회전 값. 부모를 기준으로 한 싱대적 크기.


✈ forward, right, left, backward

  • transform.forward : 월드 기준에서 오브젝트 입장에서의 앞 쪽 (월드 기준 z 축) 을 향하는 방향 벡터 (길이가 1인)
    • 오브젝트의 로컬 z 축 기준에서의 양의 방향 벡터
  • transform.right : 월드 기준에서 오브젝트의 입장에서의 오른 쪽 (월드 기준 x 축) 을 향하는 방향 벡터 (길이가 1인)


✈ parent

  • 부모 자식 관계 또한 Transform이 관리한다.
    • transform.parent : 내 부모 오브젝트를 뜻한다.


✈ eulerAngles

  • eulerAngles
    transform.eulerAngles = new Vector3(0.0f, _yAngle, 0.0f);  // Y 축으로 _yAngle 각도 만큼 회전한다.
    
    • 오일러 각도의 회전 값을 나타내며 Vector3 를 사용해 회전 값을 설정할 수 있다.
    • 📢 주의 사항
      • 밑에 코드와 같이 절대적인 회전 Vector3 값으로 설정하는 것이 아닌, 이만큼 더 회전해라! 하는 델타 값 의미로 eulerAngles에 Vector3를 더하고 빼주는건 안된다.
      • 오일러 각도는 360도를 넘어가면 값의 계산에 실패하기 때문에 eulerAngles를 얼만큼 더 회전할지의 델타 회전값으로 사용하는 것은 권장하지 않는다.
        transform.eulerAngles += new Vector3(0.0f, _yAngle, 0.0f);  // '+=' ❌❌❌
        


🚀 함수

✈ Translate

public void Translate(Vector3 translation, Space relativeTo = Space.Self);

  • 매개변수로 들어온 현재 위치로부터 해당 벡터만큼 평행이동 시킨다. 상대적인 이동
  • 상대적인 벡터의 방향으로 평행 이동 한다.
    • 예를 들어 인수로 들어온 Vector3의 방향이 Vector3.forward 라면 절대적인 월드 좌표계 기준에서의 forward 방향이 아니라 자신을 기준으로 한 forward 방향힘을 나타낸다.
  • 기본적으로 Local 좌표계를 기준으로 평행이동한다. (Space.Self가 디폴트)
  • Translate(Vector3), Space.World)
    • Translate 함수 매개변수로 Space.World를 넘기면 Global 좌표계를 기준으로 평행이동한다.
    • 매개변수 디폴트 값은 Space.self (Local)
      • Translate, Rotate함수는 Local인 반면 그냥 바로 변수로 접근하는 position, rotation같은 것들은 Global좌표계 기준이다.
        • 다만 부모가 있는 자식 오브젝트라면 Local


✈ Rotate

public void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);

  • 현재 회전에서 매개변수로 들어온 상대적인 Vector3만큼 x, y, z 방향으로 각각 a, b, c도 만큼 회전을 시킨다.
  • Translate과 마찬가지로 Space.Self가 디폴트라 로컬 좌표계를 기준으로 회전한다.


✈ RotateAround

public void RotateAround(Vector3 point, Vector3 axis, float angle);

이 함수는 공전과 잘 어울린다. point지점을 지나는 axis축을 기준으로 angle만큼 회전한다.

void Update()
{
    earth.RotateAround(sun.position, Vector3.up, 90f * Time.deltaTime);
}

예를 들어 지구가 태양을 공전하게 하고 싶다면 위와 같이 짤 수 있을 것 같다. 지구는 태양의 Y 축을 기준으로 1초에 90도씩 회전한다.

fakeCube.RotateAround(transform.position, rotDir, spinSpeed); //공전

fakeCube라는 오브젝트가 내 위치에서의 rotDit을 기준으로 1 프레임 당 spinSpeed 각도만큼 회전.


✈ SetParent

public void SetParent(Transform parent, bool worldPositionStays);

  • 함수 SetParent(부모 Transform) 로 부모 오브젝트를 지정해줄 수 있다.
    effect.transform.SetParent(parent);
    


✈ TransformDirection

public Vector3 TransformDirection(Vector3 direction);

Vector3 pos = transform.TransformDirection(Vector3.forward); // 내 로컬 좌표로서의 (0, 0, 1) 로컬 좌표 위치를 월드 좌표계 기준으로 변환하여 리턴해준다.
  • 인수로 받은 좌표 Vector3 를 로컬 좌표계 기준에서 월드 좌표계 기준으로 방향만 변환하여 이를 리턴해준다.(벡터 길이는 변하지 않음)
  • transform.TransformDirection(Vector3.forward)transform.forward 는 같다.


✈ GetChild

public Transform GetChild(int index);

Transform tf_child = trnasform.GetChild(1); // 두 번째 자식 리턴받기

직속 자식들 중 index에 해당하는 index + 1 번 째 오브젝트의 Transform 을 리턴 함.


✈ InverseTransformDirection

public Vector3 InverseTransformDirection(Vector3 direction);

  • 인수로 받은 좌표 Vector3 를 월드 좌표계 기준에서 로컬 좌표계 기준으로 방향만 변환하여 이를 리턴해준다.(벡터 길이는 변하지 않음)


✈ LookAt

public void LookAt(Transform target, Vector3 worldUp = Vector3.up);

transform.LookAt(_player.transform);

인수로 들어온 해당 Vector3 위치값을 바라보게끔 회전시킨다. Quaternion.LookRotation 함수는 회전시키는 것이 아닌, 해당 방향을 바라보게끔 회전하려면 얼만큼 회전해야하는지 그 회전값을 리턴해주는 함수고 TransformLookAt직접 인수로 들어온 그 '위치'를 바라보게끔 회전시킨다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

UnityDocs 카테고리 내 다른 글 보러가기

댓글 남기기