์ธ๋ฆฌ์ผ์์ ์ ๊ณตํ๋ 1์ธ์นญ, 3์ธ์นญ ๋ฑ ํ๋ก์ ํธ์ ์ ๋๋ฉ์ดํ ๋ ์ธ๋ถ FBX์ ์ ์ฉํด ๋ณผ ๊ฒ์ด๋ค. ์ธ๋ฆฌ์ผ์ ๋ชจ๋ ํ๋ก์ ํธ๋ ๊ธฐ๋ณธ ์บ๋ฆญํฐ๋ก Mannequin์ ์ฌ์ฉํ๊ณ ์๋ค. ์ด ๊ธฐ๋ณธ ์บ๋ฆญํฐ๋ฅผ ์ค์ ๊ฒ์์์ ํ๋ ์ดํ ์บ๋ฆญํฐ๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
1. FBX ์ํฌํธ
์ํฌํธ ๋ฒํผ์ ํตํด FBX๋ฅผ ์ํฌํธ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ํฌํธ ์ต์ ์ฐฝ์ด ๋จ๊ฒ ๋๋ค.
- Mesh-Auto Generate Collision: ์ถฉ๋๊ฐ์ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
์ํฌํธ๋ฅผ ํ๊ฒ ๋๋ฉด ๋ฉ์์ ํจ๊ป ์ฌ๋ฌ ํ์ผ๋ค์ ํจ๊ป ๊ฐ์ ธ์จ ๊ฒ์ ํ์ธํ ์ ์๋ค. ํน์ ํ์ผ์ ๊ฐ์ ธ์ฌ์ง ๋ง์ง๋ ์ต์ ์ ํตํด ์ ํ ์ ์๋ค.
- ์ค์ผ๋ ํค: ์ค์ผ๋ ํ ๋ฉ์์์ ์ฌ์ฉํ๋ ๋ผ ๊ตฌ์กฐ์ด๋ค.
- ์ค์ผ๋ ํ ๋ฉ์
- ํผ์ง์ค ์ ์ : ์ ๋๋ฉ์ด์ ๋์ ์ฝ๋ฆฌ์ ๋ฐ์ดํฐ์ด๋ค.
- ์ ๋๋ฉ์ด์ ์ํ์ค: ์ ๋๋ฉ์ด์ ๋ฐ์ดํฐ์ด๋ค.
- ๋จธํฐ๋ฆฌ์ผ
์ด๋ ๊ฒ ๊ฐ์ ธ์จ ์ ์ ๋ค์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ์ ์ ๊ฐ ํผ๋์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ ์ ์ ์ ๋ํ ๊ณตํต์ ๋ช ๋ช ๊ท์น์ ์ ํ๋ ๊ฒ์ด ์ข๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ช ๋ช ๊ท์น์ ๋ฐ๋ผ ์ด๋ฆ์ ์์ ํ๊ณ ๊ฐ ์ฉ๋์ ๋ง๊ฒ ํด๋๋ ์์ฑ์ ํ๋ค.
์ด์ ์ํฌํธ ํ ๋ฉ์๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ํ๋ก์ ํธ์์ ์ฌ์ฉ ์ค์ธ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ ํด๋์ค๋ฅผ ์ฐพ์ ํ, ๋ธ๋ฃจํ๋ฆฐํธ ์ฐฝ์์ ์ค์ผ๋ ํ ๋ฉ์๋ฅผ ์ ๋ฉ์๋ก ๋ณ๊ฒฝํ๋ค.
๋ฉ์ ๋ณ๊ฒฝ์ ์๋์์ง๋ง ํฌ๊ธฐ๊ฐ ๋๋ฌด ์๊ณ ๋ ์ ๋ฐํ ์ ๋ณด์ด์ง ์๋๋ค.
๋ฉ์ ํธ๋์คํผ์ ์์น์ ์ค์ผ์ผ์ ๋ณ๊ฒฝํ์ฌ ์ด์ ์บ๋ฆญํฐ์ ๋น์ทํ๊ฒ ์กฐ์ ํ๋ค.
2. ๋จธํฐ๋ฆฌ์ผ
์ด์ ์๋ก์ด ์บ๋ฆญํฐ์๊ฒ ์์ ์ ํ๋ณผ ๊ฒ์ด๋ค. Texture ํ์ผ์ ์ํฌํธ ํด์ ์ค๋นํ๊ณ ์๊น ์์ฑ๋ ๋จธํฐ๋ฆฌ์ผ์ ์ฐ๊ฒฐํด์ผ ํ๋ค. ๋จธํฐ๋ฆฌ์ผ์ ์ด๊ณ Texture Sample ๋ ธ๋๋ฅผ ํตํด ๊ฐ ๊ฐ์ ๋ง๋ ํ ์ค์ณ๋ฅผ ์ฐ๊ฒฐํ๋ค. ๋ฒ ์ด์ค ์ปฌ๋ฌ๋ง ์์ด๋ ์์ ๋ง๋ค์ด์ง์ง๋ง, ๋ค๋ฅธ ํน์ ๊ฐ์ ํตํด ๋์ฑ๋ ๋ํ ์ผํ๊ฒ ๋ณด์ผ ์ ์๋ค.
- ๋ฒ ์ด์ค ์ปฌ๋ฌ: ๋จธํฐ๋ฆฌ์ผ์ ์ ๋ฐ์ ์ธ ์์์ด๋ค.
- ์คํํ๋ฌ: ๋น๊ธ์ ํ๋ฉด์ ํ์ฌ ์คํํ๋ฌ ๊ฐ์ผ๋ก ํ์ด๋ผ์ดํธ๋ฅผ ๋ํ๋ธ๋ค.
- ๋ ธ๋ฉ: ํ๋ฉด์ ๋ฌผ๋ฆฌ์ ๋ํ ์ผ์ ๋ํ๋ ๊ฐ์ด๋ค.
- ์ฐ๋น์ธํธ ์คํด๋ฃจ์
์ด์ ์คํํ๋ฉด ๋จธํฐ๋ฆฌ์ผ์ด ์ ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
3. ์ ๋๋ฉ์ด์
1) FSM(Finite State Machine)
์ธ๋ฆฌ์ผ์ ์ ๋๋ฉ์ด์ ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋จผ์ FSM์ ์์์ผ ํ๋ค. ์ ํ ์ํ ๊ธฐ๊ณ๋ผ๊ณ ๋ ๋ถ๋ฅด๋ FSM์ ์ํ(state)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์์ ์ ์ดํ๊ธฐ ์ํ ๋์์ธ ํจํด์ด๋ค. ์ธ๋ฆฌ์ผ์ ์ ๋๋ฉ์ด์ ์ ์ด FSM์ ๋ฐ๋ฅด๊ณ ์๋ค.
๋ง์ฝ ์ ํ, ์ด๋จ ์ ํ, ์๋๋ฆฌ๊ธฐ ๋ฑ ์ฌ๋ฌ ์ ๋๋ฉ์ด์ ์ ๊ด๋ฆฌํด์ผ ํ ๋, ์ฝ๋๋ก ์์ฑํ๋ค๋ฉด ํ๋์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋๋ง๋ค ๊ณ์ํด์ if ๋ฌธ์ด ๋์ด๋ ๊ฒ์ด๋ค.
if (input == PRESS_B)
{
if (!bIsJumping)
{
bIsJumping = true;
Jump();
}
}
else if (input == PRESS_DOWN)
{
if (!isJumping_)
{
Duck();
}
}
else if (input == RELEASE_DOWN)
{
Stand();
}
FSM์ ์ฌ์ฉํ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ์ ํ์ ๊ฐ์ ํ๋์ ๋์์ ์คํ ์ดํธ๋ก ์ ํ๊ณ ์ด ์คํ ์ดํธ๋ค ์ค ์กฐ๊ฑด์ ๋ง๋ ํ๋๋ง ๋์ํ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์คํํ ์คํ ์ดํธ๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋ง๋๋ ์กฐ๊ฑด์ ํธ๋์ง์ ์ด๋ผ ๋ถ๋ฅธ๋ค.
2) ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ
์ ๋๋ฉ์ด์ ์ ์ฉ์ ์ํ ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ ๋๋ฉ์ด์ ๊ณผ ๋์ผํ ์ค์ผ๋ ํค์ ์ ํํ ํ ๋ถ๋ชจ ํด๋์ค๋ ์ ๋ ์ธ์คํด์ค(AnimInstance)๋ก ์ ํํ๋ค.
- ์ ๋ ์ธ์คํด์ค(Anim Instance): ์ค์ผ๋ ํ ๋ฉ์๋ฅผ ์์ ํ๋ ํฐ์ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ๋ ๊ทธ๋ํ๊ฐ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
- ์ ๋ ๊ทธ๋ํ(Anim Graph): ์ ๋ ์ธ์คํด์ค์ ๋ณ์์ ๋ฐ๋ผ ๋ณํํ๋ ์ ๋๋ฉ์ด์ ์์คํ ์ ์ค๊ณํ๋ ๊ณต๊ฐ์ด๋ค.
์์ฑํ ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ์ฐ ๋ค, Idle ์ ๋๋ฉ์ด์ ๊ณผ Walk ์ ๋๋ฉ์ด์ ์ ์ ์ดํ๊ธฐ ์ํ IsWalking ๋ณ์๋ฅผ ์ถ๊ฐํ๋ค. ์ด ๋ณ์๋ ๊ฒ์์ด ์คํ๋๋ ๋์ ์บ๋ฆญํฐ ์์ง์์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ฏ๋ก ์ด๋ฒคํธ ๊ทธ๋ํ๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ์ ์๋๋ก ์์ ํ๋ค.
- Event Blueprint Update Animation ๋ ธ๋: ์ ๋๋ฉ์ด์ ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์คํ ์ดํธ ๋ณ์๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ํญ์ ๋ณ์๊ฐ ๊ฒ์ ์คํ ์ดํธ์ ๋๊ธฐํ๋๋๋ก ํ ์ ์๋ค.
์ด์ IsWalking ๋ณ์์ ๋ฐ๋ผ ๋ง๋ ์ ๋๋ฉ์ด์ ์ด ์คํ๋ ์ ์๋๋ก ๊ตฌํ์ด ํ์ํ๋ค. ์ ๋ ๊ทธ๋ํ์์ ์ ์คํ ์ดํธ ๋จธ์ ์ ์ถ๊ฐํ ํ Final Animation Pose ๋ ธ๋์ Result ์ ๋ ฅ ์คํ ํ์ ์ฐ๊ฒฐํ๋ค.
์์ฑํ ์คํ ์ดํธ ๋จธ์ ์ ๋๋ธํด๋ฆญํ์ฌ ์ฐ ํ ์ ๋๋ฉ์ด์ ์ ์คํํ๊ธฐ ์ํ ์คํ ์ดํธ๋ฅผ ์ถ๊ฐํ๋ค. ๊ฐ๊ฐ์ ์คํ ์ดํธ๋ Idle, Walk ์ ๋๋ฉ์ด์ ์ด ์คํ๋๋๋ก ์ฐ๊ฒฐํด์ผ ํ๋ค.
๋ชจ๋ ์คํ ์ดํธ๋ฅผ ์ถ๊ฐํ๋ค๋ฉด ์คํ ์ดํธ ์ฌ์ด์ ํธ๋์ง์ ๋ ์ถ๊ฐํ์ฌ IsWalking ๋ณ์๋ฅผ ํตํด ๋ฐ๋๋๋ก ์ฐ๊ฒฐํ๋ค.
- Entry ๋ ธ๋์์ Idle ์คํ ์ดํธ ๋ ธ๋๋ก ์ฐ๊ฒฐํ๋ค.
- Idle ์คํ
์ดํธ ๋
ธ๋์ Run ์คํ
์ดํธ ๋
ธ๋๋ฅผ ์๋ฐฉํฅ์ผ๋ก ์ฐ๊ฒฐํ๋ค.
- Idle์์ Run ํธ๋์ง์ ์ IsRunning ๋ณ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค.
- Run์์ Idle ํธ๋์ง์ ์ IsRunning ๋ณ์์ Not ๊ฐ์ ์ ๋ ฅ๋ฐ๋๋ค.
์ค์ ์ด ๋ค ์๋ฃ๋์์ผ๋ ์บ๋ฆญํฐ ๋ธ๋ฃจํ๋ฆฐํธ์ ๋ฉ์์ ์ ๋๋ฉ์ด์ ๋ธ๋ฃจํ๋ฆฐํธ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋๋ฉ์ด์ ์ด ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฐธ๊ณ
https://m.blog.naver.com/scycs6/221238180585
์ธ๋ฆฌ์ผ์์ง - FBX ์ํฌํธ ์ต์
Mesh ํญ์ Auto Generate Collision์ ์ถฉ๋๊ฐ์ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๊ฒ ๋ค๋ ๊ธฐ๋ฅ์ด๋ค. ๋ง์ผ์์ ๊ฐ๊ณ ์จ ...
blog.naver.com
FSM
Finite State Machine
velog.io