본문으로 건너뛰기

감정 기반 애니메이션 시스템

감정 설정 한 줄로 이동속도·애니메이터·눈 깜빡임이 자동으로 변경됩니다.

개요

기존:
anim.Play("Idle");

NPC Mentality:
emotion.Set(Emotion.Angry);
→ 자동: 걷기 속도 증가 / 머리 흔들림 / 표정 변화 / 눈 깜빡임 감소

컴포넌트

EmotionController — MonoBehaviour.

필드타입설명
AnimatorAnimatorNPC 애니메이터
AgentNavMeshAgent이동 속도 제어 (선택)
CurrentEmotionEmotionType현재 감정 (읽기 전용)

EmotionType 열거형

public enum EmotionType
{
Neutral, // 기본 상태
Happy, // 행복
Angry, // 분노
Sad, // 슬픔
Afraid, // 두려움
Surprised, // 놀람
Disgusted // 혐오
}

API

Set

void Set(EmotionType emotion)

감정을 설정하고 효과를 즉시 적용합니다.

emotion.Set(EmotionType.Angry);
emotion.Set(EmotionType.Happy);
emotion.Set(EmotionType.Neutral); // 초기화

감정별 효과

감정NavMesh 속도Animator 트리거BlinkRate
Neutral×1.0 (기본)"Idle"1.0
Happy×1.0"Happy"1.0
Angry×1.5"Angry"0.3 (감소)
Sad×0.7"Sad"0.8
Afraid×1.3"Afraid"1.5 (증가)

Animator 파라미터: BlinkRate (Float), 각 감정별 Trigger 파라미터가 필요합니다.


Animator 설정

Parameters:
BlinkRate [Float] — 눈 깜빡임 속도 Blend Tree에 연결
Idle [Trigger]
Happy [Trigger]
Angry [Trigger]
Sad [Trigger]
Afraid [Trigger]

예제

using NpcMentality;

public class NPCReaction : MonoBehaviour
{
private NPCMemory _memory;
private EmotionController _emotion;

private void Awake()
{
_memory = GetComponent<NPCMemory>();
_emotion = GetComponent<EmotionController>();
}

public void OnTalkWithPlayer()
{
float attitude = _memory.GetAttitude();

if (attitude < -8f)
_emotion.Set(EmotionType.Angry);
else if (attitude < -2f)
_emotion.Set(EmotionType.Disgusted);
else if (attitude > 8f)
_emotion.Set(EmotionType.Happy);
else
_emotion.Set(EmotionType.Neutral);
}

public void OnCombatStart() => _emotion.Set(EmotionType.Afraid);
public void OnCombatEnd() => _emotion.Set(EmotionType.Neutral);
}