๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90

 

 

 

 

1. ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ€์ ธ์˜ค๊ธฐ

์บ๋ฆญํ„ฐ ๋ชจ๋ธ์ด ํœด๋จธ๋…ธ์ด๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ๋ฆฌํƒ€๊ฒŸํŒ…์„ ๋ชป ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

 

์ €๋Š” ์—์…‹ ์Šคํ† ์–ด์—์„œ ์บ๋ฆญํ„ฐ ๋ชจ๋ธ์„ ์ƒ€๊ณ , Humonoid Animation Retargeting์„ ์ด์šฉํ•˜์—ฌ Mixamo ์‚ฌ์ดํŠธ์— ์žˆ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์„ ์žฌ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ตฌ๋งคํ•œ ์—์…‹์ด ํœด๋จธ๋…ธ์ด๋“œ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋”๋ผ๊ตฌ์š”. ๊ทธ๋ž˜์„œ Mixamo ์‚ฌ์ดํŠธ ์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์„ ์ ์šฉํ•˜์งˆ ๋ชป ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํœด๋จธ๋…ธ์ด๋“œ ๋ผˆ๋Œ€ ๊ตฌ์กฐ์™€ ๊ตฌ๋งคํ•œ ์—์…‹์˜ ๋ผˆ๋Œ€ ๊ตฌ์กฐ๊ฐ€ ๋‹ฌ๋ž๊ธฐ์—, ๋งค์นญ์ด ์•ˆ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๊ตฌ์š”.

 

๊ทธ๋ž˜์„œ ๊ทธ๋ƒฅ 3D ํˆด(Blender, Maya ๊ฐ™์€)์— ๊ฐ€์ ธ์™€์„œ ๋ผˆ๋Œ€๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐ ํ›„, Mixamo ์‚ฌ์ดํŠธ์— ์˜คํ†  ๋ฆฌ๊น…(Auto Rigging)์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ํœด๋จธ๋…ธ์ด๋“œ ๋ผˆ๋Œ€ ๊ตฌ์กฐ๋ฅผ ๋“ฑ๋กํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋น„๊ณต๊ฐœ ์ฒ˜๋ฆฌํ•œ ๊ฒŒ์‹œ๊ธ€์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์—ˆ๋˜ ๋‚ด์šฉ๋“ค์ด์ง€๋งŒ, ์ด ๊ธ€์˜ ์ฃผ์š” ๋‚ด์šฉ์€ ์•„๋‹ˆ๋‹ˆ ์ƒ๋žตํ• ๊ฒŒ์š”.

 

 

Idle, Move ์• ๋‹ˆ๋ฉ”์ด์…˜ ์˜ต์…˜ ์„ค์ •

 

Idle ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ Move ์• ๋‹ˆ๋ฉ”์ด์…˜ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Root Transform Rotation, Root Transform Position(Y), Root Transform Position(XZ)์„ ์„ค์ •ํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ์˜ํ•ด ์บ๋ฆญํ„ฐ์˜ ํŠธ๋žœ์Šคํผ์ด ์˜ํ–ฅ์„ ๋ฐ›์•„ ๋น„์ •์ƒ์ ์ธ ์›€์ง์ž„์„ ์œ ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

Idle ์• ๋‹ˆ๋ฉ”์ด์…˜

 

Move ์• ๋‹ˆ๋ฉ”์ด์…˜

 

 


2. ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

 

์• ๋‹ˆ๋ฉ”์ด์…˜๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์• ๋‹ˆ๋ฉ”์ดํ„ฐ(Animator)๋ฅผ ์ƒ์„ฑํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

 

๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ(Blend Tree) ์ƒ์„ฑํ•˜๊ธฐ

 

๊ธฐ๋ณธ์ ์œผ๋กœ ์บ๋ฆญํ„ฐ๋Š” ์ด๋™์†๋„์— ๋”ฐ๋ผ ์ด๋™ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„๊ฐ€ ์œ ๋™์ ์œผ๋กœ ๋‹ฌ๋ผ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋กค์— ๋น„์œ ํ•ด ๋ณด์ž๋ฉด ์Šฌ๋กœ์šฐ CC๊ธฐ์— ๊ฑธ๋ฆฌ๋ฉด ์ฑ”ํ”ผ์–ธ์ด ๋Š๋ฆฌ๊ฒŒ ๊ฑท๊ณ , ์ด๋™์†๋„๊ฐ€ ๋นจ๋ผ์ง€๊ฒŒ ํ•˜๋Š” ์Šคํ‚ฌ์ด๋‚˜ ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฑ”ํ”ผ์–ธ์ด ๊ทธ๋งŒํผ ๋น ๋ฅด๊ฒŒ ๊ฑท์ฃ .

 

๊ทธ๋ ‡๊ธฐ์— ์ด๋™์†๋„์— ๋”ฐ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„๋ฅผ ์ œ์–ดํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ๋กœ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ €๋Š” "Move"์ด๋ฆ„์„ ์ง€์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

Move Blend Tree

 

๊ทธ๋ฆฌ๊ณ  ์ด๋™์†๋„์— ๋”ฐ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„์— ๊ณฑํ•ด์ค„ Float ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ƒ์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์• ๋‹ˆ๋ฉ”์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜, Velocity

 

์ด์ œ ์ƒ์„ฑํ•œ Move ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด, Velocity ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์— ๋”ฐ๋ผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ ๋‚ด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ๊ฐ ๋ฐฐ์†์„ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์Šคํฌ๋ฆฝํŠธ ์ƒ์—์„œ ์ด๊ฑธ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ง€ ๋ชจ๋ฅด๊ณ , ์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•ด๋„ ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ์— ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Move ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ ์žฌ์ƒ ์†๋„๋กœ ์‚ฌ์šฉํ•œ Velocity ๋งค๊ฐœ๋ณ€์ˆ˜

 

๊ทธ๋ฆฌ๊ณ  Move ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ ๋‚ด๋ถ€๋กœ ๋“ค์–ด์™€์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธํŒ…ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

Velocity ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 0์ด๋ฉด Idle ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๊ณ , 1 ์ด์ƒ์ด๋ฉด Move ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์žฌ์ƒํ•˜๋„๋ก ํ•œ ๊ฒƒ์ด์ฃ .

์ฆ‰, Velocity ๋ณ€์ˆ˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ„ ์ „ํ™˜, ์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋ธ”๋ Œ๋“œ ํŠธ๋ฆฌ ๊ตฌ์„ฑ์€ ์™„๋ฃŒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ ์˜ค๋ธŒ์ ํŠธ์— ์• ๋‹ˆ๋ฉ”์ดํ„ฐ(Animator) ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์œ„์—์„œ ๋งŒ๋“ค์—ˆ๋˜ ์• ๋‹ˆ๋ฉ”์ดํ„ฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

 

 

 


3. ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

๋ฌธ์ œ์ ์ด ์žˆ์ง€๋งŒ ์ผ๋‹จ ๊ตฌํ˜„ํ•œ ๋ฒ„์ „

 

์ด์ œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์• ๋‹ˆ๋ฉ”์ดํ„ฐ ์ปดํฌ๋„ŒํŠธ ์ฐธ์กฐ๋ฅผ ์–ป์–ด, Velocity ์• ๋‹ˆ๋ฉ”์ดํ„ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜์—ฌ ์žฌ์ƒํ•˜๋„๋ก ํ•ด๋ด…์‹œ๋‹ค. ์ผ๋‹จ์€ ๋ฐœ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹ฑํฌ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

public class PlayerController : MonoBehaviour
{
    protected Animator animator;
    protected const float DEFAULT_CONVERT_MOVESPEED = 3f;
    protected const float DEFAULT_ANIMATION_PLAYSPEED = 0.9f;
    ...

   protected void Move()
    {
        float currentMoveSpeed = player.MoveSpeed * CONVERT_UNIT_VALUE;
        float animationPlaySpeed = (direction == Vector3.zero) ? 0f : 1f:

        LookAt();
        rigidBody.velocity = direction * currentMoveSpeed + Vector3.up * rigidBody.velocity.y;
        animator.SetFloat("Velocity", animationPlaySpeed);
    }

 

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•  ๊ฒ๋‹ˆ๋‹ค.

 

๋ฌผ๋ก  ์ด๊ฑด ์ œ๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„์— ์ฐ์€ ๊ฒƒ์ด๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ํ•œ๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์œผ๋กœ ๋‹จ๋ฒˆ์— ์•Œ์•„์ฐจ๋ฆฌ์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๋ณด์ฃ .

 

 

 

๋ฐ”๋‹ฅ์— ๊ทธ๋ฆฌ๋“œ(Grid) ํ…์Šค์ณ ์ž…ํžˆ๊ธฐ

 

๋ˆˆ์น˜์ฑ„์‹  ๋ถ„๋“ค๋„ ๊ณ„์‹œ๊ฒ ์ง€๋งŒ, ๋ฐ”๋‹ฅ ํ…์Šค์ณ๊ฐ€ ๊ทธ๋ฆฌ๋“œ(Grid)๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœ ๋ฌด์ง€์ƒ‰ ํ…์Šค์ณ๋กœ๋Š” ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฐœ์ด ๋ฏธ๋„๋Ÿฌ์ง€๋“ฏ ์ด๋™ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ๊ฐ€ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ด ์•„์ด๋””์–ด๋Š” ๐Ÿ”—์ด ์˜์ƒ์„ ๋ณด๊ณ  ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹ฑํฌ๋ฅผ ๋งž์ถœ ๋•Œ๋งŒ ์ž ๊น ์‚ฌ์šฉํ•  ์šฉ๋„์ด๊ธฐ์— ๊ตฌ๊ธ€์—์„œ ์ฐพ์€ ๐Ÿ”—๊ทธ๋ฆฌ๋“œ ํ…์Šค์ณ๋ฅผ Unity๋กœ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

 

 

Unity๋กœ ๊ฐ€์ ธ์˜จ ํ›„, ์ƒˆ Material์„ ์ƒ์„ฑํ•˜์—ฌ Albedo ํ”„๋กœํผํ‹ฐ์— ๊ฐ€์ ธ์˜จ ํ…์Šค์ณ๋ฅผ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ํ…์Šค์ณ๊ฐ€ ์ž…ํ˜€์ง„ Material์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋‹ฅ ์˜ค๋ธŒ์ ํŠธ Mesh Renderer์˜ Materials ํ”„๋กœํผํ‹ฐ์— ์œ„์—์„œ ๋งŒ๋“  Material์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์บ๋ฆญํ„ฐ๊ฐ€ ๊ทธ๋ฆฌ๋“œ ๋ฌด๋Šฌ ํ•œ ์นธ์— ๋”ฑ ๋“ค์–ด๊ฐ€๋„๋ก Material์˜ Tililing ํ”„๋กœํผํ‹ฐ X์™€ Y๊ฐ’์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ € ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” X = 2.5, Y = 3์œผ๋กœ ํ•˜๋‹ˆ ๋”ฑ ์บ๋ฆญํ„ฐ๊ฐ€ ํ•œ ์นธ ์•ˆ์— ๋“ค์–ด๊ฐ€๋”๋ผ๊ตฌ์š”.

 

๊ธฐ๋ณธ ๋ฒ„์ „ (X:1, Y:1)

 

์ˆ˜์ •ํ•œ ๋ฒ„์ „ (X:2.5, Y:3)

 

์ด์ œ ์บ๋ฆญํ„ฐ๋ฅผ ์›€์ง์—ฌ๋ณด๋ฉฐ, ๊ฐ ์ด๋™์†๋„ ๋•Œ๋งˆ๋‹ค ์ ์ ˆํ•œ ์žฌ์ƒ ๋ฐฐ์œจ์„ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฏธ๋„๋Ÿฌ์ง€๋“ฏ ์›€์ง์ด๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„๋ฅผ ์ข€ ๋” ๋†’์—ฌ์ฃผ๋ฉด ๋˜๊ฒ ์ฃ . ์ € ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋‹ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์น˜๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋„ค์š”.

 

๊ธฐํš์„œ ์ƒ ๊ธฐ๋ณธ ์ด๋™์†๋„ 300 -> Unity ๋‚ด์—์„œ ๋ณ€ํ™˜๋œ ์ด๋™์†๋„ 3.0

 

 

 

์ด๋™์†๋„์— ๋”ฐ๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ์†๋„ ์‹ฑํฌ ๋งž์ถ”๊ธฐ

 

์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๊ณ ๋‚œ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ผ์ • ๊ตฌ๊ฐ„๋งˆ๋‹ค ๊ฐ’์„ ๋‚˜๋ˆ„์–ด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ž๋‹ˆ ๋„ˆ๋ฌด ํ•˜๋“œ ์ฝ”๋”ฉ์ธ ๊ฒƒ ๊ฐ™์•„ ๊ทธ๋Ÿฌ๊ธฐ๋Š” ์‹ซ์—ˆ์ฃ . ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ, ์œ ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•  ์ง€ ๊ณ ๋ฏผ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋„ค์š”.

์ด๊ฒƒ ์ €๊ฒƒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์–ด๋ณด๋‹ˆ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ณต์‹์ฒ˜๋Ÿผ ์ ์šฉํ•˜์—ฌ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž˜ ์‹ฑํฌ๊ฐ€ ๋งž๋”๋ผ๊ตฌ์š”.

 

 

์ด๋™์†๋„์— ๋”ฐ๋ผ ์•Œ๋งž์€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ๋ฐฐ์œจ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

protected const float DEFAULT_CONVERT_MOVESPEED = 3f;
protected const float DEFAULT_ANIMATION_PLAYSPEED = 0.9f;

protected float GetAnimationSyncWithMovement(float changedMoveSpeed)
{
    if (direction == Vector3.zero)
    {
        return -DEFAULT_ANIMATION_PLAYSPEED;
    }

    // (๋ฐ”๋€ ์ด๋™ ์†๋„ - ๊ธฐ๋ณธ ์ด๋™์†๋„) * 0.1f
    return (changedMoveSpeed - DEFAULT_CONVERT_MOVESPEED) * 0.1f;
}

 

๊ทธ๋ฆฌ๊ณ  Move()์—์„œ ์œ„ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์„ ๋ฐ›์•„์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

protected void Move()
{
    float currentMoveSpeed = player.MoveSpeed * CONVERT_UNIT_VALUE;
    float animationPlaySpeed = DEFAULT_ANIMATION_PLAYSPEED +
                               GetAnimationSyncWithMovement(currentMoveSpeed);

    LookAt();
    rigidBody.velocity = direction * currentMoveSpeed + Vector3.up * rigidBody.velocity.y;
    animator.SetFloat("Velocity", animationPlaySpeed);
}

 

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ด์˜๊ฒŒ ๋”ฑ ๋–จ์–ด์ง€๋‹ˆ, ์ •๋ง ๊ธฐ๋ถ„์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

 

 

 


4. ๋งˆ๋ฌด๋ฆฌ ํ…Œ์ŠคํŠธ

 

ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋‹ˆ ์ •๋ง ๊ธฐ๋ถ„์ด ์ข‹๋„ค์š”. ๋ณ„ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค ๊ฑด๋“œ๋ฆด ํ•„์š”์—†์ด, ์ด๋™์†๋„๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ์•Œ์•„์„œ ์ž๋™์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์žฌ์ƒ ๋ฐฐ์œจ ์‹ฑํฌ ์กฐ์ ˆ๊นŒ์ง€ ๋˜๋‹ˆ๊นŒ์š”. 

 

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ์˜ค๋Š˜ ํ•˜๋ฃจ์ข…์ผ ํ•ด๊ฒฐํ•œ ๋ฒ„๊ทธ๋“ค์„ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ์‚ฌ๋กœ(Slope)์—์„œ ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ํ•˜๋ฃจ์ข…์ผ ์ˆ˜์ •ํ–ˆ๊ฑฐ๋“ ์š”... ์ด์ „ ๊ธ€์—์„œ ์ œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„๋„ ๋‹ค์Œ ๊ธ€์—์„œ ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

rigidBody.velocity = direction * currentMoveSpeed + Vector3.up * rigidBody.velocity.y;

 

์˜ค๋Š˜๋„ ๊ธ€์ด ๊ธธ์–ด์กŒ๋„ค์š”. ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

 

728x90
๋ฐ˜์‘ํ˜•