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

가까운 적 따라가면서 없애기

by pudding81 2024. 2. 28.

 

 

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

public class PlayerController : MonoBehaviour
{

    public List<MonsterController> monsters = new List<MonsterController>();
       

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

    CSightVisualizer cSightVisualizer;

    public int speed=1;

    Rigidbody rb;

    

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        cSightVisualizer = GetComponent<CSightVisualizer>();

     
         monsterDistances = new List<MonsterDistance>();

        
    }


    private void Update()
    {

        
        monsterDistances.Clear(); //거리 저장 초기화 

        CDetect();

        
    }

    private void CDetect()
    {
        

        // 시야 안에 있는 몬스터의 거리를 계산하여 리스트에 추가
        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);

            Vector3 dir = this.transform.position - nearest.Monster.transform.position;

            //monster를 향해 이동          
            this.transform.Translate(-dir.normalized * speed * Time.deltaTime);


        }
        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;
        }

    }

    private void OnCollisionEnter(Collision collision)
    {

        // collision.gameObject.SetActive(false); // monster를 비활성화

        monsters.Remove(collision.gameObject.GetComponent<MonsterController>());//리스트에서 제거 

        Destroy(collision.gameObject);
       

    }
}