๐ฒ ํ๋ธ ๋๋ฆฌ๊ธฐ
1. ํ๋ธ ๊ตด๋ฆฌ๊ธฐ
ํ์ฌ ์คํฐ๋๋ฅผ ํ๊ณ ์๋ ๊ณณ์์ ๋ค์๊ณผ ๊ฐ์ ๊ตด๋ฌ๊ฐ๋ ํ๋ธ์ ๋ํด ํ๋ฒ ๋ง๋ค์ด ์ค๋ผ๊ณ ๊ณผ์ ๋ฅผ ๋ด์ฃผ์ จ๋ค.
์ฒ์์ ์ด ๊ณผ์ ๋ฅผ ๋ด์ฃผ์๊ณ ๋์ ์ด๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ๋์ง ๊ณ ๋ฏผํ๋ค๊ฐ wasd ๋ฐฉํฅํค์ ๋ฐ๋ผ Rotation์ ๋ฐ๊พธ๋ ์์ผ๋ก ํ๊ธฐ๋ก ๊ตฌ์์ ํ์๋ค.
2. ์ด๊ธฐ๊ตฌ์
์์ ๊ฐ์ด ๋จ์ํ๊ฒ ๋ฐ์ ๊ฐ์ผ๋ก ๊พธ์คํ Rotate๋ฅผ ํ๋ ์์ผ๋ก ๊ตฌํ์ ํ์๋ค.
๊ทธ๋ฌ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ตฌํ์ด ๋์๋ค.
3. ๋ฌธ์ ์ ๋ฐ๊ฒฌ
๊ทธ๋ฐ๋ฐ ์ด ์ฝ๋์ ๋จ์ํ ์ค๋ ฅ์ ์ ์ฉ์ํค์ ๋ค์๊ณผ ๊ฐ์ด ์ด์ํ๊ฒ ํ๋ธ๊ฐ ๊ตด๋ฌ๊ฐ๋ค. ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ์ํด ๋ง์ฐฐ๋ ฅ, ์ค๋ ฅ์ ๋ํด์ ์ฌ๋ฌ๊ฐ์ง ์ค์ ์ ํด์คฌ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์ด๋ ํ ํด๊ฒฐ์ฑ ์ด ๋์ค์ง ์์๋ค.
4. ์ต์ข ์ฝ๋
๊ฒฐ๊ตญ ๊ตฌ๊ธ๋ง์ ํ๋ฉฐ ๋ฐฉ๋ฒ์ ์ฐพ๋ค๊ฐ rolling cube
๋ผ๊ณ ๊ฒ์์ ํ์ ์ฐธ๊ณ ํ ๋งํ ์์์ด ๋์๋ค.
https://www.youtube.com/watch?v=06rs3U2bpy8
์ด ๋์์์ ์ฐธ๊ณ ํ์ฌ ์ฝ๋๋ฅผ ์งฐ๋ค.
Update๋ฌธ
void Update()
{
if (_isRolling != true)
{
if (Input.GetKey(KeyCode.W)) { Rolling_Manage(Vector3.forward); }
else if (Input.GetKey(KeyCode.S)) { Rolling_Manage(Vector3.back); }
else if (Input.GetKey(KeyCode.D)) { Rolling_Manage(Vector3.right); }
else if (Input.GetKey(KeyCode.A)) { Rolling_Manage(Vector3.left); }
}
}
์ด๋์ค์ ์ด๋ํ๋๊ฒ์ ๋ง๊ธฐ ์ํ์ฌ _isrolling
์ด false์ผ ๋๋ง ์๋ํ๊ฒ ํ์๋ค.
ํค๋ณด๋์ ์
๋ ฅ์ ๋ฐ๋ฅธ ์ด๋์ ๊ตฌํํ๊ธฐ ์ํ์ฌ wasd์ ๋ฐ๋ฅธ Rolling_Manage
ํจ์๋ฅผ ์๋์ํค๊ฒ Update
๋ฌธ์ ๊ตฌํํ์๋ค.
Rolling_Manager
void Rolling_Manage(Vector3 dir)
{
var axis = transform.position + (Vector3.down + dir) * 0.5f;
var angle = Vector3.Cross(Vector3.up, dir);
StartCoroutine(Rolling(axis, angle));
}
์ฌ๊ธฐ์ ๋ง์ฝ d๊ฐ์ด ๋ค์ด์์ ์์ axis
๋ transform.position
์ด๋ผ๋ ํ์ฌ ์์น์ Vector3.down
(0, -1, 0)์ dir
(1, 0, 0)์ด๋ผ๋ ๋ฒกํฐ๊ฐ์ ํฉ์น๊ณ 2๋ก ๋๋ ๊ฐ์ธ (0.5, -0.5, 0)๋งํผ ์์ง์ด๋ฉด ๋ฌผ์ฒด์ ์ฌ์ด์ฆ๊ฐ 1์ด๋ผ ํ์๋, ๊ทธ ๋ฌผ์ฒด์ ๋ชจ์๋ฆฌ์ ์ขํ๊ฐ ๋์จ๋ค.
๋ angle
์ Vector3.Cross
๋ผ๋ ์ธ์ ํจ์๋ฅผ ์ด์ฉํ์ฌ Vector3.up
(0, 1, 0)๊ณผ dir
(1, 0, 0)์ ์ธ์ ์ํค๋ฉด +๊ฐ์ด ๋์จ๋ค. ์ด๋ ๊ฒ ๋ ๊ฐ์ ์ธ์ ์ํจ ๊ฐ์ ๋ถํธ๋ฅผ ํตํด์ ํ๋ธ๊ฐ ์ด๋ ๋ฐฉํฅ์ผ๋ก ๊ตด๋ฌ๊ฐ์ง๋ฅผ ์ ํด์ฃผ์๋ค.
ํ๋ก๊ทธ๋จ์ด ์๋ํ๋ ๋์ค์ ๋ฐ๋ก ์๋๋๊ฒ ํ๊ธฐ ์ํ์ฌ coroutine
์ ์ฌ์ฉํ์๋ค.
rolling
IEnumerator Rolling(Vector3 axis, Vector3 angle)
{
_isRolling = true;
for (int i = 0; i < (90 / speed); i++) {
transform.RotateAround(axis, angle, speed);
yield return null;
}
_isRolling = false;
}
์ดํ Rolling
์ด๋ผ๋ ํจ์์์๋ _isRolling
์ true๋ก ๋ณ๊ฒฝํ๊ณ , RotateAround
๋ผ๋ axis
๊ฐ์ ๊ธฐ์ค์ผ๋ก angle
๋ฐฉํฅ์ผ๋ก ๋๋ ค์ฃผ๋ ํจ์๋ฅผ ์ด์ฉํ์ฌ ํ๋ธ๋ฅผ 90๋ ๋๋ ค์ฃผ์๋ค.
๊ฒฐ๊ณผ๋ฌผ
์ดํ ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ด๋ค.
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐