Unity transform: object hierachy in unity engine
Unity์ ๊ณ์ธต ๊ตฌ์กฐ ํ์๊ณผ Transform ์ฌ์ฉ ์ด์
โ ๊ฒฐ๋ก
Unity์์ ์์ ์ค๋ธ์ ํธ๋ฅผ ํ์ํ ๋๋
GameObject
๊ฐ ์๋ Transform
์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ ์ด์ ๋ Unity์ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ Transform์ ๊ธฐ์ค์ผ๋ก ๊ตฌ์ฑ๋๊ณ ,
Transform
์ Unity C++ ์์ง์ ํต์ฌ ๊ณ์ธต ์ ๋ณด์ ์ฐ๊ฒฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ๊ทผ๊ฑฐ 1: Unity ๊ณ์ธต ๊ตฌ์กฐ๋ Transform์ด ๋ด๋นํ๋ค
Unity์ ์ค๋ธ์ ํธ๋ค์ ๋ถ๋ชจ-์์ ๊ตฌ์กฐ๋ก ์ฐ๊ฒฐ๋ ํธ๋ฆฌ(Tree)๋ฅผ ์ด๋ฃฌ๋ค.
์ด ๊ตฌ์กฐ๋ GameObject
๊ฐ ์๋ Transform
์ปดํฌ๋ํธ์ ์ํด ํ์ฑ๋๋ค.
- ๋ชจ๋
GameObject
๋ ๋ฐ๋์ ํ๋์Transform
์ ํฌํจํ๋ค. - ์์ ์ค๋ธ์ ํธ๋ค์
Transform
์ ์์ ๋ชฉ๋ก์ ๋ค์ด๊ฐ๋ค. - ์์น, ํ์ , ์ค์ผ์ผ ์ธ์๋ ๊ณ์ธต ๊ตฌ์กฐ๊น์ง ๊ด๋ฆฌํ๋ค.
๋ฐ๋ผ์ ๊ณ์ธต ํ์์ Transform์ ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
๐ ๊ทผ๊ฑฐ 2: Transform์ ๊ณ์ธต ํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค
Transform
์ ์์ ์ค๋ธ์ ํธ๋ฅผ ํ์ํ๊ธฐ ์ํ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
transform.GetChild(i)
๋ก i๋ฒ์งธ ์์ ์ ๊ทผtransform.childCount
๋ก ์์ ์ ํ์ธGetComponentsInChildren<T>()
๋ก ์ฌ๊ท ํ์ ๊ฐ๋ฅ
์ด ๊ธฐ๋ฅ๋ค์ GameObject
์์ฒด๊ฐ ์๋
Transform
์๋ง ์กด์ฌํ๋ค.
๐ ๊ทผ๊ฑฐ 3: Transform์ ๋จ์ ์์น ์ ๋ณด๊ฐ ์๋ ๊ณ์ธต ๊ตฌ์กฐ์ ํต์ฌ์ด๋ค
๋ง์ ๊ฐ๋ฐ์๋ค์ Transform
์ด ๋จ์ํ
์์น, ํ์ , ํฌ๊ธฐ ์ ๋ณด๋ฅผ ๋ด๋๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ Unity ์์ง์์ ๊ณ์ธต ๊ด๊ณ๋ฅผ ์ ์ํ๋ ํต์ฌ ์ปดํฌ๋ํธ์ด๋ค.
- ๋ถ๋ชจ ์ค๋ธ์ ํธ์ ์์น๊ฐ ๋ฐ๋๋ฉด
์์ ์ค๋ธ์ ํธ๋ ํจ๊ป ์ํฅ์ ๋ฐ๋๋ค. - ์ด๋ ์ค๋ธ์ ํธ๋ค์ด
Transform
ํธ๋ฆฌ ๊ตฌ์กฐ๋ก
๊ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๐ก ์์: FindChild ๋ฉ์๋์์์ Transform ํ์ฉ
๋ค์์ ์์ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ๋ ์์ ์ฝ๋์ด๋ค:
Transform transform = FindChild<Transform>(go, name, recursive);
if (transform == null)
return null;
return transform.gameObject;
Transform
์ผ๋ก ์์ ํ์์ ์ํํ ํ
ํด๋น ์ค๋ธ์ ํธ์gameObject
๋ฅผ ๋ฐํํ๋ค.- ์ฌ๊ท ์ฌ๋ถ๋ ์ด๋ฆ ์กฐ๊ฑด ๋ฑ ๋ค์ํ ๊ฒฝ์ฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
๐ง Unity๋ ์ C++ ๊ธฐ๋ฐ์ธ๊ฐ?
โ ๊ฒฐ๋ก
Unity๋ ์ฐ๋ฆฌ๊ฐ C#์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ง๋ง,
์์ง ์์ฒด๋ ๊ณ ์ฑ๋ฅ C++๋ก ๊ตฌํ๋์ด ์๋ค.
๋ฐ๋ผ์ GameObject.transform
๋ ๋ด๋ถ์ ์ผ๋ก๋
C++ ์ฝ๋์ ์ํธ์์ฉํ๋ ๊ตฌ์กฐ๋ค.
๐ง Unity ๊ตฌ์กฐ ์์ฝ
Unity๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค:
- C++ Native Engine Layer
- ๋ ๋๋ง, ๋ฌผ๋ฆฌ, ์ค๋์ค ๋ฑ ์ฑ๋ฅ์ด ์ค์ํ ์์คํ ์ด ๊ตฌํ๋จ
Transform
,Rigidbody
,Mesh
๋ฑ์ด ์ฌ๊ธฐ์์ ๋์ํจ
- C# Scripting Layer
- ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋ (์:
Start()
,Update()
๋ฑ) - ์์ง์ ๊ธฐ๋ฅ์ โ์ ์ดโํ๊ณ โ๋ช ๋ นโ์ ๋ด๋ฆฌ๋ ์ญํ
- ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋ (์:
- Interop ๋ฐ์ธ๋ฉ Layer (C# โ C++)
InternalCall
,Injected
,IL2CPP
๋ฑ์ ๊ธฐ์ ๋ก
C#์์ C++ ํจ์ ํธ์ถ์ ๊ฐ๋ฅํ๊ฒ ํจ
๐ ์์: GameObject.transform ๋ด๋ถ ๊ตฌํ
Unity C# ๋ด๋ถ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์๋ค:
public Transform transform
{
[FreeFunction("GameObjectBindings::GetTransform", HasExplicitThis = true)]
get
{
IntPtr intPtr = MarshalledUnityObject.MarshalNotNull(this);
if (intPtr == (IntPtr)0)
{
ThrowHelper.ThrowNullReferenceException(this);
}
return Unmarshal.UnmarshalUnityObject<Transform>(get_transform_Injected(intPtr));
}
}
GameObject.transform
์ ๋จ์ ํ๋กํผํฐ๊ฐ ์๋๋ค.- ๋ด๋ถ์ ์ผ๋ก C++ ์์ง ํจ์
GetTransform
์ ํธ์ถํ๋ค. MarshalledUnityObject
,Unmarshal
,Injected
๋
C++ โ C# ๊ฐ ํฌ์ธํฐ๋ฅผ ์์ ํ๊ฒ ์ ๋ฌํ๊ณ ๋ณํํ๋ ์ฅ์น๋ค.
๐ ์ต์ข ์์ฝ
Unity์์ ์ค๋ธ์ ํธ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋
Transform
์ ํตํด ๊ตฌํ๋๋ค.
์์ ํ์ ๋ฑ ๋ชจ๋ ๊ณ์ธต ๊ด๋ จ ์์ ์Transform
์ ์ฌ์ฉํด์ผ ํ๋ฉฐ,
๊ทธ ์ด์ ๋Transform
์ด Unity C++ ์์ง์ ๊ณ์ธต ๊ตฌ์กฐ ์ค์ฌ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋น๋ก ์ฐ๋ฆฌ๋ C#์ผ๋ก ์ฝ๋ฉํ์ง๋ง,
๋ด๋ถ์ ์ผ๋ก๋ C++ ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์์ง๊ณผ ์ํธ์์ฉํ๊ณ ์๋ ๊ฒ์ด๋ค.