์œ ๋‹ˆํ‹ฐ์—์„œ Rigidbody์™€ Collider๋ฅผ ์ด์šฉํ•˜์—ฌ ์›€์ง์ž„์„ ๊ตฌํ˜„ํ•˜์‹œ๋Š”๋ถ„๋“ค์ด ๋งŽ์„๊ฒ๋‹ˆ๋‹ค~


๊ทธ๋Ÿฐ๋ฐ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด ๋ญ”๊ฐ€์กฐ๊ธˆ ๋น„์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ด ์žˆ์œผ์‹คํ…๋ฐ์š”.

์—ฌ๋Ÿฌ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์กฐ๊ธˆ ์ž์—ฐ์Šค๋Ÿฌ์šด ์›€์ง์ž„์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.



1. ์ ํ”„๊ตฌํ˜„


์‚ฌ์‹ค ์ ํ”„ ์ž์ฒด ๊ตฌํ˜„์€ ๊ทธ๋‹ค์ง€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rigidbody์— y๋ฐฉํ–ฅ์œผ๋กœ ์ผ์ •ํž˜๋งŒ ๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๋ฌธ์ œ๋Š” '์ ํ”„๊ฐ€ ๊ฐ€๋Šฅ' ํ•œ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ ํ”„๋ฅผ ํ•˜๋ ค๋ฉด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ”๋‹ฅ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์ง€์š”.


์ด๋•Œ '๋ฐ”๋‹ฅ'์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ๋ฐฉ๋ฒ•์€ Raycast ์ž…๋‹ˆ๋‹ค.



Raycast๋Š” ์ผ์ •ํ•œ ์œ„์น˜์—์„œ ์ผ์ •ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ผ์ •ํ•œ ๊ฑฐ๋ฆฌ์— ๋ณด์ด์ง€์•Š๋Š” ๊ด‘์„ ์„ ๋ฐœ์‚ฌํ•˜์—ฌ ๋ถ€๋”ซํžˆ๋Š” Collider๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.



(Raycast ๊ฐœ๋…๋„)


์šฐ๋ฆฌ๋Š” ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜์—์„œ, ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ, ์งง์€ ๊ฑฐ๋ฆฌ์— Raycast๋ฅผ ๋ฐœ์‚ฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ, Raycast๋Š” ์—ฐ์‚ฐ์ด ๋งŽ์€ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋งคํ”„๋ ˆ์ž„๋งˆ๋‹ค ํ˜ธ์ถœํ•˜๊ธฐ์—๋Š” ๋ถ€๋‹ด์ด ์žˆ๋Š” ์ž‘์—… ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ˜„์žฌ y๋ฐฉํ–ฅ ์†๋„์— ๋”ฐ๋ผ์„œ Raycast๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.





์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Physics.Raycast( ์‹œ์ž‘์œ„์น˜, ๋ฐฉํ–ฅ, RaycastHit ๊ตฌ์กฐ์ฒด ๋ ˆํผ๋Ÿฐ์Šค, ๊ฑฐ๋ฆฌ, ๋ ˆ์ด์–ด๋งˆ์Šคํฌ );


์‹œ์ž‘์œ„์น˜ => ๋ฐœ์‚ฌ๋  Ray์˜ ์‹œ์ž‘์  ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฐœ๋ฐ‘์—์„œ ๋ฐœ์‚ฌํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐœ์‚ฌ๋ฐฉํ–ฅ => Vector3.down, (0f,-1f,0f)

๊ฑฐ๋ฆฌย  ย  ย  => ๊ธธ๊ฒŒ ๋ฐœ์‚ฌํ•˜๋ฉด ๊ณต์ค‘์—์„œ๋„ ๊ทธ๋ผ์šด๋“œ ์ฒดํฌ๊ฐ€ ๋˜๋ฏ€๋กœ ์งง๊ฒŒ 1f์ •๋„๋งŒ ๋ฐœ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด๋งˆ์Šคํฌ => ์ฝœ๋ผ์ด๋”์˜ GameObject์ค‘์— ํŠน์ •๋ ˆ์ด์–ด์— ์†ํ•œ ๊ทธ๋ฃน๋งŒ Raycast๋ฅผ ํ—ˆ์šฉํ•˜๋„๋ก ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 

public LayerMask Mask; ์„ ์–ธํ•ด๋‘์‹œ๊ณ  ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.



Rigidbody์˜ velocity ์†์„ฑ์€ ํ˜„์žฌ Rigidbody์˜ ์†๋„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.ย 

Raycast ๊ฒฐ๊ณผ ๋ถ€๋”ซํžˆ๋Š” ์ฝœ๋ผ์ด๋”๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ทธ์ •๋ณด๊ฐ€ RaycastHit ๊ตฌ์กฐ์ฒด์— ๋‹ด๊ฒจ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค.





์ ํ”„๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์œ„๋ฐฉํ–ฅ์œผ๋กœ ์˜ฌ๋ ค์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ( ์ €๋Š” ๋‹ฌ๋ฆด๋•Œ ์กฐ๊ธˆ๋” ๋†’์ด ๋›ฐ๋„๋ก ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Sprint๋ผ๋Š” float ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)



Raycast์˜ ๋‹จ์ ์ด ์žˆ๋‹ค๋ฉด ์ด๋Ÿฐ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.




์ด๊ฒฝ์šฐ์—๋Š” IsGround ์ฒดํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ



์ด๋Ÿฐ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ผ์šด๋“œ ์ฒดํฌ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฐ๊ฒฝ์šฐ ์˜ค๋ธŒ์ ํŠธ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ Raycast๋ฅผ ์—ฌ๋Ÿฌ์œ„์น˜์—์„œ ๋ฐœ์‚ฌํ•˜๋Š” ์ „๋žต๋„ ํ•„์š”ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



2. ๊ฒฝ์‚ฌ๊ฐ๋„์— ๋”ฐ๋ฅธ ์›€์ง์ž„ ๊ตฌํ˜„


Rigidbody๋ฅผ ํ†ตํ•ด ์›€์ง์ผ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ MovePosition๊ฐ™์€ Rigidbody ํ•จ์ˆ˜๋‚˜, Transform.Translate๋“ฑ์˜ ์ด๋™๋งŒ์œผ๋กœ๋Š”

์•ž์˜ ์žฅ์• ๋ฌผ์ด ๊ฒฝ์‚ฌ๊ฐ์—๋”ฐ๋ผ ์›€์ง์ž„์„ ์ œํ•œ์ฃผ๊ธฐ์—๋Š” ์‚ฌ์‹ค ํž˜๋“ญ๋‹ˆ๋‹ค.ย 
๊ฒฝ์‚ฌ๊ฐ๋„์— ๋”ฐ๋ผ ์บ๋ฆญํ„ฐ์˜ ์†๋„๋ฅผ ์ œ์–ดํ•˜๋Š”ย ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœ ํ•ฉ๋‹ˆ๋‹ค.



์žฅ์• ๋ฌผ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.





์ผ๋‹จ ์บ๋ฆญํ„ฐ์˜ ์•ž๋ฐฉํ–ฅ์— ์žฅ์• ๋ฌผ์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฒˆ์—๋„ Raycast๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.



์—ฌ๊ธฐ๊นŒ์ง€๋Š” Ground Check์™€ ๋ณ„๋ฐ˜ ๋‹ค๋ฅผ๋ฐ” ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ด์šฉํ• ๊ฒƒ์€ RaycastHit ๊ตฌ์กฐ์ฒด ์ •๋ณด์ž…๋‹ˆ๋‹ค.




๋งŽ์€ ์ •๋ณด๊ฐ€ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ๋‚ด์šฉ์€ point์™€ normal ์ž…๋‹ˆ๋‹ค.

point๋Š” ray๊ฐ€ ๋ถ€๋”ซํžŒ ์ง€์ , normal์€ ๋ถ€๋”ซํžŒ ๋ฉด์˜ ๋ฒ•์„ ๋ฒกํ„ฐ(์ˆ˜์ง)ย  ์ž…๋‹ˆ๋‹ค.



์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.




์ดˆ๋ก์ƒ‰์˜ ๋ฒ•์„ ๋ฒกํ„ฐ๊ฐ€ ๋ณด์ด์‹œ๋‚˜์š”?


์ž, ์ด ๋ฒ•์„ ๋ฒกํ„ฐ๋Š” ์ฝœ๋ผ์ด๋”์˜ ๋ฉด์ด ์ด๋ฃจ๋Š” ์ˆ˜์ง๋ฒกํ„ฐ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฐฉํ–ฅ์„ ์ด์šฉํ•˜์—ฌ ๋“ฑํŒ ๊ฐ๋„๋ฅผ ์•Œ์•„๋‚ผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ๊ทธ๋Ÿผ ๋“ฑํŒ๊ฐ๋„๋ฅผ ์•Œ์•„์•ผ ๊ฒ ์ฃ ? ์ด๋•Œ ๋“ฑํŒ๊ฐ๋„๋Š” ๋ˆˆ์น˜์ฑ„์‹ ๋ถ„๋“ค๋„ ์žˆ๊ฒ ์ง€๋งŒ!

๋ฒกํ„ฐ์˜ '๋‚ด์ '์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๋„๋ฅผ ์•Œ์•„๋‚ผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




๋‚ด์ ์€ ๋‘ ๋ฒกํ„ฐ๊ฐ€ ์ด๋ฃจ๋Š” ๊ฐ๋„๋ฅผ ์•Œ๊ณ ์‹ถ์„๋•Œ! ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑํ„ฐ์˜ ๋‚ด์ ์€ ๋ฐฑํ„ฐ A,B์˜ ํฌ๊ธฐ์™€ cos(โˆ‚)๋ฅผ ๊ณฑํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.ย 

์ด๋•Œ ๋‘ ๋ฒกํ„ฐ๊ฐ€ ๋‹จ์œ„ ๋ฒกํ„ฐ๋ผ๋ฉด ํฌ๊ธฐ๊ฐ€ 1์ด๋ฏ€๋กœ, ์ƒ๋žต๊ฐ€๋Šฅํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ cos(โˆ‚)๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.






์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•ด์•ผํ•  ๊ฒƒ์€

ํ”Œ๋ ˆ์ด์–ด์˜ ์•ž๋ฐฉํ–ฅ(๋นจ๊ฐ„์ƒ‰)์˜ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ(ํŒŒ๋ž€์ƒ‰)๊ณผ, ๋ฒ•์„ ๋ฒกํ„ฐ์‚ฌ์ด์˜ ๊ฐ๋„๋ฅผ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

90๋„ - ๋‚ด์ ๊ฒฐ๊ณผ = ๊ฒฝ์‚ฌ๊ฐ๋„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


์‹ค์ œ ๊ฒฝ์‚ฌ๊ฐ๋„๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‚ด์ ๊ฒฐ๊ณผ์— Acos์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ( cos์˜ ์—ญํ•จ์ˆ˜ )







๊ฒฐ๊ณผ๊ฐ€ Cos( โˆ‚ ) ์ด๋ฏ€๋กœ, ์‰ฝ๊ฒŒ ๋“ฑํŒ๊ฐ๋„์— ๋”ฐ๋ฅธ ์†๋„๋ฅผ ํŒ๋‹จํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


cos(0)ย  = 1

cos(30) = ๋ฃจํŠธ(3)/2

cos(45) = ๋ฃจํŠธ(2)/2

cos(60) = 1/2

cos(90) = 0


๋“ฑํŒ๊ฐ๋„๊ฐ€ 90๋„๋ฉด ๋‹น์—ฐํžˆ ์•ž์œผ๋กœ ๊ฐ€์ง€ ๋ชปํ•˜๊ฒ ์ฃ ?




์‹ค์ œ ์›€์ง์ด๋Š” ์ฝ”๋“œ๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค.



๋ถ€๋”ซํžŒ์ ์˜ ๋ฒ•์„ ๋ฒกํ„ฐ์™€ ๋‚ด์ ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ๋„๋ฅผ ๊ตฌํ•˜๊ณ , ๊ทธ์—๋”ฐ๋ฅธ ํ”Œ๋ ˆ์ด์–ด ์†๋„๋ฅผ ์ •ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Hit.gameObject.rotation ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์‹ค๋ถ„๋“ค๋„ ์žˆ์œผ์‹œ๊ฒ ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด Terrain๊ฐ™์€ ์ง€ํ˜•์˜ ๋“ฑํŒ๊ฐ๋„๋Š” ์ธก์ •ํ• ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

(Terrain ์˜ค๋ธŒ์ ํŠธ์˜ Rotation์˜ Euler๋Š”ย ํ•ญ์ƒ 0,0,0 ์ผ ํ…Œ๋‹ˆ๊นŒ์š”.. )