[Unity] Player ๋ฐฉํ–ฅํ‚ค๋กœ ์›€์ง์ด๊ธฐ / Animation ์„ค์ •
๐ŸŽฎ Unity

[Unity] Player ๋ฐฉํ–ฅํ‚ค๋กœ ์›€์ง์ด๊ธฐ / Animation ์„ค์ •

Unity๋ฅผ ์ตํžˆ๋Š” ์ „๊ณต ์ˆ˜์—…์ธ 3D์Šคํฌ๋ฆฝํŠธํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ์ง„ํ–‰ํ•œ

KATNIP - Astro Cat์—์„œ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

Unity๋ฅผ ๋˜ ์–ธ์ œ ์“ธ์ง€๋Š” ๋ชจ๋ฅด์ง€๋งŒ ๊นŒ๋จน๊ธฐ์—๋Š” ์•„๊นŒ์šด ํ”„๋กœ์ ํŠธ์ด๋‹ค.

๊ฒŒ์ž„์˜ ๊ธฐ๋ณธ์ธ ํ”Œ๋ ˆ์ด์–ด์˜ ์กฐ์ž‘๋ฒ•์„ ๊ตฌํ˜„ํ•˜๊ฒ ๋‹ค.

๋ฐฉํ–ฅํ‚ค๋กœ ์›€์ง์ด๊ณ , ์ŠคํŽ˜์ด์Šค ๋ฐ”๋ฅผ ๋ˆ„๋ฅด๋ฉด Jumpํ•˜๋Š” Player๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ!

 

Player์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ปจํŠธ๋กคํ•˜๊ธฐ ์œ„ํ•ด Animator Controller๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

Unity Asset์„ ๊ตฌ๋งคํ•˜๋ฉด, ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋“ค์–ด์žˆ์„ ํ…๋ฐ ๊ทธ ์ค‘ ์‚ฌ์šฉํ•  ์• ๋‹ˆ๋ฉ”์ด์…˜๋งŒ ๋ณต๋ถ™ํ•ด์„œ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

Walk ์• ๋‹ˆ๋ฉ”์ด์…˜์€ isWalk ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ,

Jump ์• ๋‹ˆ๋ฉ”์ด์…˜์€ doJump ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

๊ธฐ๋ณธ ๋ชจ์…˜์ธ idleA ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Entry์™€ ์ด์–ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด Player์—๊ฒŒ ์•„๋ฌด๋Ÿฐ ๋ช…๋ น์„ ๋‚ด๋ฆฌ์ง€ ์•Š์„ ์‹œ์— ๊ณ„์† idleA ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ทจํ•œ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ „ํ™˜ ํ™”์‚ดํ‘œ๋ฅผ ๋ˆŒ๋Ÿฌ์ค€๋‹ค.

 

Setting์€ Has Exit Time์„ ํ•ด์ œํ•˜๊ณ  ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์ค€๋‹ค.

๋นจ๋ฆฌ๋นจ๋ฆฌ ์ „ํ™˜๋˜๋Š”๊ฒŒ ์ข‹์œผ๋‹ˆ Transition Duration๋„ 0์œผ๋กœ ์„ค์ •!

 

์ด๋Ÿฐ ์‹์œผ๋กœ Condition๋„ bool์ด๋ฉด true/false์— ๋งž์ถฐ ์„ค์ •ํ•ด์ฃผ๊ณ ,

Trigger๋ผ๋ฉด Condition์— ์ถ”๊ฐ€๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

์ด ๋•Œ bool๊ณผ trigger์˜ ์ฐจ์ด๊ฐ€ ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด?

 

→ Trigger๋Š” ํ•œ๋ฒˆ true๊ฐ€ ๋˜๋ฉด ํ•ด๋‹น ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ข…๋ฃŒ ํ›„ ๋‹ค์Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋ฐ”๋กœ ์ „ํ™˜๋œ๋‹ค.

Bool์€ ํ•ด๋‹น ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข…๋ฃŒ๋˜์–ด๋„ ๋‹ค์Œ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ „ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. 

๋”ฐ๋ผ์„œ Walk ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Bool์„ ์ด์šฉํ•˜๊ณ  Jump ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Bool์ด ์•„๋‹Œ Trigger๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

์ด์ œ Player ์บ๋ฆญํ„ฐ์— Animator Component๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ์„ค์ •ํ•œ Controller๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

 

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์คฌ๋‹ค๋ฉด ์ด์ œ ์ฝ”๋“œ๋งŒ ์งœ์ฃผ๋ฉด ๋œ๋‹ค.

 

    Animator anim;
    Rigidbody rigid;
    
    float hAxis;
    float vAxis;
    bool jDown;
    bool isJump = false;
    
    Vector3 moveVec;
        
    private void Awake()
    {
    	rigid = GetComponent<Rigidbody>();
        anim = GetComponentInChildren<Animator>(); 
    }
    
    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
    }

    void GetInput() // ํ‚ค๋ณด๋“œ ๊ฐ’ ๋ฐ›๊ธฐ
    {
        hAxis = Input.GetAxisRaw("Horizontal");
        vAxis = Input.GetAxisRaw("Vertical");
        jDown = Input.GetButton("Jump");
    }

    void Move()
    {
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;
        transform.position += moveVec * speed * Time.deltaTime;
        anim.SetBool("isWalk", moveVec != Vector3.zero); // Walk ์• ๋‹ˆ๋ฉ”์ด์…˜ true
    }

    void Turn()
    {
        transform.LookAt(transform.position + moveVec); // ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํšŒ์ „
    }

    void Jump()
    {
        // Jumpํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์—์„œ Jump ํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€
        if (jDown && !isJump)
        {
            rigid.AddForce(Vector3.up * 5, ForceMode.Impulse);
            anim.SetTrigger("doJump"); // Jump Trigger true ์„ค์ •
            isJump = true; 
        }
    }

 

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์งœ์ค€ ํ›„, Player ์บ๋ฆญํ„ฐ์— ํ•ด๋‹น Script Component๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

๊ฐ€๋” ์ถ”๊ฐ€ํ•ด์ฃผ์ง€๋„ ์•Š๊ณ  ์™œ ์ฝ”๋“œ๊ฐ€ ์•ˆ๋Œ์•„๊ฐ€์ง€..? ๋ผ๊ณ  ์ƒ๊ฐํ•  ๋•Œ๋„ ์žˆ๋‹ค. (ใ€ƒโŒ’โ–ฝโŒ’ใ€ƒ)ใ‚

 

์ž˜ ๊ฑท๊ณ , ์ž˜ ๋›ฐ๋Š” Player๊ฐ€ ์™„์„ฑ๋˜์—ˆ๋‹ค !