본문 바로가기

유니티

유니티 강좌 03. 2D 플레이어 추적 AI 만들기

모든 게임에 적이 있지는 않지만, 대부분의 게임에는 플레이어가 무찌를 수 있는 적이 등장합니다. 하지만 적들은 사람이 직접 조종하는 캐릭터가 아니다 보니 스스로 판단하고 움직이는 AI가 필수적입니다. AI라는 단어를 들으면 어려운 고급 기술이라고 생각하실 수도 있겠지만, 간단하게 플레이어를 따라다니는 정도는 금방 구현할 수 있습니다. 이번 강좌에서는 moveTowards() 함수를 사용해 플레이어를 따라다니고, 일정 거리가 되면 멈추는 간단한 2D 적 AI를 만들어 보도록 하겠습니다.


 

유니티 강좌 01. 기본 인터페이스

유니티는 게임 개발을 조금 더 쉽게 할 수 있도록 도움을 주는 엔진입니다. 3D와 2D 환경의 게임을 모두 개발할 수 있고, C#을 지원하기 때문에 초보자가 쉽게 접근할 수 있습니다. 그리고 유니티

torotoblog.tistory.com

 

유니티 강좌 02. 2D 플레이어 이동

지난 강좌에서 유니티의 기본 인터페이스에 대해서 배웠습니다. 그럼 이제 본격적으로 유니티를 사용해 봐야겠죠. 게임에서 가장 기본적인 요소 중 하나가 바로 플레이어입니다. 그중에서도 제

torotoblog.tistory.com


이번에는 두 개의 오브젝트를 만들었습니다. 하나는 플레이어 오브젝트이고요, 다른 하나는 적 오브젝트입니다. 플레이어 오브젝트는 저번 강좌를 참고하셔서 상하좌우 이동을 구현해 주시면 됩니다. 이번에는 적 오브젝트를 위주로 다루도록 하겠습니다.

플레이어 오브젝트에서 한 가지 설정해 줘야 하는 것이 있습니다. 바로 태그인데요, 태그는 스크립트들에서 오브젝트들을 조금 더 쉽게 찾을 수 있도록 도와주는 역할을 합니다. 이 부분에 대해서는 나중에 코드를 살펴보면서 더 자세히 알아보도록 하고, 지금은 오브젝트 이름 칸 아래에 있는 태그 리스트에서 Player 태그를 선택해서 적용해 줍시다.

이제 본격적으로 적 AI를 만들어 봅시다. 플레이어 이동과 달리 적 오브젝트는 리지드바디를 적용하지 않고 이동을 구현할 것이기 때문에 스크립트 컴포넌트 외에는 따로 적용할 것이 없습니다. EnemyFollow라는 C# 스크립트를 만든 후 적 오브젝트에 적용해 줍시다.

using UnityEngine;

public class EnemyFollow : MonoBehaviour
{
    public float speed;
    public float stopDistance;

    private Transform target;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
    }

    private void Update()
    {
        if (Vector2.Distance(transform.position, target.position) > stopDistance)
        {
            transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
        }
    }
}

전체 코드입니다. 하나씩 살펴보도록 하죠.

public float speed;
public float stopDistance;
private Transform target;

이번에 사용하게 될 변수는 세 가지가 있습니다. 적의 속력 값을 저장하는 speed, 플레이어와 일정 거리가 되면 더 이상 따라가지 않고 멈추게 되는 거리인 stopDistance, 그리고 플레이어의 위치 정보를 담고 있는 target이 있습니다.

private void Start()
{
    target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
}

Start() 함수에는 target 변수에 플레이어 오브젝트를 할당시켜주는 코드가 있습니다. 적이 따라가야 하는 타깃이 누구인지를 알아야 적들이 움직일 수 있겠죠. FindGameObjectWithTag() 함수는 오브젝트 중에서 지정된 태그가 있는 오브젝트를 찾아내는 역할을 합니다. 우리는 "Player" 태그가 달린 오브젝트를 찾아야 하죠. 그리고 GetComponent<>()는 오브젝트에 적용되어 있는 컴포넌트를 가져옵니다. 저희는 플레이어 오브젝트의 포지션 값이 필요하기 때문에 Transform 컴포넌트를 가져 올 겁니다.

private void Update()
{
    if (Vector2.Distance(transform.position, target.position) > stopDistance)
    {
        transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
    }
}

Update() 함수에는 적이 플레이어를 따라가도록 하는 코드들이 있습니다. 우선 if() 문부터 살펴보죠. Vector2.Distance()는 두 벡터 사이의 거리 값을 구해주는 함수입니다. 여기서는 적의 포지션과 플레이어의 포지션 사이의 거리를 구했죠. 만약 이 거리가 stopDistance보다 크다면 다음 줄, 즉 적이 플레이어를 따라다니게 됩니다. 만약 거리가 stopDistance보다 작다면 아무런 행동도 하지 않죠.

MoveTowards() 함수는 지정된 위치로 이동하도록 해주는 함수입니다. 다만 이번에는 적 오브젝트의 위치를 직접적으로 수정하면서 이동하기 때문에 앞에 'transform.position ='이 붙게 됩니다. MoveTowards() 함수를 살펴봅시다. 적의 위치인 target.position, 플레이어의 위치인 target.position, 그리고 이동할 속도인 speed * Time.deltaTime이 매개 변수로 들어가네요.

자, 이제 다시 유니티로 돌아와서 적 오브젝트의 inspector 창을 살펴봅시다. public 변수로 선언한 speed와 stopDistance의 값을 수정할 수 있는데요, 적당한 값을 입력해 줍시다. 저는 각각 8과 3을 넣어 주겠습니다.

이제 모든 준비가 끝났습니다. 유니티 중앙 상단에 있는 플레이 버튼을 클릭해서 테스트를 해보도록 하죠. 플레이어를 움직이면 적이 따라오고, 3 거리 내에 들어오게 되면 적이 더 이상 움직이지 않습니다. 성공이네요!


 

유니티 강좌 04. 2D 랜덤 패트롤 AI

게임에서 적을 만났는데 적이 동상처럼 가만히 서있기만 한다면 어떨까요? 분명 엄청 지루한 게임이 될 것입니다. 또는 적이 어디에 있는지 뻔히 알기 때문에 스테이지를 깨기 매우 쉬워지겠죠.

torotoblog.tistory.com