[내배캠] 유니티 심화 팀프로젝트 마무리

Sungchan Ahn(안성찬)·2024년 11월 22일

내일배움캠프

목록 보기
67/104

코드 개선점

  1. Scriptable Object 데이터 캐싱해서 사용하기
    플레이어 스탯(데미지, 발사 속도)을 강화하는 아이템의 경우 Player의 SO 값을 직접 건드리고 스테이지가 바뀌면 초기화하는 방식으로 작성했다.
    다시 초기화해주는 과정 없이 SO의 값을 캐싱해서 내부에서 사용하는 방식이 더 좋았을 것 같다.
    예를 들어 PlayerSO에 shootCoolTime 변수와 upgradeShootCoolTimeValue 라는 변수를 만들어 각각 플레이어의 발사 속도와 발사 속도 강화값으로 사용했다. 아래의 코드가 PlayerSO이다.
public float shootCoolTime;
public float upgradeShootCoolTimeValue;

public void ChangeUpgradeShootCoolTimeValue(float amount)
{
    upgradeShootCoolTimeValue = Mathf.Clamp(upgradeShootCoolTimeValue - amount, 0.3f, 1f);
}

public float UpgradeShootCoolTime()
{
    float changed = shootCoolTime * upgradeShootCoolTimeValue;
    return changed;
}

public void InitPlayerStat()
{
    playerMoveSpeed = 5f;
    shootCoolTime = 0.4f;
    shootDamage = 5f;
    upgradeShootCoolTimeValue = 1f;
}

PlayerShooting 클래스에서 발사를 관리하고 있는데 여기서 shootCoolTime을 캐싱해서 사용했지만, upgradeShootCoolTimeValue는 SO에 작성된 메서드로 직접 바꾸고 있었다. 이때 upgrade~Value도 캐싱해서 사용하면 나중에 PlayerSO의 값을 불필요하게 초기화하지 않아도 된다.

다만, SO 데이터를 직접 건드려서 사용하는 경우는 SO의 변수를 여러 클래스에서 필요로 할 때 접근이 편하다는 장점이 있다.

  1. Interface 말고 추상클래스로 구현해보기
    아이템이나 장애물의 경우 생각보다 데이터나 메서드, UI 등에서 공통점이 많아서 추상클래스를 사용하여 관리해보는 것도 괜찮았을 것 같다.

  2. interface ICollisionHandler를 더 작은 단위로 적절하게 분리해서 사용하기
    여러 곳에서 사용한 interface인데 어떤 클래스에서는 interface에서 선언된 메서드 중에서 필요하지 않은 메서드도 있었기 때문에 좀 더 작게 나눠 사용했으면 불필요한 메서드 호출을 막을 수 있었을 것 같다.

profile
게임 개발 기록

0개의 댓글