카테고리 없음

1126 Codex

버스창문 2025. 11. 26. 15:22

 

 

간단하게 프로젝트 하나 더 해보자고 해서 시작

2D 플랫포머 슈팅 게임이라고 한다.

 

InputSystem을 사용해서 A,S,D, 스페이스바,왼쪽 시프트, 마우스 우클릭, 마우스 좌클릭, Q, E, R 키를 받는 InputAction과 그걸 사용하는 스크립트를 작성해줘

 


새 스크립트 생성 완료: Assets/02.Scripts/InputListener.cs.

  • 키보드 A/S/D/Space/LeftShift, 마우스 좌/우클릭, Q/E/R 각각 InputAction으로 바인딩하고 performed에 로그 연결.
  • OnEnable/OnDisable에서 Enable/Disable, OnDestroy에서 Dispose 처리.
  • 원하는 GameObject에 붙여 테스트하면 입력 시 콘솔에 로그가 찍힙니다.

추가로 원하는 동작이 있으면 Debug.Log 부분을 교체해 사용하세요.

 

 

 

InputAction도 생성해줘

 

.inputactions 자산 생성 완료: Assets/02.Scripts/InputActions.inputactions.

  • 액션 맵 Gameplay에 A/S/D, 스페이스, 왼쪽 쉬프트, 마우스 좌/우클릭, Q/E/R 바인딩이 모두 포함돼 있습니다.
  • Unity 에디터에서 더블클릭 후 Generate C# Class를 눌러 래퍼 스크립트를 만들거나 PlayerInput에 이 자산을 할당해 사용할 수 있습니다.
  • 기존 InputListener.cs를 이 자산과 연결하려면, 생성된 C# 클래스를 참조하거나 InputActionReference를 필드로 받아 Enable/Disable 해주면 됩니다. 추가 연결 작업이 필요하면 알려주세요.

 

ChatGPT에서도 이게 작동함을 알고 있었기에 해봤고, 역시 내가 직접 생성 안해도 그냥 다 해준다는건 매우 편안하다.

 

 

A, D키로 좌우 이동하고,
마우스 좌클릭으로 일반공격,
마우스 좌클릭을 2초간 홀드하면 강공격
스페이스바로 점프(공중에서 점프 한번 더 가능, 단, 공중에서 점프 시 기존 높이의 반만 점프함)
S키 + 스페이스바 로 하단점프(하단 점프가 가능한 레이어인지 체크 필요)
왼쪽 시프트 + A or D 키 로 해당방향으로 대쉬
AA 나 DD 이런식으로 방향키를 연속으로 눌러도 해당 방향으로 대쉬
마우스 우클릭으로 가드
Q키로 스킬사용
E키로 궁극기 사용
R키로 물약사용

만들어줘

 

 

PlayerController를 InputAction 자산 기반으로 전면 교체했습니다: Assets/02.Scripts/PlayerController.cs.

  • 인스펙터에 inputActions로 KYSInputActions.inputactions 할당하면 Gameplay 맵의 액션을 찾아 사용합니다.
  • 이동/점프: A/D 유지로 좌우 이동, 스페이스 점프(지상 1회, 공중 1회는 절반 높이). groundCheck와 groundMask로 착지 판정.
  • 하단 점프: S+스페이스 시 dropPlatformMask 레이어에 닿아 있으면 아래로 점프(현재는 TODO: 플랫폼 충돌 무시 로직 필요).
  • 대시: 왼쉬프트+A/D 또는 같은 방향 더블탭(A,A / D,D)으로 대시, dashForce/duration/cooldown 설정 가능.
  • 공격: 마우스 좌클릭 홀드/릴리즈 시간으로 일반/강공격 분기(2초 이상 홀드 시 강공격).
  • 가드: 마우스 우클릭 누르는 동안 가드 on/off.
  • 스킬/궁/물약: Q/E/R 입력 시 각각 로그 호출 자리.

사용 전 주의:

  • Rigidbody2D와 groundCheck 트랜스폼, 레이어 마스크들을 인스펙터에서 지정해야 합니다.
  • 플랫폼 하단 점프는 프로젝트에 맞게 충돌 무시 처리(TODO)에 구현을 추가하세요.
  • 로그 부분을 실제 동작(애니메이션, 데미지 등)으로 교체하면 됩니다.

 

2단점프가 그냥 횟수 형태로 되어있으니 내가 혼자 절벽에서 떨어지다 점프해도 2단점프가 되는 버그가 있었다.
그냥 테스트용으로 만들다보면 항상 저렇게 되는거같다.

 

 

지금 2단점프 코드가
내가 절벽에서 그냥 떨어지다가 점프하면 맨땅에서 점프한거로 판정이 날건데 그런식으로 내가 점프를 먼저 하지 않았더라도 공중에서 점프하면 2단점프를 사용한걸로 판정되도록 바꿔줘

 

점프 로직을 수정했습니다: Assets/02.Scripts/PlayerController.cs

  • 지상에서 점프 시 jumpCount = 1로 첫 점프를 소비합니다.
  • 공중에서 스페이스를 누르면, 이전에 지상 점프를 하지 않았더라도 바로 2단점프(절반 높이)로 처리하며 jumpCount = 2로 소모합니다.
  • 점프 카운트가 2 이상이면 더 이상 점프하지 않습니다.
  • S+스페이스 하단점프 분기는 지상에서만 처리하도록 재배치했습니다.

원하는 대로 동작하는지 확인해보세요.

즉시 수정

 

방어을 만들거야
방어 전용코드를 새로 생성해주고
방어를 활성화하면 캐릭터보다 살짝 큰 범위의 패링체크 구역, 그보다 살짝 더 큰 범위의 가드 체크 구역이 생기고,
공격이 캐릭터에 직접 닿으면 피격,
패링 구역에 닿으면 패링,
가드 구역에 닿으면 가드로 판정할거야

 

??? : 아니 패링은 공격이 닿는 타이밍이 어쩌구

 

 

내가 저렇게 받았다.

 

 

방어 전용 스크립트를 새로 만들었습니다: Assets/02.Scripts/DefenseController.cs.

  • 기능: 가드 활성화 시 패링/가드 링을 체크하고, 공격이 몸에 닿으면 피격, 패링 링에 닿으면 패링, 가드 링에 닿으면 가드로 이벤트 발생.
  • 설정: bodyRadius(피격), parryRadius(패링), guardRadius(가드)와 attackMask 레이어를 인스펙터에서 조정.
  • 사용: ActivateGuard()/DeactivateGuard()로 가드 on/off. OnParry, OnGuard, OnHit 이벤트를 구독해 실제 판정/연출을 연결하세요.
  • 디버그: 씬 뷰에서 Gizmos 선택 시 세 개의 원으로 범위가 표시됩니다.
  • 쿨다운: eventCooldown으로 프레임마다 중복 판정되는 것을 막습니다.

가드 입력을 DefenseController와 연동했습니다: Assets/02.Scripts/PlayerController.cs

  • DefenseController를 직렬화 필드로 추가하고, 비어 있으면 GetComponent<DefenseController>()로 자동 할당 시도.
  • 마우스 우클릭 performed/canceled에서 ActivateGuard() / DeactivateGuard() 호출.
  • OnDisable에서도 가드를 끄도록 처리해 비활성화 시 상태가 남지 않도록 했습니다.

인스펙터에서 Player GameObject에 DefenseController가 붙어 있는지 확인하고, 없으면 추가한 뒤 radius와 attackMask를 설정하세요.

 

가드를 먼저 체크하길래
지금 받은 그림대로라면 내가 방어중이더라도 그 공격이 이미 맨 안쪽 히트판정까지 닿았으면 못막은걸로 판정하라는거 같아서
체크 순서를 바꿨다, 위의 그림에서 더 작은 순서대로 히트, 패링, 가드로

 

 

 

hit를 먼저 체크해야 할거같아
hit가 체크범위가 가장 작고, 가드했는데 hit범위쪽에 닿는다면 가드를 늦게했다는 걸로 판정할거야
피격, 패링, 가드 순으로 판정하게 해줘

Assets/02.Scripts/DefenseController.cs 수정 완료.

  • 판정 우선순위를 Hit(몸) → Parry(패링 링) → Guard(가드 링)으로 변경. 가장 안쪽(bodyRadius)에 닿으면 가드 중이어도 피격으로 처리.
  • 가드가 활성화된 경우에만 패링/가드 링을 검사하며, 이벤트는 eventCooldown 간격으로 발생.

PlayerController의 우클릭 가드 입력으로 ActivateGuard/DeactivateGuard가 이미 호출되니 그대로 연동하면 됩니다.

 

 

이제 실질적인 피격판정을 관리하는 스크립트를 생성

 

플레이어의 피격판정을 관리하는 PlayerDamage 스크립트를 생성해줘
지금 Defense코드에 있는 OnHit등의 이벤트는 Damage 스크립트쪽에 있는 내용을 구독하게 해주면 돼

새 스크립트 생성: Assets/02.Scripts/PlayerDamage.cs.

  • DefenseController의 OnHit/OnParry/OnGuard를 구독해 각각 피격/패링/가드 판정에 반응.
  • 기본 체력 관리 포함(maxHealth, hitDamage, guardBlockDamage), 가드 시 일부 데미지만 받도록 예시.
  • Awake에서 DefenseController 자동 할당 시도, OnEnable/OnDisable에 이벤트 구독/해제.
  • TODO 주석 위치에 실제 연출(피격/패링/가드, UI 갱신, 사망 처리 등) 추가하면 됩니다.

Player GameObject에 DefenseController와 함께 이 스크립트를 붙여 사용하세요.

 

체력을 저기서 직접 관리하려하길래 Player도 즉시 새로 생성

 

체력과 스테미나를 관리하기 위한 Player 스크립트를 새로 생성하고, PlayerDamage에 넣은 maxHealth같은 수치는 거기로 옮겨줘

새 Player 스크립트 생성 및 PlayerDamage 연동 완료.

  • Assets/02.Scripts/Player.cs: 체력/스태미나 관리 전용.
    • 직렬화 필드: maxHealth, maxStamina와 현재값.
    • 메서드: ApplyDamage, Heal, ConsumeStamina, RecoverStamina 제공.
  • Assets/02.Scripts/PlayerDamage.cs 수정:
    • Player 참조 추가, maxHealth/currentHealth 제거.
    • HandleHit/HandleGuard에서 player.ApplyDamage(...) 호출로 체력 감소 처리.
    • Awake에서 DefenseController와 Player 자동 할당 시도.

사용 방법:

  • Player GameObject에 Player, DefenseController, PlayerDamage를 모두 붙이고 PlayerDamage의 player와 defenseController 참조가 Inspector에서 연결되어 있는지 확인하세요.
  • 체력/스태미나 수치는 Player 스크립트에서 조정하면 됩니다.