무적을 시간으로 하다보니 애니메이션에 안 맞게 됨.
그래서 애니메이션의 stateinfo를 이용해서 만약 Hurt 애니메이션이 재생 중일 경우 무적이 되게 함.
근데 이렇게 하니 완벽한 타이밍에 좌, 우 공격이 동시에 들어오니 데미지가 두 번 들어오게 되는 문제 발생. 따라서 무적 시간을 0.1초로 아주 짧게 주고, 이후 애니메이션 재생 중일 때 무적이게 만들어서 해결함.
float MonsterX = other.transform.position.x;
float HeroFacing = -m_animator.transform.localScale.x;
float attackDirection = Mathf.Sign(MonsterX - transform.position.x);
bool isGuarding = (HeroFacing * attackDirection) > 0f;
if (m_stats != null)
{
if (isGuarding)
{
Debug.Log("Guard success!");
m_stats.TakeDamage(damage * 0.2f); // 방어 시 데미지 반감
}
else
{
Debug.Log("Guard failed!");
m_animator.SetTrigger("Hurt");
m_stats.TakeDamage(damage); // 방어 실패 시 데미지 그대로
}
}
가드를 바라보는 방향에 대해서 데미지를 적게 받는 코드를 작성 중에 이상하게 항상 안 됨.
float MonsterX = other.transform.position.x;
공격해오는 몬스터의 X 좌표를 가져와.
지금 우리가 2D 게임을 하니까, X축 방향이 "왼쪽 ↔ 오른쪽"이야.
float HeroFacing = -m_animator.transform.localScale.x;
히어로의 바라보는 방향을 구하는 핵심 포인트야.
localScale.x가 양수면 오른쪽, 음수면 왼쪽을 의미해.
Unity에서는 좌우 반전을 위해 localScale.x에 -1을 곱하니까,
예: 오른쪽 → localScale.x = 1
왼쪽 → localScale.x = -1
그런데 캐릭터의 Sprite는 반대로 움직이는 경우가 많기 때문에 우리는 실제 바라보는 방향을 -localScale.x로 가져온 거야.
즉, HeroFacing은
오른쪽 → -1
왼쪽 → 1
float attackDirection = Mathf.Sign(MonsterX - transform.position.x);
공격이 어디서 오는지 계산해.
MonsterX - HeroX의 결과에 따라:
몬스터가 히어로의 오른쪽에 있다 → 결과: 양수 → 1
몬스터가 히어로의 왼쪽에 있다 → 결과: 음수 → -1
즉,
공격 방향: 몬스터가 히어로에게 오는 방향을 뜻함
bool isGuarding = (HeroFacing * attackDirection) > 0f;
이제 히어로가 바라보는 방향과 공격이 오는 방향이 같으면 → 방어 성공, 이걸 수학적으로 표현한 거야.
HeroFacing이 1 (왼쪽), attackDirection이 1 (왼쪽에서 공격) → 1 * 1 = 1 → 성공
HeroFacing이 -1 (오른쪽), attackDirection이 -1 (오른쪽에서 공격) → 성공
반대면 → -1 → 실패

왜 m_animator.transform.localScale.x는 되고, transform.localScale.x는 안 됐을까?
📌 1. transform은 누구의 Transform?
이 스크립트는 Sensor_Hero 오브젝트에 붙어 있어.
그래서 그냥 transform.localScale이라고 하면 → Sensor_Hero의 스케일을 가져오는 거야.
📌 2. 히어로 캐릭터의 스프라이트 방향은 부모 오브젝트 기준으로 바뀌지!
구조상:
Sensor_Hero는 히어로 오브젝트의 자식이고,
히어로의 좌우 방향 반전은 부모인 히어로 오브젝트(localScale)으로 제어됨.
그래서 transform.localScale은 항상 (1, 1, 1) 이런 식일 확률이 높고,
방향 판별에 아무 의미가 없는 값이 될 수도 있어서 안됐음.