๐Ÿ’ป My Work/๐ŸŽฎ Unity

[์œ ๋‹ˆํ‹ฐ] 2D ์  ๋ชฌ์Šคํ„ฐ AI ๊ตฌํ˜„ํ•˜๊ธฐ - ๋งต ๋Œ์•„๋‹ค๋‹ˆ๊ธฐ

Jaeseo Kim 2023. 1. 10. 21:26

์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค!

 

[Unity2D] ์  ๋ชฌ์Šคํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ

[์œ ๋‹ˆํ‹ฐ ๊ธฐ์ดˆ - B18] ๋ชฌ์Šคํ„ฐ AI ๊ตฌํ˜„ํ•˜๊ธฐ [์œ ๋‹ˆํ‹ฐ ๊ธฐ์ดˆ - B19] ํ”Œ๋ ˆ์ด์–ด ํ”ผ๊ฒฉ ์ด๋ฒคํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ ์˜์ƒ์„ ๋ณด๊ณ  ์“ฐ์—ฌ์ง„ ๊ฒŒ์‹œ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ๋“œ๋””์–ด ๋ชฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ตฌํ˜„์„ ํ•œ๋ฒˆ ํ•ด๋ณด๋„๋ก ํ• ํƒ ๋ฐ

iagreebut.tistory.com

 

๋ชฌ์Šคํ„ฐ AI ๊ตฌํ˜„ํ•˜๊ธฐ 

1) ์ค€๋น„

์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ์„ ๋„ฃ์€ ๋ชฌ์Šคํ„ฐ๋ฅผ ์ค€๋น„ํ•ด์ค๋‹ˆ๋‹ค.

 

[์œ ๋‹ˆํ‹ฐ] 2D๋„ํŠธ ์บ๋ฆญํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜

Box Collider 2D ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์ค๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ๋ฅผ ์ ์šฉ ์‹œ์ผœ์•ผ ํ•˜๋ฏ€๋กœ (์ค‘๋ ฅ ๋ฐ›๊ธฐ ์œ„ํ•จ) ์บ๋ฆญํ„ฐ์— rigid body 2D๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ƒ์ž

avoc-o-d.tistory.com

 

2) ๋ชฌ์Šคํ„ฐ ๊ธฐ๋ณธ ์ด๋™

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑ ํ›„, Monster์— ์ ์šฉ

 

์†๋ ฅ์„ ์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ Rigidbody2D๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  

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

    Rigidbody2D rigid;

    private void Awake() {
        rigid = GetComponent<Rigidbody2D>();
    }

    void FixedUpdate()
    {
       rigid.velocity = new Vector2(-1, rigid.velocity.y); // ์™ผ์ชฝ์œผ๋กœ๋งŒ ์ด๋™  
    }

 

3) ํ–‰๋™ ์„ค์ • (์ธ๊ณต์ง€๋Šฅ ๋ถ€์—ฌ)

์ ์€ ํ•œ ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๊ฐ€๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,

์Šค์Šค๋กœ ํŠน์ • ๊ตฌ๊ฐ„์„ ๋ฐฐํšŒํ•˜๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ์‰ฌ๋Š” ๋“ฑ์˜ ํ–‰์œ„๋ฅผ ํ•˜๋„๋ก ํ–‰๋™์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๊ธฐํš ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์„œ ๋ชฌ์Šคํ„ฐ๊ฐ€ ์–ด๋–ค ํ–‰๋™์„, ์–ด๋–ค ํƒ€์ด๋ฐ์— ํ•  ์ง€, ์–ด๋–ค ๊ตฌ๊ฐ„์„ ๋Œ์•„๋‹ค๋‹์ง€์— ๋Œ€ํ•˜์—ฌ ๊ธฐํš์„ ํ•ด์ฃผ์„ธ์š”!

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์˜ค๋ฅธ์ชฝ ์ด๋™ / ์™ผ์ชฝ ์ด๋™ / ๋ฉˆ์ถค ์œผ๋กœ ์„ค์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋žœ๋ค ํ•จ์ˆ˜(Random.Range(min,max))๋ฅผ ์ด์šฉํ•ด -1 / 0 / 1 ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑ ํ›„,

์ด๋ฅผ Vector2์˜ x๊ฐ’์œผ๋กœ ๋ถ€์—ฌํ•ด์„œ ๊ฐ๊ฐ -1: ์™ผ์ชฝ, 0: ์ •์ง€, 1: ์˜ค๋ฅธ์ชฝ ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

// min <= ๋‚œ์ˆ˜ < max
Random.Range(min, max);

// ๋”œ๋ ˆ์ด๋ฅผ ๋„ฃ์€ ์žฌ๊ท€ ํ˜ธ์ถœ
Invoke("ํ•จ์ˆ˜ ์ด๋ฆ„", delay sec);

 

๐Ÿ“Œ Think() ์•„๋ž˜ ์ฝ”๋“œ ๊ฒฐ๊ณผ, 5์ดˆ์— ํ•œ ๋ฒˆ์”ฉ ์–ด๋А ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ง€ ์ •ํ•˜์—ฌ ์›€์ง์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ Update ๋Œ€์‹ , FixedUpdate๋ฅผ ์“ฐ๋Š” ์ด์œ !
๋ฌผ๋ฆฌ ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋œ(Rigidbody) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์กฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
Update๋Š” ๋ถˆ๊ทœ์น™ํ•œ ํ˜ธ์ถœ์ž„์œผ๋กœ ๋ฌผ๋ฆฌ์—”์ง„ ์ถฉ๋Œ๊ฒ€์‚ฌ ๋“ฑ์ด ์ œ๋Œ€๋กœ ์•ˆ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterMove : MonoBehaviour
{
    Rigidbody2D rigid;
    public int nextMove; // ๋‹ค์Œ ํ–‰๋™ ์ง€ํ‘œ

    private void Awake() {
        rigid = GetComponent<Rigidbody2D>();
        Invoke("Think", 5); // ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค(์ตœ์ดˆ 1ํšŒ) nextMove๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก ํ•จ
    }

    void FixedUpdate()
    {
       rigid.velocity = new Vector2(nextMove,rigid.velocity.y); // nextMove ์™ผ์ชฝ(-1) | ๋ฉˆ์ถค(0) | ์˜ค๋ฅธ์ชฝ(1) ์œผ๋กœ ์ด๋™ 
    }

	// ๋ชฌ์Šคํ„ฐ๊ฐ€ ์Šค์Šค๋กœ ํŒ๋‹จ
    void Think(){
    	nextMove = Random.Range(-1, 2); // (์™ผ์ชฝ ์ด๋™(-1) | ๋ฉˆ์ถค(0) | ์˜ค๋ฅธ์ชฝ ์ด๋™(1) ์œผ๋กœ 3๊ฐ€์ง€ ํ–‰๋™ ํŒ๋‹จ)
        Invoke("Think", 5); // 5์ดˆ์˜ ๋”œ๋ ˆ์ด๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์žฌ์‹คํ–‰ 
    }
}

๐Ÿค”๊ทธ๋ ‡์ง€๋งŒ,,, ์ด๋Œ€๋กœ๋ฉด 5์ดˆ๊ฐ€ ์ง€๋‚œ ์ดํ›„์—๋„ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์ด๋™ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, ๊ฒฐ๊ตญ.. ๋งต ๋ฐ–์œผ๋กœ ํƒˆ์ถœํ•ด๋ฒ„๋ฆฌ๋Š” ์ˆ˜๊ฐ€ ์žˆ์œผ๋‹ˆ ์ด๋ฅผ ๋ง‰์•„์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค...

 

4) ์ง€๋Šฅ ๋†’์ด๊ธฐ

RayHit๋ฅผ ์ด๋™ํ•˜์—ฌ ์ž์‹ ์˜ ์•ž์ด ๋‚ญ๋– ๋Ÿฌ์ง€์ธ์ง€ ์ฒดํฌํ•œ ํ›„, ๋‚ญ๋– ๋Ÿฌ์ง€๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๋„๋ก ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค.

!!!๋‚ญ๋– ๋Ÿฌ์ง€๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฐ˜๋Œ€ํŽธ์œผ๋กœ ๋’ค๋Œ ์ˆ˜ ์žˆ๋„๋ก!!! ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค ์ธก์ •ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ์ง€ํ˜• layer๋ฅผ Platform์œผ๋กœ ์„ค์ •

์บ๋ฆญํ„ฐ ์•ž์œผ๋กœ ray๋ฅผ ์˜๋ฉฐ, ์˜๊ณ  ์žˆ๋Š” ๊ณณ์ด ์ง€ํ˜•์ธ์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

LayerMask.GetMask("Platform") ๋ฅผ ํ†ตํ•ด layer๊ฐ€ Platform์ธ ์ง€ํ˜•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.

void FixedUpdate()
{
     // nextMove ์™ผ์ชฝ(-1) | ๋ฉˆ์ถค(0) | ์˜ค๋ฅธ์ชฝ(1) ์œผ๋กœ ์ด๋™ 
	rigid.velocity = new Vector2(nextMove, rigid.velocity.y);

   // ์ž์‹ ์˜ ํ•œ ์นธ ์•ž ์ง€ํ˜•์„ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด, position.x + nextMove (-1, 1, 0 ์ด๋ฏ€๋กœ ์ ์ ˆํ•จ)
    Vector2 frontVec = new Vector2(rigid.position.x + nextMove, rigid.position.y);

    // ํ•œ์นธ ์•ž ๋ถ€๋ถ„์•„๋ž˜ ์ชฝ์œผ๋กœ ray๋ฅผ ์จ
    Debug.DrawRay(frontVec, Vector3.down, new Color(0,1,0));

    // ๋ ˆ์ด๋ฅผ ์ด์„œ ๋งž์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํƒ์ง€ 
    RaycastHit2D raycast = Physics2D.Raycast(frontVec, Vector3.down,1,LayerMask.GetMask("Platform"));

    // ํƒ์ง€๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ null : ๊ทธ ์•ž์— ์ง€ํ˜•์ด ์—†์Œ => ๋’ค๋Œ๋„๋ก
    if(raycast.collider == null){
            nextMove = nextMove * (-1); // ์ง์ ‘ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์œผ๋‹ˆ Think๋Š” ์ž ์‹œ ๋ฉˆ์ถ”์–ด์•ผ ํ•จ
            CancelInvoke(); // think๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ˜ ํ›„ ์žฌ์‹คํ–‰
            Invoke("Think", 5);
    }

}

 

๐Ÿ“ ๋‚ญ๋– ๋Ÿฌ์ง€ ํƒ์ง€ ๊ฑฐ๋ฆฌ ์ค„์ด๊ธฐ

ray๊ฐ€ 1์นธ ์•ž์„ ๋‚ด๋‹ค๋ณด๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋ฉ€๋‹ค๋ฉด, 0.4์ •๋„ ์•ž์„ ํƒ์ง€ํ•˜๋„๋ก ์ ์ ˆํ•œ ์ˆ˜๋ฅผ ๊ณฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Vector2 frontVec = new Vector2(rigid.position.x + nextMove * 0.4f, rigid.position.y);

 

๐Ÿ“ ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ

5์ดˆ ๋งˆ๋‹ค ์ƒ๊ฐํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„๋„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌํ•˜๋ฉด ๋”์šฑ ๋” ๋˜‘๋˜‘ํ•ด๋ณด์ด๋Š” ์ธ๊ณต์ง€๋Šฅ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!!

    void Think(){
    ...
    
        float time = Random.Range(2f, 5f); //์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 
        Invoke("Think", time); //๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ time์ดˆ์˜ ๋”œ๋ ˆ์ด๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์žฌ์‹คํ–‰ 
    }

 

 

 

์ „์ฒด ์ฝ”๋“œ

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterTest : MonoBehaviour
{
    Rigidbody2D rigid;

    public int nextMove; //๋‹ค์Œ ํ–‰๋™์ง€ํ‘œ๋ฅผ ๊ฒฐ์ •ํ•  ๋ณ€์ˆ˜

    float time; // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 

    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();

        // ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ๊ฐ
        Invoke("Think", 1f);
    }

    void Update()
    {
        rigid.velocity = new Vector2(nextMove, rigid.velocity.y); // nextMove ๋ฉˆ์ถค(0), ์™ผ์ชฝ(-1), ์˜ค๋ฅธ์ชฝ(1)์œผ๋กœ ์ด๋™ 

        // ๋‚ญ๋– ๋Ÿฌ์ง€ ์ œ์–ด
        Vector2 frontVec = new Vector2(rigid.position.x + nextMove, rigid.position.y); // ์•ž์„ ์ฒดํฌ
        Debug.DrawRay(frontVec, Vector3.down, new Color(0, 1, 0)); // ๋น” ์‹œ์ž‘ ์œ„์น˜, ์˜๋Š” ๋ฐฉํ–ฅ, ์ƒ‰๊น”
        RaycastHit2D rayHit = Physics2D.Raycast(frontVec, Vector3.down, 1, LayerMask.GetMask("Platform")); // Platform Layer์— ๋น” ์˜๊ธฐ

        if (rayHit.collider == null) // ๊ฐˆ ๊ณณ์ด ์—†๋‹ค๋ฉด
        {
            nextMove = nextMove * (-1); // ์ง์ ‘ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์œผ๋‹ˆ Think๋Š” ์ž ์‹œ ๋ฉˆ์ถ”์–ด์•ผ ํ•จ
            CancelInvoke(); // think๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ˜ ํ›„ ์žฌ์‹คํ–‰
            time = Random.Range(2f, 5f); // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 
            Invoke("Think", time);
        }
    }

    void Think()
    {
        // ๋ชฌ์Šคํ„ฐ๊ฐ€ ์Šค์Šค๋กœ ์ƒ๊ฐํ•ด์„œ ํŒ๋‹จ (์™ผ์ชฝ(-1), ์˜ค๋ฅธ์ชฝ(1), ๋ฉˆ์ถค(0) ์œผ๋กœ 3๊ฐ€์ง€ ํ–‰๋™์„ ํŒ๋‹จ)
        nextMove = Random.Range(-1, 2);
        time = Random.Range(2f, 5f); // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 
        Invoke("Think", time); // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ time์ดˆ์˜ ๋”œ๋ ˆ์ด๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์žฌ์‹คํ–‰
    }

}

 

 

์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterTest : MonoBehaviour
{
    Rigidbody2D rigid;

    public int nextMove;    //๋‹ค์Œ ํ–‰๋™์ง€ํ‘œ๋ฅผ ๊ฒฐ์ •ํ•  ๋ณ€์ˆ˜

    float time;             // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 

    Animator animator;      // ์• ๋‹ˆ๋ฉ”์ด์…˜

    void Start()
    {
        rigid = GetComponent<Rigidbody2D>();

        // ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ๊ฐ
        Invoke("Think", 1f);

        animator = GetComponent<Animator>();
    }

    void Update()
    {
        rigid.velocity = new Vector2(nextMove, rigid.velocity.y); // nextMove ๋ฉˆ์ถค(0), ์™ผ์ชฝ(-1), ์˜ค๋ฅธ์ชฝ(1)์œผ๋กœ ์ด๋™ 

        // ๋‚ญ๋– ๋Ÿฌ์ง€ ์ œ์–ด
        Vector2 frontVec = new Vector2(rigid.position.x + nextMove, rigid.position.y); // ์•ž์„ ์ฒดํฌ
        Debug.DrawRay(frontVec, Vector3.down, new Color(0, 1, 0)); // ๋น” ์‹œ์ž‘ ์œ„์น˜, ์˜๋Š” ๋ฐฉํ–ฅ, ์ƒ‰๊น”
        RaycastHit2D rayHit = Physics2D.Raycast(frontVec, Vector3.down, 1, LayerMask.GetMask("Platform")); // Platform Layer์— ๋น” ์˜๊ธฐ

        if (rayHit.collider == null) // ๊ฐˆ ๊ณณ์ด ์—†๋‹ค๋ฉด
        {
            nextMove = nextMove * (-1); // ์ง์ ‘ ๋ฐฉํ–ฅ์„ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์œผ๋‹ˆ Think๋Š” ์ž ์‹œ ๋ฉˆ์ถ”์–ด์•ผ ํ•จ
            CancelInvoke(); // think๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ˜ ํ›„ ์žฌ์‹คํ–‰
            time = Random.Range(2f, 5f); // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 
            Invoke("Think", time);
        }
    }

    void Think()
    {
        // ๋ชฌ์Šคํ„ฐ๊ฐ€ ์Šค์Šค๋กœ ์ƒ๊ฐํ•ด์„œ ํŒ๋‹จ (์™ผ์ชฝ(-1), ์˜ค๋ฅธ์ชฝ(1), ๋ฉˆ์ถค(0) ์œผ๋กœ 3๊ฐ€์ง€ ํ–‰๋™์„ ํŒ๋‹จ)
        nextMove = Random.Range(-1, 2);
        
        // ์• ๋‹ˆ๋ฉ”์ด์…˜
        animator.SetFloat("DirX", nextMove);
        animator.SetBool("IsWalk", nextMove == 0 ? false : true);

        time = Random.Range(2f, 5f); // ์ƒ๊ฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๋žœ๋ค์œผ๋กœ ๋ถ€์—ฌ 
        Invoke("Think", time); // ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ time์ดˆ์˜ ๋”œ๋ ˆ์ด๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ์žฌ์‹คํ–‰
    }

}