각 3D 캐릭터가 자동 전투를 진행해야하는데 플레이어 캐릭터는 항상 자신에게서 가장 가까운 적을 대상으로 잡도록 만들어야 했습니다. 그래서 전투를 관리하는 배틀 매니저 클래스를 통해서 가장 가까운 적을 도출해내는 함수를 만들어서 구현했습니다.
// ORDER : #5) 현재 자신의 위치에서 가장 가까운 컨트롤러를 반환하는 함수
/// <summary>
/// 가장 가까운 T를 찾아서 리턴합니다.
/// </summary>
/// <typeparam name="T">Controller한정</typeparam>
public T ReturnNearDistanceController<T>(Transform transform) where T : Controller
{
if (typeof(T) == typeof(PlayerController))
// 찾는 컨트롤러가 플레이어 컨트롤러라면
{
if (livePlayer != null)
{
return livePlayer as T;
}
}
else if (typeof(T) == typeof(EnemyController))
// 찾는 컨트롤러가 에너미컨트롤러 라면
{
// 생존한 적리스트를 가져옵니다.
List<EnemyController> list = liveEnemies.Where(enemy => !enemy.battleStatus.isDead).ToList();
// 생존한 적이 없다면 null 리턴
if (list.Count == 0) return null;
// 리스트를 순회하면서 가장 가까운 적을 찾습니다.
Controller nearTarget = list[0];
float distance = Vector3.Distance(nearTarget.transform.position, transform.position);
for (int i = 1; i < list.Count; i++)
{
float newDistance = Vector3.Distance(list[i].transform.position, transform.position);
if (distance > newDistance)
{
nearTarget = list[i];
distance = newDistance;
}
}
// T 타입으로 형변환 해서 전달 해줍니다.
return (T)nearTarget;
}
return null;
}'Portfolio > Portfolio_RiseTheTower' 카테고리의 다른 글
| #7) 전투 시 플레이어 캐릭터의 바지와 헬멧의 인챈트를 확인하여 액티브 스킬을 장착 (0) | 2023.07.26 |
|---|---|
| #6) 현재 무기 외형에 따라 나올 애니메이션 컨트롤러를 변경 (0) | 2023.07.26 |
| #4) 제네릭 형식 제약조건을 사용한 장비아이템 데이터를 가져오는 함수 (0) | 2023.07.26 |
| #3) 현재 상태에 따라 컨트롤러의 동작을 변경하는 상태패턴 구현 (0) | 2023.07.26 |
| #2) 오브젝트 풀 사용 예시 (0) | 2023.07.26 |