1 분 소요

몬스터 AI 구현하기


이번에는 몬스터를 추가해볼려고합니다.

몬스터는 가만히 있지 않고 움직이면서 플레이어를 공격합니다.

이번포스팅에서는 간단한 몬스터의 AI를 구현해보겠습니다.

몬스터 애니메이션


먼저 몬스터를 추가해줍니다. 저는 버섯같이 생긴 요녀석을 추가해보려고합니다.

image

애니메이션 추가하는방법은 앞의 포스팅에서 다뤘기때문에 생략하도록 하겠습니다. 저는 기본상태(Idle)과 움직이는상태(Walk) 두가지 애니메이션을 추가했습니다.

이전과 다른점은 파라미터값을 Bool 형태가 아닌 Int형태로 만들었습니다.

  • Idle -> Walk : isWalking(Not equals 0)

  • Walk -> Idle : isWalking(equals 0)

다음 작업들을 수행해줍니다.

  • 몬스터에 CapsuleCollider를 추가합니다.

  • 몬스터에 RigidBody2D를 추가합니다.

  • 몬스터가 뒤집히는것을 막기위해 RigidBody2D - Constraints - Freeze Rotation 체크를 해줍니다.

  • MonsterController.cs 파일을 생성하여 몬스터에 붙여줍니다.

MonsterController.cs

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

public class MonsterController : MonoBehaviour
{

    Rigidbody2D rigid;
    SpriteRenderer renderer;
    Animator anim;

    public int nextMovement;

    private void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
        renderer = GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

        Invoke("NextMove", 3);
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    private void FixedUpdate()
    {
        //Monster Move
        rigid.velocity = new Vector2(nextMovement * 2.0f, rigid.velocity.y);

        //낭떠러지 체크
        Vector2 vec_Front = new Vector2(rigid.position.x + nextMovement * 0.5f, rigid.position.y);
        Debug.DrawRay(vec_Front, Vector3.down, new Color(1, 0, 0));
        RaycastHit2D rayHit = Physics2D.Raycast(vec_Front, Vector3.down, 1, LayerMask.GetMask("Floor"));
        if (rayHit.collider == null)
        {
            //낭떠러지가 있을 때 방향전환
            TurnBack();
        }
    }

    // Update is called once per frame
    void Update()
    {

    }

    //Monster 다음 움직임 결정
    void NextMove()
    {
        //Monster의 움직임은 왼쪽(-1),오른쪽(1),가만히(0)
        nextMovement = Random.Range(-1, 2);

        anim.SetInteger("isWalking", nextMovement);

        //Set Flip
        if(nextMovement != 0)
        {
            renderer.flipX = nextMovement == 1;

        }

        //재귀함수 호출시간
        float nextMoveTime = Random.Range(2f, 4f);
        Invoke("NextMove", nextMoveTime);
    }

    void TurnBack()
    {
        nextMovement *= -1;
        renderer.flipX = nextMovement == 1;

        CancelInvoke();
        Invoke("NextMove", 3);
    }
}

——–코드 설명———

  • Fixed Update()에서 몬스터를 움직입니다.

  • NextMove() 함수는 몬스터의 움직일 방향을 Random함수를 이용하여 랜덤하게 정합니다. 움직임은 왼쪽, 오른쪽, 가만히가 있습니다.

  • NextMove() 함수는 재귀함수 호출을 이용하여 몬스터가 지속적으로 움직이는 방향을 바꿀 수 있도록 하였습니다.

  • Ray를 이용하여 몬스터가 낭떠러지에 봉착했을 때 이를 감지하고 방향을 바꾸도록 했습니다.

  • 낭떠러지에서 방향을 바꿀 때 TurnBack() 함수를 호출하여 방향과 Flip을 바꾸고 실행중이던 Invoke를 취소하고 새로이 Invoke하도록 했습니다.

image

댓글남기기