본문 바로가기
게임개발/게임플랫폼 응용 프로그래밍

매 프레임마다 가장 가장 가까운적 찾기

by pudding81 2024. 2. 27.

가장 가까운 몬스터와의 거리 빨간줄로 표시

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

public class CSightVisualizer : MonoBehaviour
{

    public float radius = 8;
    

    private void OnDrawGizmos()
    {
        //탐지 범위 보여주기
        //위치, 방향, 360도, 시야 3유닛
        GizmosExtensions.DrawWireArc(this.transform.position, this.transform.forward,360,radius);

    }
}

 

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using System.Linq;

public class PlayerController : MonoBehaviour
{

    public MonsterController[] monsters;

    List<MonsterDistance> monsterDistances; //몬스터와의 거리

    CSightVisualizer cSightVisualizer;

    void Start()
    {
        
        monsterDistances = new List<MonsterDistance>();
        cSightVisualizer = GetComponent<CSightVisualizer>();


    }


    private void Update()
    {
        monsterDistances.Clear(); //거리 저장 초기화 

        // 시야 안에 있는 몬스터의 거리를 계산하여 리스트에 추가
        foreach (MonsterController controller in monsters)
        {
            float distance = Vector3.Distance(transform.position, controller.transform.position);

            if (distance <= cSightVisualizer.radius)
            {
                monsterDistances.Add(new MonsterDistance(controller.gameObject, distance));
            }
        }
        // 거리를 기준으로 오름차순 정렬
        monsterDistances = monsterDistances.OrderBy(md => md.Distance).ToList();

        // 정렬된 몬스터와 거리 출력
        //foreach (MonsterDistance md in monsterDistances)
        //{
        //    Debug.LogFormat("<color=cyan>{0}</color> : {1}", md.Monster.name, md.Distance);
        //}

        // 가장 가까운 몬스터 찾기
        MonsterDistance nearest = monsterDistances.FirstOrDefault();


        // 가장 가까운 몬스터 출력
        if (nearest.Monster != null)
        {
            //Debug.LogFormat("<color=yellow>가장 가까운 몬스터:</color> {0} : {1}", nearest.Monster.name, nearest.Distance);

            Debug.DrawLine(this.transform.position, nearest.Monster.transform.position, Color.red, 0);


        }
        else
        {
            //Debug.Log("<color=yellow>가장 가까운 몬스터를 찾을 수 없습니다.</color>");
        }
    }




    // 몬스터와 거리를 저장하기 위한 구조체
    public struct MonsterDistance
    {
        public GameObject Monster { get; private set; }
        public float Distance { get; private set; }

        public MonsterDistance(GameObject monster, float distance)
        {
            Monster = monster;
            Distance = distance;
        }

    }
}