개인개발기록/게임개발프로젝트

2025_05_14_플랫포머_게임개발_연습_프로젝트

pop2bubbledev 2025. 5. 15. 02:32

[PlayerAttack && interface 구현]

작업 일자:2025_05_14 ~ 2025_05_15
주요 작업:플레이어의 Attack 과 Interface
진행도:플레이어 의 40%


1. 작업 요약

  • 플레이어의 InputHandler와 Movement 작성

2. 상세 작업 내역

항목내용
추가 메서드/클래스 PlayerAttack,Projectile
삭제/리팩토링 PlayerController(삭제) / PlayerInputHandler, PlayerMovement

2-1. 주요 코드 요약

(1) 각종 인터페이스

  • Enemy를 중심으로 공용으로 사용할 적대적 개체의 Interface 설계 및 플레이어 또한 적용할만한 것들은 적용
public interface IDamageable
{
    void TakeDamage(float amount);
    bool IsDead { get; }
}

 (현재는 인터페이스의 스크립트들이 굉장히 적으나 차후 추가될 가능성 염두)


(2) 기능명

  • PlayerAttack
  • 플레이어의 공격을 처리
    • 근접무기의 경우 2D 라는 점을 살려 가상의 영역을 만들어 Layer 검사 유저 입장에선 애니메이션 효과로 인하여 공격하는것처럼 느낌
    • 원거리 무기의 경우 Projectile을 발사하며 최대 3발까지 공전가능 공격력 또한 0.8배율
    •  
void SwapWeapon()
{
    //삼항 연산자를 이용한 대입    현재무기에 대입한다 현재무기가 Melee 라면 Ranged 를 아니라면 Melee를 무기가 2개일때만 가능한 스왑(최대 2개 장착으로두고 1번 무기 2번무기로도 가능)

    currentWeapon = currentWeapon == WeaponType.Melee ? WeaponType.Ranged : WeaponType.Melee;
}

 IEnumerator Swing()
 {
     isAttacking = true;
     yield return new WaitForSeconds(0.1f);                                                                       // 공격 딜레이(선딜)
     Debug.Log("근접 공격");

     Vector2 center = transform.position;                                                                           // 플레이어 의 위치
     float direction = transform.localScale.x > 0 ? 1f : -1f;                                                  // 바라보고있는 방향이 + 방향이라면 1f 를 아니라면 -1f 반환
     center += Vector2.right * direction * hitboxSize.x * 0.5f;                                              // 현재 위치에서 이동한다 Vector2.right( X 좌표 + 값 / 우측) * 방향 * hitbox * 0.5f(기존 크기의 0.5배)

     Collider2D[] hits = Physics2D.OverlapBoxAll(center, hitboxSize, 0f, enemyLayer);        // 콜라이더2D 배열에 담는다 영역에 들어온 EnemyLayer객체들을
     foreach (var hit in hits)                                                                                               // 피격당한 객체에 대미지를준다 (인터페이스를 통해 피격 처리 IDamageable)
     {
         hit.GetComponent<IDamageable>()?.TakeDamage(playerStat.damage);
     }
     yield return new WaitForSeconds(meleeCooldown);                                                   // 근접공격속도에 맞춰 Return 그후 어택 false
     isAttacking = false;
 }
핵심 기능 스왑 과 공격방식
 

 (현재 스왑기능 활성화 애니메이션 진척도에따라 변경 가능)


3. 작업 중 변경사항

  • PlayerController 삭제
  • 서로 참조가 많이 없어 프로젝트 규모를 생각해 삭제하였다
  • 연결자 역할을 하지만 다른 스크립트에서 거의 사용하지 않았음을 고려

4. 소요 시간

항목시간
예상 소요 시간 3시간
실제 소요 시간 5시간

5. 작업 중 애로사항

  • 근접공격의 구현방식 실제 오브젝트를 만들고 그 오브젝트를 휘두르는 식의 구현을 처음에 생각하였으나 2D기준 자연스러운 연출을 구현할 방법이 떠오르지 않았고 애니메이션을 받는다면 무엇이 더 깔끔할지 고민하다 특정 구역 공격 방식으로 문제 해결

6. 예상되는 문제점

  • Enemy 01의 구성 첫번째 적대적 개체인만큼 다른 Enemy 객체에 영향을 많이 줄것을 고려 확장성을 최대한 좋게 만들어내려하지만 코드가 지저분해질까 걱정이된다

7. 다음 작업 계획

  • PlayerStat과 PlayerAnim