오늘의 작업 요약

  • AEnemyAIController를 통해 적 AI가 주변 환경(시야, 청각, 피해)에 반응하여 상태를 전환하도록 구조화했습니다.
  • Behavior Tree & Blackboard를 적극 활용하여, 상태와 행동(Attacking, Investigating, Passive 등)을 유연하게 관리합니다.

상세 내용

  1. AI Perception 다루기
    • Sight, Hearing, Damage 세 가지 감각을 모두 등록해줬습니다.
    • 감각마다 MaxAge(감지 유지 시간)나 Range(감지 범위), PeripheralVisionAngleDegrees(시야각) 같은 파라미터를 다르게 설정하여, 다양한 상황에서 AI가 자연스럽게 반응할 수 있도록 했습니다.
    • AI Perception 컴포넌트에 OnPerceptionUpdated 델리게이트를 바인딩해, 새로 감지된 액터 또는 시야 밖으로 벗어난 액터를 실시간으로 추적합니다.

	/**
	 * @brief AI Perception 업데이트 이벤트 핸들러
	 * 
	 * 감지된 액터 목록이 변경될 때마다 호출되어 각 감각(시야, 청각, 피해)에 대해 적절한 처리를 수행합니다.
	 * 
	 * @param Actors 감지된 액터 목록
	 */
	UFUNCTION()
	void OnPerceptionUpdated(const TArray<AActor*>& Actors);
    
    
    void AEnemyAIController::OnPerceptionUpdated(const TArray<AActor*>& Actors)
{
	// 감지된 각 액터에 대해
	for (AActor* Actor : Actors)
	{
		FAIStimulus AIStimulus;

		// 시야 감각 검사: 감지에 성공하면 시야 처리, 아니면 시야 상실 처리
		if (CanSenseActor(Actor, EAISense::Sight, AIStimulus))
		{
			HandleSensedSight(Actor);
		}
		else
		{
			HandleLostSight(Actor);
		}

		// 청각 감각 검사: 감지 성공 시 소리 처리
		if (CanSenseActor(Actor, EAISense::Hearing, AIStimulus))
		{
			HandleSensedSound(AIStimulus.StimulusLocation);
		}

		// 피해 감각 검사: 감지 성공 시 피해 처리
		if (CanSenseActor(Actor, EAISense::Damage, AIStimulus))
		{
			HandleSensedDamage(Actor);
		}
	}
}

 

 

 

 

 

2.상태 전환: Behavior Tree와의 협업

  • Blackboard에 여러 키(AttackRadius, DefendRadius, PointOfInterest, AttackTarget)를 업데이트해, Behavior Tree 노드들이 이를 근거로 의사결정을 하게끔 했습니다.
  • 예: Passive 상태 → 소리를 듣거나 타겟을 발견하면 → Investigating 상태 / Attacking 상태로 전환.
  • 타겟을 잃어버려도 일정 시간 후 “SeekAttackTarget”을 호출함으로써 AI가 추적을 시도(Seeking 상태)하도록 구현했습니다.
  1. 팀 체크(OnSameTeam)
    • IInterface_Damagable를 활용해 팀 번호를 확인하고, 아군이면 공격하지 않도록 처리했습니다.
    • 대규모 AI 전투를 디자인할 때, 팀간 식별 로직만 변경하면 모든 AI가 일관된 방식으로 아군/적군을 구분하게 되므로 유지보수 측면에서도 장점이 큽니다.
  2. 개발 중 느낀 점
    • Perception을 제대로 활용하니, 이벤트 기반으로 AI 로직을 작성할 수 있어서 Tick에서 불필요한 연산을 하지 않아도 됩니다(최적화 이점).
    • Behavior Tree 기반의 로직은 차후에 상태나 행동을 추가할 때 브랜치만 확장하면 되어서, 스파게티 코드 없이 확장 가능한 구조라는 걸 다시금 체감했습니다.
    • “AI가 시야를 놓쳐도 일정 기간 추적한다”는 방식으로 사람 같은 ‘집요함’을 표현할 수 있었고, 조금 더 설득력 있는 적 AI가 됐다고 생각합니다.

앞으로 시도해보고 싶은 것들

  • AI 간 협동: 한 AI가 감지한 정보를 같은 팀 다른 AI와 공유하는 식으로, 집단 지능(Shared Knowledge)을 구현.
  • 다양한 감각: 발자국, 냄새, 시야 가림막(스텔스) 등을 추가해 AI가 더 사실적으로 반응하게 만들기.
  • AI Debugging: 게임 내 디버그 HUD나 라인 드로잉 등을 활용해, 시야 범위/청각 범위/최종 추적 위치를 가시화하기.

마무리
하루 만에 모든 걸 완벽히 마무리하기엔 아직 갈 길이 멀지만, 오늘 작업으로 기본적인 적 AI의 감지와 상태 전환은 안정적으로 구축했습니다. 앞으로도 상황별 이벤트와 강화된 Behavior Tree 로직을 통해 더욱 정교한 AI 행동을 구현해 나갈 계획입니다.

'UnrealCamp' 카테고리의 다른 글

12주차 Day2  (0) 2025.03.04
10주차 Day3- Unreal Engine C++로 Enemy AI Base 구현하기  (0) 2025.02.19
9주차 Day2 AI시스템  (0) 2025.02.11
7주차 Day4 [캐릭터 #2 코스메틱]  (0) 2025.01.30
7주차 Day2 [Lyra Input]  (0) 2025.01.28

+ Recent posts