Unity 22일차 - Unity 팀 프로젝트

한예준·2025년 5월 8일

오늘은 팀 프로젝트를 시작했다. 내가 맡은 부분은, 플레이어 움직임 등 구현, 도전과제 시스템 구현, 플레이어 커스터마이징 시스템 구현이었다. 오늘은 플레이어 움직임에 중점을 두고 실습을 진행해보았다.


팀 프로젝트 진행 내용

PlayerController

  • 자동 이동, 점프, 더블 점프, 슬라이딩 로직을 구현하였다.

  • 평소보다 움직임 로직이 많기 때문에, 각각의 움직임을 실행할 수 있는 조건을 설정하는 것이 까다로웠다.

    • 먼저, 바닥에 있는 경우를 판단하기 위해 플레이어 오브젝트의 발 밑에 BoxCollider 2D 컴포넌트를 붙여주었다.
    • 다음으로, 바닥에 해당하는 Layer를 확인하기 위해 LayerMask를 가져왔다.
    • 그 다음, Collider가 Layer와 충돌하고 있는지를 판단하였다.
      isGrounded = groundDetector.IsTouchingLayers(LayerMask.GetMask("Ground"));
    • 다음으로 isSliding, isJumping 등의 불리언 변수를 이용하여 움직임 여부를 판단했다.
      • 예를 들어, isGrounded == false이고 isJumping == true 일 때는 슬라이딩을 할 수 없게 만들기 위해 다음과 같은 방식으로 움직임 조건을 설정하였다.
                  if (Input.GetKey(KeyCode.LeftShift) && isGrounded && !isSliding)
              {
                  StartSlide();
              }
    • 슬라이딩할 때와 평소 움직일 때의 충돌범위가 달라야 했기 때문에, PlayerColliderslidingCollider를 전부 붙여주었다.
      • 평소 달리거나 점프할 때는 SlidingCollider는 끄고 PlayerCollider가 켜져있는 상태이고 슬라이딩 할 때는 PlayerCollider를 끄고 SlidingCollider를 켜는 방식으로 구현하였다.
  • 다음으로 시간에 따라 속도가 증가하는 로직과 체력이 감소하는 로직을 만들었다.

    • 코루틴을 사용하였다.
      [SerializeField] private float healthdecreaseAmount = 0.1f; // 체력 감소량
      [SerializeField] private float healthdecreaseInterval = 0.1f; // 체력 감소 시간
      [SerializeField] private float speedUpInterval = 10f; // 속도 증가 시간
      [SerializeField] private float speedUpAmount = 1f; // 속도 증가량
    .
    .
    .
    void Start()
    {
          StartCoroutine(SpeedUp()); // 시간에 따라 속도 증가
          StartCoroutine(HpDecrease()); // 시간에 따라 체력 감소
    }
    .
    .
    .
      private IEnumerator SpeedUp()
      {
          while (!isDead)
          {
              yield return new WaitForSeconds(speedUpInterval);
              speed += speedUpAmount;
              Debug.Log("Speed Up: " + speed); // 속도 증가 사운드, 이펙트, UI 등 추가
          }
      }
    
      private IEnumerator HpDecrease()
      {
          while (!isDead)
          {
              yield return new WaitForSeconds(healthdecreaseInterval);
              currenthealth -= healthdecreaseAmount;
              Debug.Log("Health Decrease: " + currenthealth); // 체력 감소 이펙트, UI 등 추가
              if (currenthealth <= 0)
                  Die();
          }
      }
  • 추후 추가할 회복 아이템을 위한 Heal 메서드나 Die 메서드 등을 만들었다.

  • 이후 강의에서 배운 ParticleSystem을 활용한 애니메이션을 만들었다.


도전과제 시스템 기반 작업

  • 도전과제 시스템을 구현하기 위한 기반 작업을 진행하였다.

    • 먼저 PlayerController.cs에 업적을 위한 수치들을 설정할 필드를 생성했다.
      public int damagedTimes; // 데미지 입은 횟수
      public int ObstacleCount; // 장애물 수
      public int ObstacleComboCount; // 데미지를 입지 않고 넘은 장애물 수
      .
      .
      .
    • 현재는 TakeDamage()메서드에서 데미지 입은 횟수나 콤보를 갱신하는 데에 머물렀지만, 추후 추가해나갈 예정이다.
      public void TakeDamage(float damage)
      {
          if (isDead) return;
    
          damagedTimes++; // 데미지 입은 횟수 증가
          ObstacleComboCount = 0; // 장애물 콤보 초기화
          currenthealth -= damage; // 체력 감소
          animator.SetTrigger("IsDamage");
    
          if (currenthealth <= 0)
              Die();
      }

프로젝트 관리

  • 팀 프로젝트를 진행하면서 깃허브 충돌이 일어나는 등의 문제가 발생한 적이 한두번이 아니기에 최대한 이를 막기 위해 여러가지 방법을 생각해보았다.
    • 먼저, 내가 작업하는 폴더를 따로 생성하여 이 안에서만 작업을 진행하였다.
    • 다음으로, 내가 진행할 씬을 따로 생성하여 이 안에서만 작업을 진행했다.
    • public 접근 제한자를 최대한 사용하지 않고, private, [SerializeField] private을 최대한 사용하도록 했다.
    • 다행히 아직까지는 충돌이 발생하지 않았다.

발전 방향

  • 현재 PlayerController.cs에서 너무 많은 기능을 담당하고 있다.
    • PlayerController.cs는 플레이어 오브젝트에 움직임만을 담당하고, 따로 체력, 도전과제 진행여부 등의 관리를 담당할 수 있는 스크립트를 만드는 것이 유지/보수에 편리할 것이라 생각한다.
  • 다음으로 캐릭터 커스터마이징에 대한 부분을 고민해보아야 할 것 같다. 현재 생각하고 있는 방식은 다음과 같다.
    • 플레이어 오브젝트에 PlayerCustom 등의 스크립트를 붙인다.
    • 플레이어 오브젝트의 각 부위에 자식으로 각 슬롯 sprite 오브젝트를 붙인다.
    • PlayerCustom 스크립트에 Slot 등의 이름을 가진 구조체로 부위 이름과 해당 부위에 붙일 SpriteRenderer를 정의한다.
    • 지정된 부위에 새로운 Sprite를 적용하는 방식으로 커스터마이징한다.

회고 및 느낀점

  • 여러 움직임과 여러 기능을 한 스크립트에 담으니 작업 속도는 빨랐지만, 유지 보수를 위해서는 적절하게 분리를 해줘야 할 것 같다.
  • 작업 초기에 더블 점프 애니메이션이 호출되지 않거나 슬라이딩이 빠른 속도로 반복되어 호출되는 등의 오류가 발생하여 한참을 헤맸지만, 이제 어느 부분에서 문제가 생겼는지 파악하는 데에 드는 시간이 매우 단축되어 어렵지 않게 해결할 수 있었다.
  • 씬과 폴더를 분리해 두고 작업하니 충돌없이 merge할 수 있었다.
  • 이제부터 본격적으로 다른 팀원들이 진행한 작업들과 병합할텐데 다른 팀원들이 진행한 내용도 잘 파악하여 최대한 협업이 잘 이루어질 수 있게끔 노력하겠다.
  • 오늘은 생각보다 작업 진행이 수월하게 되어 즐겁게 작업했다.
  • 내일도 오늘처럼 계획한대로 진행해보도록 하겠다.

0개의 댓글