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

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

pop2bubbledev 2025. 6. 1. 01:38

[TransitionAttack]

작업 일자:2025_05_31_1400 ~ 2025_05_31_2100 2025_05_30_2000 ~ 2025_05_30_0000
주요 작업:TransitionAttack
진행도:70%


1. 작업 요약

  • 보스의 페이지 전환 공격을 만들었다

2. 상세 작업 내역

항목내용
추가 메서드/클래스 PrinterTransitionAttck, PrinterCameraController, PrinterPlatformManager,GiantPaper
수정 사항  
삭제/리팩토링 PrinterPattern

2-1. 주요 코드 요약

(1) PrinterCameraController

  • 보스가 이동한다면 그 보스를 따라 카메라가 이동한다
  • 플레이어는 카메라 밖으로 나간다면 자동으로 카메라 안쪽으로 이동시킨다
  • 업데이트문을 이용해 카메라의 위치를 변환과 Player가 카메라 범위 밖에있는지 확인하는 클래스인 IsPlayerOutOfBounds를 통해 구현한다
if (currenState == PrinterState.Transition)
{   //targetPos 변수 선언 및 Vector3 에 보스의 X 좌표 + 앞을보게할 값 을 넣고 Y Z 를 고정한다
    Vector3 targetPos = new Vector3(bossTransform.position.x + bossFollowOffsetX, transform.position.y, transform.position.z);
    //카메라의 위치 Vector3.Lerp로 처리 (시작위치, 도착위치, 보정 계수) 보정계수의 상태에 따라 a 또는 b 를 입력해 부드럽고 자연스러운 움직임을 구현
    transform.position = Vector3.Lerp(transform.position, targetPos, cameraLerpSpeed * Time.deltaTime);
    
    if (IsPlayerOutOfBounds(playerTransform))
    {   //밀어내는 거리 = Vector3 우측으로 밀쳐네는 속도만큼 deltatime 보정으로
        Vector3 pushDirection = Vector3.right * playerPushSpeed * Time.deltaTime;
        //LastUpdate를 통한 자연스러운 밀어내기
        playerTransform.position += pushDirection;
    }
}
 

 


(2) PrinterPlatformManager

  • 타일맵 등록후 해당 타일맵의 호출지점 기준으로 받은 매개값만큼 Tile을 삭제해주는 클레스
  • 특수 변환 패턴시 타일을 파괴할때 사용한다
 
[SerializeField]
public Tilemap platformTilemap;

// 타일 즉시 제거 함수
public void DestroyPlatformsInArea(Vector3 center, Vector2 size)
{   //Tile 범위 확인 중심을 기준으로 좌우 한칸씩 삭제
    BoundsInt bounds = new BoundsInt(
        Mathf.FloorToInt(center.x - size.x / 2),
        Mathf.FloorToInt(center.y - size.y / 2),
        0,
        Mathf.CeilToInt(size.x),
        Mathf.CeilToInt(size.y),
        1
    );

    foreach (Vector3Int pos in bounds.allPositionsWithin)
    {   //타일 존재 확인
        if (platformTilemap.HasTile(pos))
        {   //있으면 제거
            platformTilemap.SetTile(pos, null);
        }
    }
}

 


2-3. 주요 코드 요약

(1) GiantPaper

  • 플랫폼을 부수며 지나가는 거대한 종이를 소환한다 또한 Grounds 판정을 받아 밟을수있다
  • 또한 충돌중인 TileMap을 전부 파괴한다

 

private void OnTriggerStay2D(Collider2D collision)
{
    // 충돌한 오브젝트가 타일 레이어에 속하는지 확인
    bool matchesTarget = collision == targetTileCollider;
    if (((1 << collision.gameObject.layer) & tileLayer) != 0 || matchesTarget)
    {
        // 충돌한 지점 중 종이 위치에서 가장 가까운 지점을 반환
        Vector3 hitPoint = collision.ClosestPoint(transform.position);

        // 충돌 지점을 중심으로 가로 3, 세로 1 범위의 플랫폼을 파괴
        FindObjectOfType<PrinterPlatformManager>().DestroyPlatformsInArea(hitPoint, new Vector2(3f, 1f));
    }
}

 


 

3. 작업 중 변경사항

  • 페이즈 전환 패턴시 랜덤하게 나오는 발판패턴 -> 고정된 발판패턴으로 변경
    사유: 중요한 패턴이기에 게임에 익숙하지 않은 플레이어가 반복적으로 외워서라도 클리할수있도록 하였다

4. 소요 시간

항목시간
예상 소요 시간 8시간
실제 소요 시간 12시간 - 집중력이 조금 낮았다 더 집중했다면 훨씬 잘 마무리했을것 같다

5. 작업 중 애로사항

  • 랜덤발판 사용시 클리어가 불가능하도록 GiantPaper가 생성되는경우가있었다
    현재 발판 위치와 이전 발판 위치등을 사용해 최대 5이상 차이가 안나도록하여서 해결하려 했으나
    고정값으로 변경해서 해결되었다

6. 예상되는 문제점

  • 실제 애니메이션 적용시
    지금은 기본 하얀 Img에 Collider또한 간단하여 잘 작동하지만 만일 실제 애니메이션적용시 Collider 차이로 발판에 낀다거나 플랫폼이 제대로 파괴되지않는 경우 가 생길수 있을 것 같다 그럴때는 실제 애니메이션과 다르게 BoxCollider를 사용한다던가 하는 방법을 생각해 봐야 할 것 같다
  • 보스의 State변환
    현재 잘 작동하도록 만들어두긴 하였으나 워낙 스크립트가 이곳 저곳 옮겨다니며 State변환 메세지를 StateMachine으로 전달하다보니 완성과정에서 꼬인다면 감당 못할수도 있을것 같다
  • 애니메이션
    애니메이션 관련 아직 완벽히 잡히지가 않아 보류한상태로 제작을하고있는데 후에 애니메이션 처리과정이 복잡해질수 있을듯하여 기본적인 체계는 잡아두려고한다
  • 횡 공격
    횡공격에 대한 의견이 분분해 아직 하나로 정해서 만들지 못하고있다 여려 자료를 참고하고있으나 아직 부족한 부분이많다

7. 다음 작업 계획

  • PrinterAnimation && 횡공격 패턴