Unity 간단한 적 AI 제작

2024. 12. 23. 03:41Unity

Unity 간단한 적 AI 제작

게임 개발에서 적 AI는 플레이어의 도전 의식을 자극하고 몰입감을 더하는 중요한 요소입니다. 이번 포스팅에서는 Unity를 활용해 간단한 적 AI를 제작하는 방법을 소개합니다.


1. 적 AI의 기본 개념

적 AI는 게임 내에서 플레이어와 상호작용하는 캐릭터입니다.

  • 추적(Chase): 플레이어를 따라감.
  • 공격(Attack): 일정 거리 내에서 공격 행동.
  • 순찰(Patrol): 특정 경로를 따라 이동.

2. 기본 설정

1) 프로젝트 환경 준비

  1. 3D Unity 프로젝트를 생성합니다.
  2. Plane을 생성하고 게임 씬의 바닥 역할을 하도록 설정합니다.
  3. 적 역할을 할 Cube 또는 3D 모델을 추가합니다.
  4. 플레이어 역할의 Capsule 또는 다른 오브젝트를 추가합니다.

2) NavMesh 활성화

  1. Window > AI > Navigation을 클릭하여 Navigation 창을 엽니다.
  2. Plane을 선택하고 Navigation 창에서 Bake를 클릭하여 NavMesh를 생성합니다.
  3. 적 오브젝트에 NavMesh Agent 컴포넌트를 추가합니다.

3. 스크립트로 적 AI 구현

1) 적 추적 기능 구현

플레이어를 따라가는 기본 추적 AI를 작성합니다.

using UnityEngine;
using UnityEngine.AI;

public class EnemyAI : MonoBehaviour
{
    public Transform player; // 플레이어 위치
    private NavMeshAgent agent;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        if (player != null)
        {
            agent.SetDestination(player.position); // 플레이어를 목표로 설정
        }
    }
}
  • NavMeshAgent가 플레이어의 위치를 따라 경로를 계산합니다.

2) 공격 기능 추가

플레이어와 적 사이의 거리를 계산하여 공격을 수행합니다.

public float attackRange = 2f; // 공격 범위
public float attackCooldown = 1f; // 공격 간격
private float lastAttackTime = 0;

void Update()
{
    float distance = Vector3.Distance(transform.position, player.position);

    if (distance <= attackRange && Time.time >= lastAttackTime + attackCooldown)
    {
        AttackPlayer();
        lastAttackTime = Time.time;
    }
    else
    {
        agent.SetDestination(player.position);
    }
}

void AttackPlayer()
{
    Debug.Log("공격!");
    // 여기에서 플레이어에게 데미지를 줄 수 있습니다.
}

 


4. 순찰(Patrol) 기능 구현

1) 순찰 지점 설정

여러 순찰 지점을 순서대로 이동하는 기능을 추가합니다.

public Transform[] patrolPoints; // 순찰 지점 배열
private int currentPatrolIndex = 0;

void Patrol()
{
    if (patrolPoints.Length == 0) return;

    agent.SetDestination(patrolPoints[currentPatrolIndex].position);

    if (!agent.pathPending && agent.remainingDistance < 0.5f)
    {
        currentPatrolIndex = (currentPatrolIndex + 1) % patrolPoints.Length;
    }
}

2) 순찰과 추적의 전환

플레이어가 감지되면 추적, 그렇지 않으면 순찰하도록 구현합니다.

public float detectionRange = 10f; // 플레이어 감지 범위

void Update()
{
    float distance = Vector3.Distance(transform.position, player.position);

    if (distance <= detectionRange)
    {
        agent.SetDestination(player.position); // 추적
    }
    else
    {
        Patrol(); // 순찰
    }
}

 


5. 적 AI의 시각적 표현

1) 적 행동 상태에 따른 색상 변경

적 AI의 상태를 시각적으로 표시할 수 있습니다.

private Renderer enemyRenderer;

void Start()
{
    enemyRenderer = GetComponent<Renderer>();
}

void Update()
{
    float distance = Vector3.Distance(transform.position, player.position);

    if (distance <= detectionRange)
    {
        enemyRenderer.material.color = Color.red; // 추적 중
    }
    else
    {
        enemyRenderer.material.color = Color.green; // 순찰 중
    }
}

 


6. 최적화 팁

  1. Trigger 활용
    • 플레이어와 적 사이의 충돌 영역을 ColliderTrigger로 처리해 경로 계산을 최소화합니다.
  2. NavMesh Agent 설정
    • Stopping DistanceSpeed를 상황에 맞게 조정해 부드러운 이동을 구현합니다.
  3. 오브젝트 풀링
    • 많은 적을 생성할 경우 오브젝트 풀링 기법을 사용해 성능을 개선합니다.

7. 요약

이번 포스팅에서는 간단한 적 AI를 구현해 보았습니다.

  • NavMesh를 활용한 경로 찾기.
  • 추적, 공격, 순찰 기능 구현.
  • 플레이어 감지 및 상태 전환.