์ง๋ฌธ๊ธ : https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=98548
1. GetComponent ๋ง์ด์จ๋ ์๊ด์์?
-> ๋ ์ธ์๋ก ์ข๊ธดํ๊ฒ ๋ค๋ง ํ์ํ ๋ ์ ์ฐ๋ผ๊ณ ์๋๊ฑฐ๋ ๋ถ๋ด์ ์๊ฐ์ ธ๋๋ ๋ฏ
์ผ๋จ ๋ง๋ค๊ณ / ๋ฌธ์ ๋๋ฉด ์ต์ ํ๋ฅผ ๊ณ ๋ฏผ
๋ง์ฐํ๊ฒ GetComponent ๋ง์ดํด์ ์.. ์ต์ ํ๊ฑฑ์ ๋๋๋ฐ~ ๋ก ์๊ฐํ์ง๋ง๊ณ
๋ชฉํ ํ๋ ์ ์๋์ค๋๋ฐ(ํน์ ์ฃผ๊ธฐ์ ์ธ ์ฒดํฌ๋ก) ํ๋กํ์ผ๋ง ๋๋ฆผ
-> update์์ ์ฆ์ GetComponent๋ก ์ธํด ๋น์ฉ์ด ๋ง์ด๋ฐ์ํ๋๊ฑธ ํ์ธ
-> ๊ฐ์
์ ๊ณผ์ ์ผ๋ก ์๊ฐํ๋๊ฒ ์ข์๊ฑฐ๊ฐ์. ๋๋ฌด ์ด๋ฅธ ์ต์ ํ๋ ๋ ์.
2. ์ค์๊ฐ ์ฒด๋ ฅ๊ด๋ฆฌ ๋ค๋ฅธ๋ฐฉ๋ฒ?
-> ๋ฐฉ๋ฒ์ด์ผ ๋ง์๋ฐ ๊ฒ์ ์ ์ฒด ๊ตฌ์กฐ๋ ์๊ตฌ์ฌํญ๋ฑ์ ๋ค ์ ์ ์์ผ๋
์ฃ๋ถ๋ฆฌ ์ด๋ ๊ฒ ์ ๋ ๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟ๋ผ ์๊ธฐํ๊ธด ์ข ๊ธ๊ณ ..
์ด์๋ํ ๋ต๋ณ์ ์ง๋ฌธ๊ธ์ ๋ค๋ฅธ์ฌ๋๋ค์ด ๋ฌ์๋ ผ ๋๊ธ์ด๋ ๋ค๋ฅธ ๊ฒ ์ฝ๋๋ค ์ฐธ๊ณ ํด๋ณด๋ฉด๋ ๋ฏ
------------------------
3. ์๋๋ง๊ณ ์ฝ๋ํ์
๊ธ๋ด์ฉ์ผ๋ก ๋ฏธ๋ค๋ด์ OnTriggerStay์์ ์ด๊ฑธ ๋๋ฆฌ๊ณ ์๋๊ฒ์ผ๋ก ๋ณด์
๋์ถฉ ๋น์ทํ๊ฒ ๋ง๋ค์์.
myMonster๋ ์ด๋์ ๋ญํ๋์ค์ง ์์์์ด์ ๋์ถฉ ์๋ฌด๋ ๊ฒ๋ ๋บ์
1. ๋ผ์ด๋ ๋ง ๋ฃ๊ธฐ
invert if ํด์ฃผ๋ผ๊ณ ํ์๋ ๊ณ ์ณ์ฃผ์
2. ํ์์๋๊ฑฐ ์ง์์ฃผ๊ณ
!= false : == true ์ด์ฐจํผ ๋๊ฐ์
3. ์ค๋ณต๋๋๊ฑฐ ํฉ์ณ์ฃผ์
collision.gameObject.GetComponent<MyMonster>๋ฅผ ์ ๋งค๋ฒ ๊ณ์์๋กํ๋๊ฑฐ์ผ
๊ฑ ๋ณด๊ธฐ์ข๊ฒ ์ค์ฌ
4. GetComponent๋์ ์ TryGetComponent๋ฅผ ์ฌ์ฉ
GetComponent๋ ํ ๋น์ ์ฑ๊ณต ์คํจ์ฌ๋ถ์ ์๊ด์์ด GC Allocation์ด ๋ฐ์ํจ
(์ ๋ํฐ ๋ฒ์ ผ ์ฌ๋ผ๊ฐ๋ฉด์ GetComponent ๊ฐ์ ํ ์๋ํฐ์์ ํ ๋น / ๋ฐํ์์ ๋นํ ๋น
ํ๋ฃจ์ ๋ ์๊ฐํด๋ดฃ๋๋ฐ.. ๋๋ค GC ๋ฌธ์ ๋ ์๊ณ ๋ฐํ์์ GetComponent๊ฐ ๋๋น ๋ฅด๋
TryGet์ ๊ผญ ๊ณ ์งํ ํ์๋ ์์ด๋ณด์.
์์งํ ๋์ด ์ฐจ์ด ๋๋ค๊ณ ํด๋ด์ผ ๊ทธ๊ฒ ํผํฌ๋จผ์ค์ ์ผ๋ก ์ผ๋ง๋ ์ํฅ์ค๋งํผ ํฐ ๋ฌธ์ ๊ฒ ์ด
๊ทธ๋ฅ ๊ฒฝ์ฐ์๋ฐ๋ผ ์ด๋ฐ๋ TryGetํ๊ณ / ์ปดํฌ๋ํธ null์ฒดํฌ ์ํด๋๋๋ ํ์คํ์ํฉ์์
๊ฑ GetComponent์จ๋ ์๋ฌด ๋ฌธ์ ์๋ค๊ณ ์๊ฐ
- https://docs.unity3d.com/Manual/performance-garbage-collector.html
- https://tistory.jeon.sh/11
- https://forum.unity.com/threads/does-getcomponent-t-no-longer-allocates-garbage.978090/#post-6354051
5. CompareTag ์ฒดํฌ ์ดํ์ GetComponent์ ๋ ผ๋ฆฌ์ ๋ถํ์์ฑ
๋ ผ๋ฆฌ์ ์ผ๋ก ์๊ฐํด๋ณด์ CompareTag ๋ชฉ์ ์ ํด๋น ์ฝ๋ผ์ด๋์ GameObject๊ฐ
MyMonster๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ์๋ "MyMonster"๋ผ๋ ํ๊ทธ๋ฅผ ๋ฌ๊ณ ์๋ GameObject์ธ๊ฐ?
๋ฅผ ํ์ธํ๊ธฐ ์ํจ์
ํ๊ทธ ํ์ธ์ด ํ์ํ ๊น? ๊ฑ TryGetComponent๋ก ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๋ค
q) MyMonsterํ๊ทธ๊ฐ ๋ฌ๋ ค์์ง ์์ ๋ค๋ฅธ ๋ฌด์ธ๊ฐ๊ฐ MyMonster Component๋ฅผ ๋ฌ๊ณ ์์์๋ ์์์์!!
a) ๊ทธ๋ ๊ฒ ๋ง๋ค์์๋ฆฐ ์๊ฒ ์ง ใ ใ ๋ง์ด๋?
6. component.TryGetComponent
gameObject๋ก ํ๋จ๊ณ ๋ ๊ฑฐ์น๋๊ฑฐ ์์ด๋ ๋ ๋ฏ?
7. healList ์ถ๊ฐ ๊ธฐ๋ฅ์ OnTriggerStay๊ฐ ์๋๋ผ MyMonster ๊ฐ ์ํํ๋๋ก
ํ๋ฉด์ healList๋ private์ผ๋ก ๋ณ๊ฒฝ
์ธ๋ถ์์ ๋ด๋ถ์ healList๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ฅ๋จ์๋ฅผ ํธ์ถํ๋๋ก
public void Heal()
{
foreach( m in healList)
// heal
}
ํจ์๋ฅผ ํด๋์ค์์ ๋ง๋ค์ด์ฃผ๋ฉด ๋ ๋ฏ
์ง ์ด๋ ๊ฒ ๋ณด๊ธฐ์ข๊ฒ ๋ง๋ค ์ ์๋ค.
list์ ์ง์ด๋ฃ๋ ์ ์ฅ์์ ์ด๋ ํ ์กฐ๊ฑด์ด๋ ์ถ๊ฐ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅธ๊ณณ์์ ์ ๊ฒฝ์ฐ์ง ์์๋๋
TryAdd ํ๋๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ ์ผ ๋ ์ด๊ฑฐ "๋ฃ์๊ฒ" ํ๋ฉด
๋ฐํ๋ ๋ฆฌ์คํธ ์ ์ฅ์์ ๋ฐํ์ง ๋ง์ง ์์์ ํด์ฃผ๊ฒ ์ง ํ๊ณ ๋๋ ค๋ฃ๋ ๋ชฉ์ ์๋ง ์ง์คํ๋ฉด ๋ณด๊ธฐ์ข์์?
------------------------------------------------------------------
Before
After
๋ ์ ์ฝํ๊ณ ๊ฐ๋จํด์ก์ง?
ํ๋์ ๋ด๋ ์ปดํฌ๋ํธ ์๋์ง ํ์ธํด์ ์์ผ๋ฉด ํ๋ฆฌ์คํธ์ ์ถ๊ฐํด๋ผ~ ํ๊ณ ๋ชฉ์ ๋ ํ์ธํ๊ธฐ ์ฌ์์ง
q) ๊ทธ๋์ ์ด๊ฑฐํ๋ฉด ๊ฒ ๋นจ๋ผ์ง?
๋ญ ๊ผด๋์ด๊ฑฐ๋ก ์ ์๋ฏธํ ์ฐจ์ด๊ฐ ์๊ฒ ์?
๊ถ๊ธํ๋ฉด ํ๋กํ์ผ๋งํด๋ณด์
๊ฒ๋ณด๋ค ์ฃผ์์์ผ๋ฉด 1๋ ๋ค์ ์ฃผ๋ฅด๋ฅด๋ฅต ๋ฌ๋ฆฐ ๊ธด ์ฝ๋ ๋ณด๋ฉด์ ์คํธ๋ ์ค ๋ฐ์๊บผ
ํ๋์ ์์ฝํ๊ณ ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ๋ช ํํ๊ฒ ์ค์ฟ๋ค๋๋ฐ ์์๋ฅผ ๊ฐ์ง๋
์๋ ๋ง๊ณ
์ด๊ธ์ ํํด๋ค์ด์ค๋ฉด ๋ด๊ฐํ๋ฆฐ๊ฑฐ๊ณ ์ชฝํ๋ฆฌ๋ ์ญ์ ๋ ์๋ ์๋ค
์ ์ค์ํ๊ฑฐ ํ๋ ๋นผ๋จน์๋ค ๋ค์ ์์ ํ๊ณ ์๊ฒ ์..
์ฝ๋ ๋ค์ ์ธ๊ธฐ ๊ท์ฐฎ๋ค... OnTriggerStay / Enter / Exit๋ก ํ๊ฒ ๊ฒ์ฌํ๋๊ฑฐ Physics.OverlapSphere ๊ฐ์๊ฑฐ๋ก ํ์ . MyMonster ๋ด๋ถ์์ Heal ํ ๋ Range๋ด์ ๋ชฌ์คํฐ ์ฐพ๋ ํจ์ ํ๋ ๋ง๋ค๊ณ Physics.OverlapSphere ๋ก Collider ํ๋ฒ ์น ํ๊ณ ๊ฑฐ๊ธฐ์ TryGetComponent๋ก other monster ์ฐธ์กฐํ๋ฉด๋.
์ OverlapSphere ์จ? ํธ๋ฆฌ๊ฑฐ๋ณด๋ค ์ฑ๋ฅ์ด ์ข์?
OnTrigger xxx๋ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๋ก ์ํ์ง ์์๋๋ ๊ณ์ ๋ถ๋ ค์ ์ฒ๋ฆฌํด์ฃผ์์. ์ ์ง๋ฌธ๊ธ ์ฉ๋๋ฉด ํ์ฐ๋ ์๊ฐ Range๋ด์ ์ ๋์ ์ฐพ๋๊ฑฐ๋ก ๋ฑ 1๋ฒ ๋ถ๋ฅด๋ฉด๋๋๊ฑฐ์์. ๋น๋ฒํ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ถ๋ฆดํ์์๋๊ธฐ๋ฅ์ด๋๊น ํ๋ฒ๋ง ํธ์ถํ๋๊ฒ์ข์ง
ํ์๋ฆฌ๋. Collider array buffer ๋งใด๋ค๊ณ OverlapSphereNonAlloc ์ฐ๋ฉด NonAlloc๋ฐฉ์์ผ๋ก ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์. OverlapSphere ๊ฐ์์ ๋ค์ ์ฌ๋ฌ๊ฐ์ colliders array ์ ์ค๋ธ์ ํธ๋ค์ managed heap์ ํ ๋นํ๊ธฐ๋๋ฌธ์ GC ๊ฐ ํผํฌ๋จผ์ค ์ํฅ์ฃผ๊ฒํ๋ ํน์ point๋ก ๋ถํฐ ์ฃผ๋ณ์ collider ํ์ํ ๋ NonAlloc๋ฐฉ์์ OverlapSphereNonAlloc๋ฑ์ ํ์ฉํ์ญ์ผ
์ฉ๋ค!!!
๋ ๋ด ์ ์๋์ด ๋๋ผ
1. ๋ผ์ด๋ ๋ง ๋ฃ๊ธฐ invert if ํด์ฃผ๋ผ๊ณ ํ์๋ ๊ณ ์ณ์ฃผ์ -> ์ด๊ฑฐ ํ๋๋ง๋ ์ด์ ๋ธ๋จ๊ณ์์ ๊ฐ์๊ฑฐ ์๋๋? ๋ด์๊ฐ์ผ๋ก ๊ทธ๋ฐ๊ฑฐ๊ฐ์์ ๋ฌผ์ด๋ด.๋ ๊ฐ๋ ์ฑ์ด ์์ข์์ ์ ๊ฑฐ ๋ฌด์ํ๋๋ฐ
๋ invert if ๊ฐ ๊ฐ๋ ์ฑ ๋ ์ข๋ค๊ณ ๋๋. n์ค if๋ฌธ ๋ค์ด๊ฐ๋๊ฒ ๋ ๋ณด๊ธฐ ํ๋ค์ด์
๋ค์ค if๋ ์ฝ๊ธฐ๊ฐ ๋นก์
์ ์ฝ๋๋ ์ฝ๋๋ฆฌ๋ทฐ 'ํด์ค'์ธ์ ๊ตฝ์ ๊ตฝ์
OnTriggerStay๋ง๊ณ RayCast๋ก ์๋ฉด ๋ ๋ถํ๊ฐ ํฌ๋ ค๋
์ ์ฑ๊ธ ๋ฏธ์ณค๋๊ณ
GetComponent๋ ํ ๋น์ ์ฑ๊ณต ์คํจ์ฌ๋ถ์ ์๊ด์์ด GC Allocation์ด ๋ฐ์ํจ <- ์ด๊ฑฐ ในใ ์? null์ด ๋ฐํ๋๋๋ฐ๋?
์ด๊ฑฐ ๊ฒ์ํด๋ดค๋๋ฐ ์๋๋. It never allocated garbage at runtime. What happened was that in the editor only
๋ค์ ์ฐพ์๋ดฃ๋๋ฐ ์ ๋ํฐ ๋ฒ์ ผ ๋ฐ๋๋ฉด์ GetComponent ์ฑ๋ฅ๊ฐ์ ์ด ์์๊ณ ์๋ํฐ์์ ํ ๋น / ๋ฐํ์์ ๋นํ ๋น์ผ๋ก ๋ฐ๋๊ฑฐ๊ฐ์. ํ๋กํ์ผ๋ฌ์์ ์๋ณด์ด๋๊ฑด ์ต์ ๋ฐ๊ฟ์ ๋ณผ์์๊ณ , TryGetComponent๋ ์๋ํฐ / ๋ฐํ์ ๋ชจ๋ ํ ๋น์ด์์ผ๋ ๋ ์ข๋ค ๋ฐ์์ ์๊ธฐ๊ฐ์๋ค
https://tistory.jeon.sh/11
๋งค์ฐ ์ ๋ฆฌ์๋์๋ค ์ด๋ ๊ฒ ์์ธํ๋ชฐ๋๋๋ฐ ๋๋ ํ๋ ์์๊ฐ๋ค
๋ด์ฉ ๋ช์ค ์ถ๊ฐํด์ ์์ ํจ
์ ๋งํฌ๊ธ ๋ฏธ์ณค๋ค. ๋๋ถ์ ์ข์๊ฑฐ ์์๊ฐ๋๋ค. ์ฐ์ด๋
๋ ์ต๊ณ ์ผ!! - dc App
์ข์๊ธ ๊ฐ์ฌํฉ๋๋ค ๋ฏธ์น
GetComponent๋ ๊ฐ์ ์ปดํฌ๋ํธ์ 3๋ฒ์ด์ ์ฐ๋ฉด ๊ทธ๋ฅ ์ด๋์ ์บ์ฑํด๋๊ณ ์ฐ์...