유니티 Instantiate 크기 - yuniti Instantiate keugi

Transform.lossyScale

Transform.lossyScale은 게임오브젝트의 절대적인 크기를 나타냅니다.
Transform.lossyScale읽기전용(readonly)이기 때문에 게임오브젝트의 절대적인 크기를 설정할 수 없습니다. Transform.lossyScale은 게임오브젝트의 부모 자식 관계에서 자식이 회전했을 경우 크기가 왜곡되기 때문에 유니티에서는 절대적인 크기를 설정할 수 없게 한 것 같습니다.

다음은 Transform.lossyScale의 예제 코드입니다.

Debug.Log(transform.lossyScale);

Transform.lossyScale으로는 절대적인 크기를 설정할 수 없지만 절대적인 크기를 설정하는 다른 방법이 있습니다.

부모를 null로 설정하고 localScale을 설정한 후 다시 원래 부모를 설정해주면 절대적인 크기를 설정하는 것과 동일하게 됩니다.

다음은 절대적인 크기를 설정하는 예제 코드입니다.

public class ScaleExample : MonoBehaviour
{
    void Start()
    {
        Transform parent = transform.parent;

        transform.parent = null;
        transform.localScale = new Vector3(1f, 2f, 3f);
        transform.parent = parent;
    }
}

Transform.localScale

Transform.localScale은 게임오브젝트의 상대적인 크기를 나타냅니다.
게임오브젝트의 부모가 있을 경우 부모를 기준으로 상대적인 크기를 나타냅니다. 부모의 크기가 변경되면 자식의 크기도 변경됩니다. Transform.localScaleVector3를 대입하면 크기가 변경됩니다.

부모가 없을 경우에는 Transform.lossyScale과 동일합니다. 만약 부모의 localScale(2, 2, 2) 이고 자식의 localScale(1, 1, 1) 이라면 자식의 절대적인 크기는 (2, 2, 2)가 됩니다.

다음은 Transform.localScale의 예제 코드입니다.

transform.localScale = new Vector3(2f, 2f, 2f);

참고

  • https://docs.unity3d.com/kr/530/ScriptReference/Transform-lossyScale.html
  • https://docs.unity3d.com/kr/530/ScriptReference/Transform-localScale.html

 Instantiate를 그냥 사용하면 Hierarchy에 바로 생성이 되는데, 종종 Canvas 안에 생성해야 할 때가 있다. 나는 특히 움직이는 프리팹을 사용할 때 Canvas 안에 생성한다.

유니티 Instantiate 크기 - yuniti Instantiate keugi
 

 prefab은 생성하고자 하는 오브젝트이고, createPoint는 오브젝트가 생성되는 위치다. public으로 선언 후 오브젝트와 값을 넣어준다.

유니티 Instantiate 크기 - yuniti Instantiate keugi
 

 Canvas 안에 생성하지 않을 때는 identity까지만 쓰고 괄호를 닫는다. 그런데 Canvas 안에 생성해야 하는 경우 뒤에 인자를 하나 더 넣어준다.

 다른 방법도 있겠지만 개인적으로 이 방법이 가장 편한 것 같다. 

*개인 공부용으로 작성된 글입니다.*

Unity3d를 하다보면 프리팹을 만들어 놓고, 실시간으로 불러서 사용해야 할 때가 있습니다.

그럴때 사용하는 것이 인스턴스화(Instantiate) 입니다.

Asstes 경로에 Resources 폴더를 생성하고 난 후에 하위 경로에 프리팹을 생성하기만 하면 준비가 끝납니다.

그러면 간단한 방법으로 호출을 할 수 있습니다.

public class prefabcopy : MonoBehaviour
{

  GameObject prefab_obj;

    void Start()

    {

       prefab_obj = Resources.Load("Prefabs/prefab_sample") as GameObject;

    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {

          GameObject obj = MonoBehaviour.Instantiate(prefab_obj);

          obj.name = "clone";

          Vector3 pos = new Vector3(0, 0, 0);
          obj.transform.position = pos;
        }
    }
}

유니티 Instantiate 크기 - yuniti Instantiate keugi

위의 이미지와 같이 Assets/Resources/Prefabs 폴더에 prefab_sample이라는 이름의 프리팹을 생성하고 난 후에

Resources.Load("Prefabs/prefab_sample") as GameObject; 

이 부분으로 지정된 프리팹을 GameObject 형태로 로드를 시켜줍니다.

GameObject obj = MonoBehaviour.Instantiate(prefab_obj);

obj.name = "clone";

Vector3 pos = new Vector3(0, 0, 0);

obj.transform.position = pos; 

여기서 미리 로드된 프리팹을 객채화 시켜주는 것입니다.

clone 이라는 이름과 함께 position은 0 으로 세팅 했습니다.

기호에 따라 이름과 위치, 크기, 각도 등을 name, position, scale, rotation 등을 통해 다양하게 변경 할 수 있습니다.

유니티 Instantiate 크기 - yuniti Instantiate keugi