상세 컨텐츠

본문 제목

유니티 캐릭터 내비게이션 이동 및 공격 기본 세팅

유니티/기능

by MJ_119 2024. 9. 19. 16:48

본문

- AI 내비게이션으로 이동. 기본 공격 로직 코드

 

- 몬스터를 클릭하면 몬스터위치로 이동하지않고 제자리에서 공격하게끔 작성.

 

- 레이캐스트로 검출 해서 이동하고, 검출 못하는 이동할 수 없는 곳( 지형을 벗어난 곳 )은 따로 구분해놓음.

 

- 이 구조는 전투와 이동이 상호 배타적으로 발생해야 하는 경우에 유용합니다.

 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RPG.Combat;

public class PlayerController : MonoBehaviour
{
    void Update()
    {
        // 공격을 할 수 있으면 그 이후 코드를 실행하지 않음.
        if (MouseClickToCombat()) return;

        // 이동할 수 있으면 그 이후 코드를 실행하지 않음.
        if (MouseClickToMove()) return;

        // 공격이나 이동이 모두 불가능하면 "Can't move"라는 메시지 출력.
        print("Can't move");
    }

    private bool MouseClickToCombat()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit[] hits = Physics.RaycastAll(ray);

        foreach (RaycastHit hit in hits)
        {
            // 레이로 검출된 오브젝트들을 하나씩 CombatTarget 컴포넌트가 있는지 확인. 없으면 다음 오브젝트를 검색함. 있으면 아래 코드 진행.
            CombatTarget target = hit.transform.GetComponent<CombatTarget>();
            if (target == null)
            {
                continue;
            }

            // 오브젝트가 CombatTarget컴포넌트가 있으면(= 적 몬스터라면) 아래 코드 실행
            if (Input.GetMouseButtonDown(0))
            {
                GetComponent<Fighter>().Attack();
            }
            return true; // 공격 성공 후 true 반환.
        }
        return false; // CombatTarget을 찾지 못하면 false 반환.
    }

    private bool MouseClickToMove()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        bool hasHit = Physics.Raycast(ray, out hit);
        if (hasHit)
        {
            // 마우스 왼쪽 버튼을 눌렀을 때만 이동 처리.
            if (Input.GetMouseButton(0))
            {
                GetComponent<PlayerMove>().MoveTo(hit.point);
                
            }
            return true; // 이동이 성공하면 true 반환.
        }
        return false; // 이동 불가능할 경우 false 반환.
    }
}

 

MouseClickToCombat()는 마우스 클릭으로 공격을 시도하는 함수입니다. 이 함수는 마우스 포인터 위치에서 레이를 발사하여 해당 위치에 있는 오브젝트들 중에서 CombatTarget 컴포넌트가 있는 오브젝트(적 캐릭터 등)를 찾습니다.

  • 레이를 쏴서 충돌한 오브젝트들이 있는지 확인한 후, 그 중에 CombatTarget이 있는지 확인합니다.
  • target == null일 때는 그 오브젝트가 공격 대상이 아니므로, continue로 다음 오브젝트를 검사합니다.
  • 만약 CombatTarget이 있으면, 마우스 왼쪽 버튼을 클릭(Input.GetMouseButtonDown(0))하면 공격(Attack())을 수행합니다.
  • 공격이 성공적으로 이루어졌다면 true를 반환해 이후의 이동 코드가 실행되지 않도록 합니다.
  • 레이가 닿은 모든 오브젝트를 검사했으나 CombatTarget이 없으면 false를 반환하여, 그 다음 이동 동작을 처리할 수 있게 합니다.

 

MouseClickToMove()는 마우스 클릭으로 이동을 처리하는 함수입니다.

  • 레이를 발사하여 충돌한 오브젝트가 있는지 확인합니다.
  • 레이가 닿은 오브젝트가 있을 경우, Input.GetMouseButton(0)로 마우스 왼쪽 버튼이 눌렸는지 확인하고, 눌렸다면 PlayerMove 컴포넌트의 MoveTo(hit.point) 메서드를 호출하여 그 위치로 캐릭터를 이동시킵니다.
  • 이동이 성공하면 true를 반환하여, 이후의 코드를 실행하지 않게 합니다.
  • 레이가 닿은 곳이 없다면 false를 반환하여 "Can't move" 메시지를 출력할 수 있게 합니다.

 

 

 

 

관련글 더보기