패링 게임 - 3 (무적, 가드)

Labin·2025년 4월 8일

패링 게임

목록 보기
5/14

해결한 문제

무적시간

무적을 시간으로 하다보니 애니메이션에 안 맞게 됨.
그래서 애니메이션의 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) 이런 식일 확률이 높고,

방향 판별에 아무 의미가 없는 값이 될 수도 있어서 안됐음.

profile
공부를 기록하는 공간

0개의 댓글