์›๋ณธ ์งˆ๋ฌธ๊ธ€ :ย https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=209584&page=1

๋‚ด๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์žฌํ˜„ํ–ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ, ์ผ๋‹จ ์ฃผ์–ด์ง„ ๋‚ด์šฉ๋งŒ ๊ฐ€์ง€๊ณ  ์ƒํ™ฉ ์žฌํ˜„ํ•ด๋ณด๊ณ  ํ•ด๊ฒฐํ•ด๋ดค์Œ.
๋‚ด๊ฐ€ ๋˜‘๊ฐ™์ด ์žฌํ˜„ํ•˜์ง€ ๋ชป ํ–ˆ๋‹ค๋ฉด ์งˆ๋ฌธ์ž๋Š” ํ•ด๊ฒฐ์•ˆ๋ ์ˆ˜๋„์žˆ๋Š”๋ฐ, ํ•œ๋ฒˆ ์ฐธ๊ณ ํ•ด๋ด.

24b0d121e09c28a8699fe8b115ef046a7964eac4



์ผ๋‹จ ์ด๋ ‡๊ฒŒ 2๊ฐœ์˜ ์˜์—ญ์„ ๋งŒ๋“ค์—ˆ๊ณ , Cinemachine์€ 3.1.6๋ฒ„์ „์ž„. Unity๋Š” 6000.0.58f2

์งˆ๋ฌธ์ž์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•จ.

0cb3d92be4c631a960f1d1bc10f11a391998f778ec73f4c5af






ํ”„๋ ˆ์ž„ ์ž˜๋ผ์„œ ๋ณด๋ฉด

24b0d121e09c28a8699fe8b115ef046c60f32b4c




์ด๋ ‡๊ฒŒ ์นด๋ฉ”๋ผ๊ฐ€ ์Šฌ๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ.

์งˆ๋ฌธ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฐ”๋Š” ์นด๋ฉ”๋ผ๊ฐ€ "์ˆœ๊ฐ„์ด๋™"ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋จ.

Cinemachine Confiner2D๋Š” ์นด๋ฉ”๋ผ๋ฅผ ์ˆœ๊ฐ„์ด๋™์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์ด ์—†๊ณ  ์นด๋ฉ”๋ผ๊ฐ€ ๊ฒฝ๊ณ„ ๋ฐ–์ด๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒฝ๊ณ„ ์•ˆ์ชฝ์œผ๋กœ ๋Œ์–ด๋‹น๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ž„.

์งˆ๋ฌธ์ž ์ฝ”๋“œ์—์„œ cam.Follow = null๋กœ ๋‘” ๋’ค ๊ฒฝ๊ณ„๋ฅผ zone2๋กœ ๋ฐ”๊พธ๋Š”๋ฐ, ์ด๋•Œ ์นด๋ฉ”๋ผ๋Š” ์—ฌ์ „ํžˆ zone1์— ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ๋ผ Confiner๊ฐ€ "์นด๋ฉ”๋ผ๊ฐ€ ๊ฒฝ๊ณ„ ๋ฐ–์— ์žˆ๋‹ค"๊ณ  ํŒ๋‹จํ•˜๊ณ  zone2 ๊ฒฝ๊ณ„ ์•ˆ์ชฝ(=zone1.5 ์ง€์ )์œผ๋กœ ๋Œ์–ด์˜ค๊ธฐ ์‹œ์ž‘ํ•จ. ๊ทธ ๋Œ๋ ค์˜ค๋Š” ๊ณผ์ •์˜ ํ•œ ํ”„๋ ˆ์ž„์ด ํ™”๋ฉด์— ๋ Œ๋”๋ง๋œ ๊ฒƒ.

์•ฝํ•œ ํ•ด๊ฒฐ 1:

0cb3d92be4c631a960ed98b21fd7040385abcec254b8a49746b1




24b0d121e09c28a8699fe8b115ef046c64f42049

๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒƒ๋„ ์›€์งค์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ฑฐ์˜ ์•ˆ๋ณด์ด๊ธดํ•œ๋ฐ, ํ”„๋ ˆ์ž„ ์ž˜๋ผ์„œ ๋ณด๋ฉด ใ„นใ…‡ 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.

}








๋” ์ข‹์€ ํ•ด๊ฒฐ๋ฒ• :



0cb3d92be4c631a960ec98b21fd70403c594e2f5c54094699ed2



์‹ค์ œ ์นด๋ฉ”๋ผ transform์ด ๋‹ค์Œ CinemachineBrain ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ๋ฐ˜์˜์ด ๋ฐ€๋ฆฌ๋Š”๊ฑธ ๋Œ€์ฒ˜ํ•จ


์ด๊ฑด ํ”„๋ ˆ์ž„ ์ž˜๋ผ๋ด๋„ ๋ฌธ์ œ์—†์Œ(60fps๊ธฐ์ค€)

24b0d121e09c28a8699fe8b115ef046c61f8214c


์ฝ”๋“œ๋Š” :

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ํ”„๋ ˆ์ž„ ๊ฐ„๊ทน ์ œ๊ฑฐ.

}




๋‚œ ๊ณ ๋„๋‹จ์ธ๋ฐ ์ด๊ฑฐ ํ•ด๊ฒฐํ•ด๋ณด๋ ค๊ณ  ์˜ค๋žœ๋งŒ์— ์œ ๋‹ˆํ‹ฐ์ผฐ๋‹ค

๋˜‘๊ฐ™์ด ํ•ด๊ฒฐ๋ ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ(์กฐ๊ฑด์ด ๋‹ค๋ฅผ์ˆ˜์žˆ์œผ๋‹ˆ) ํ•ด๋ด๋ผ