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);
}
}
'게임개발 > 게임플랫폼 응용 프로그래밍' 카테고리의 다른 글
시즈탱크 1단계 - 에러 수정전 (1) | 2024.02.29 |
---|---|
벌쳐 지뢰 매설하기 (0) | 2024.02.28 |
DropShip in BionicUnits (0) | 2024.02.28 |
Enum , List<> , Foreach 연습하기 (0) | 2024.02.28 |
매 프레임마다 가장 가장 가까운적 찾기 (1) | 2024.02.27 |