์๋ณธ ์ง๋ฌธ๊ธ :ย https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=209584&page=1
๋ด๊ฐ ์ ํํ๊ฒ ์ฌํํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ์ผ๋จ ์ฃผ์ด์ง ๋ด์ฉ๋ง ๊ฐ์ง๊ณ ์ํฉ ์ฌํํด๋ณด๊ณ ํด๊ฒฐํด๋ดค์.
๋ด๊ฐ ๋๊ฐ์ด ์ฌํํ์ง ๋ชป ํ๋ค๋ฉด ์ง๋ฌธ์๋ ํด๊ฒฐ์๋ ์๋์๋๋ฐ, ํ๋ฒ ์ฐธ๊ณ ํด๋ด.
์ผ๋จ ์ด๋ ๊ฒ 2๊ฐ์ ์์ญ์ ๋ง๋ค์๊ณ , Cinemachine์ 3.1.6๋ฒ์ ์. Unity๋ 6000.0.58f2
์ง๋ฌธ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์์ด ๋ฐ์ํจ.
ํ๋ ์ ์๋ผ์ ๋ณด๋ฉด
์ด๋ ๊ฒ ์นด๋ฉ๋ผ๊ฐ ์ฌ๋ผ์ด๋ฉํ๋ ๊ฒ์ ํ์ธํ ์ ์์.
์ง๋ฌธ์๊ฐ ์ํ๋ ๋ฐ๋ ์นด๋ฉ๋ผ๊ฐ "์๊ฐ์ด๋"ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋จ.
Cinemachine Confiner2D๋ ์นด๋ฉ๋ผ๋ฅผ ์๊ฐ์ด๋์ํค๋ ๊ธฐ๋ฅ์ด ์๊ณ ์นด๋ฉ๋ผ๊ฐ ๊ฒฝ๊ณ ๋ฐ์ด๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฝ๊ณ ์์ชฝ์ผ๋ก ๋์ด๋น๊ธฐ๊ธฐ ๋๋ฌธ์.
์ง๋ฌธ์ ์ฝ๋์์ cam.Follow = null๋ก ๋ ๋ค ๊ฒฝ๊ณ๋ฅผ zone2๋ก ๋ฐ๊พธ๋๋ฐ, ์ด๋ ์นด๋ฉ๋ผ๋ ์ฌ์ ํ zone1์ ๋จ์์๋ ์ํ๋ผ Confiner๊ฐ "์นด๋ฉ๋ผ๊ฐ ๊ฒฝ๊ณ ๋ฐ์ ์๋ค"๊ณ ํ๋จํ๊ณ zone2 ๊ฒฝ๊ณ ์์ชฝ(=zone1.5 ์ง์ )์ผ๋ก ๋์ด์ค๊ธฐ ์์ํจ. ๊ทธ ๋๋ ค์ค๋ ๊ณผ์ ์ ํ ํ๋ ์์ด ํ๋ฉด์ ๋ ๋๋ง๋ ๊ฒ.
์ฝํ ํด๊ฒฐ 1:
๊ทธ๋ฐ๋ฐ ์ด๊ฒ๋ ์์งค์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ๊ฑฐ์ ์๋ณด์ด๊ธดํ๋ฐ, ํ๋ ์ ์๋ผ์ ๋ณด๋ฉด ในใ
1ํ๋ ์์ ๋ ๋จ์.(์ดฌ์ 60fps๊ธฐ์ค) ์ด๊ฑด ์ ๋ํฐ ์คํ ๋ฃจํ ์์์ Cinemachine์ ์ํ ๋ฐ์ ์ ์ ํ ํ๋ ์ ์กํ๋ ๊ฒ ๊ฐ์๋ฐ ์๋ฒฝ ํด๊ฒฐ์ ์๋. (์ ์ฉํด๋ณด๋ฉด ์ฌ๋ ๋์๋ ์ ์๋ณด์ด๊ธดํจ ๋ ์ข์ ์ฌ๋์ ๋ณผ์์์๋ฏ)
์ฝ๋:
HandleTransitionํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ. (1์ค ์ถ๊ฐ)
void HandleTransition(GameObject player)
{
ย ย Vector3 oldPos = player.transform.position;
ย ย UpdatePlayerPosition(player);
ย ย Vector3 delta = player.transform.position - oldPos;
ย ย confiner.BoundingShape2D = mapBoundary;
ย ย confiner.InvalidateBoundingShapeCache();
ย ย cam.OnTargetObjectWarped(player.transform, delta); // Cinemachine์๊ฒ ํ๊ฒ์ด delta๋งํผ ์๊ฐ์ด๋ํ๋ค๋๊ฑธ ์๋ฆฌ๋ API.
}
๋ ์ข์ ํด๊ฒฐ๋ฒ :
์ค์ ์นด๋ฉ๋ผ transform์ด ๋ค์ CinemachineBrain ์
๋ฐ์ดํธ๊น์ง ๋ฐ์์ด ๋ฐ๋ฆฌ๋๊ฑธ ๋์ฒํจ
์ด๊ฑด ํ๋ ์ ์๋ผ๋ด๋ ๋ฌธ์ ์์(60fps๊ธฐ์ค)
์ฝ๋๋ :
void HandleTransition(GameObject player)
{
ย ย Vector3 oldPos = player.transform.position;
ย ย UpdatePlayerPosition(player);
ย ย Vector3 delta = player.transform.position - oldPos;
ย ย confiner.BoundingShape2D = mapBoundary;
ย ย confiner.InvalidateBoundingShapeCache();
ย ย cam.OnTargetObjectWarped(player.transform, delta);
ย ย // Cinemachine์๊ฒ "ํ๊ฒ์ด delta๋งํผ ์๊ฐ์ด๋ํ๋ค"๊ณ ํต์ง. ๋ด๋ถ ์ถ์ ์ํ๋ฅผ ๋ณด์ ํด์ ๋ณด๊ฐ ์คํต.
ย ย cam.ForceCameraPosition(cam.transform.position + delta, cam.transform.rotation);
ย ย // ์นด๋ฉ๋ผ ์์น ์์ฒด๋ delta๋งํผ ์ฆ์ ๋ฐ์ด๋ฃ์. ๋ค์ Brain update๊น์ง์ 1ํ๋ ์ ๊ฐ๊ทน ์ ๊ฑฐ.
}
๋ ๊ณ ๋๋จ์ธ๋ฐ ์ด๊ฑฐ ํด๊ฒฐํด๋ณด๋ ค๊ณ ์ค๋๋ง์ ์ ๋ํฐ์ผฐ๋ค
๋๊ฐ์ด ํด๊ฒฐ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ(์กฐ๊ฑด์ด ๋ค๋ฅผ์์์ผ๋) ํด๋ด๋ผ
๊ทผ๋ฐ ๊ทธ๋ฅ ์นด๋ฉ๋ผ1 off, ์นด๋ฉ๋ผ2 on ์ด๊ฑธ๋ก ์ ๋๋? ์์ ์ ๊ทธ๋ ๊ฒ ์ฒ๋ฆฌํ์๋ ๊ธฐ์ต์ด ์๋๋ฐ
@211214 ๊ทธ๊ฒ๋ ๊ฐํธํ๊ฒ ํด๊ฒฐ๋ ํ ๋ฐ, ๋ง์ฝ์ ์ฅ๋ฉด์ด ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๊ท์ฐฎ์์ง๋ฏ? (์ฅ๋ฉด๋ง๋ค ์นด๋ฉ๋ผ ์์ด์ผํ๋๊น) ์ง์ญ ์ด๋์ ๊ทธ ์ง์ญ์ ์นด๋ฉ๋ผ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์์์ on ํ๋ ํํ๋ก ์ง๋ฉด ๊ทธ๋ ๊ฒ ์๋ถํธํ ์๋์๊ฒ ๋ค. ๋์ค์ ๋๋ ์ธ์ผ์์ผ๋ฉด ์จ๋จน์ด์ผ์ง ์ ์ง๋ฌธ์๊ฐ ๋ด๋น์ธ๊ฒ๊ฐ์์ ์ต๋ํ ์ง๋ฌธ์์ ๋ฒ ์ด์ค์ ๋ช๊ฐ ์ถ๊ฐํ๋๊ฑธ๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์์๋ดค์
์ง๋ฌธ์๋ ์ง์ง ์ ์ฑ์ ์๊ฐํด์๋ผ๋ ๊ฒ์ ๋ด์ค์ผํ๋ค. ์ด๋ฐ ์ ์ฑ ๋ต๋ณ ๊ธ ์ฒ์๋ณธ๋ค - dc App
์๋ ์ง๋ฌธ๊ธ ์์ฑ์ : ์ ์๋ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ ๊ฐ ์์นจ์ ์ผ์ด๋์๋ง์ ์ ์๊ธ๋ง ๋ณด๊ณ ์ด ๊ธ์ ์ด์ ์ผ ๋ดค๋ค์. ๋๋ฌด ๊ฐ๋ํด์ ์ ์ ๋จธ๋ฆฌ๊ฐ ๋ฉํ์ด์. ์ ๋ง๋ก ๊ทํ ์๊ฐ ์ฐ์ ์ ์๋ ค์ฃผ์ ๋ฐฉ๋ฒ๋ ํ ์คํธ ํด ๋ณด๊ณ , ๊ทธ๋์ ์ ๊ฐ ์์๋ธ ๊ฒ๋ ๋ฐ์ํด์ ์ ํด๊ฒฐํ๋๋ก ํ๊ฒ ์ต๋๋ค. ์๊ธ ๋ต๊ธ์๋ ์ผ์ง๋ง, polygon collider2D ์์ญ ์ค์ ๊ณผ ์นด๋ฉ๋ผ ์ธ์คํํฐ ์์น๋ค์ ์กฐ์ ํ์ ๋ ๋ณํ๊ฐ ๋ณด์ฌ์ ์ด ๋ถ๋ถ๋ ๊ณ์ ํ๊ณ ๋ค ์์ ์ ๋๋ค. ํด๊ฒฐ์ด ๋๋ฉด ๊ผญ ๊ฒ์๊ธ ์ฌ๋ฆฌ๊ฒ ์ต๋๋ค. ๋ ๊ฑด๊ฐํ์๊ณ ํธ์ํ์๊ธฐ ๋ฐ๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค.