TIL(2024,07,01)최종 프로젝트 1차구현 하나씩 만들기

김보근·2024년 7월 1일

Unity

목록 보기
28/113

오늘은 ResourceManager 스크립트 작성과 5레벨마다 이미지 업데이트 강화할때 소모하는 재화와 증가 지면크기 업데이트를 만들어볼것이다.

Unity 자원 관리 시스템과 UI 업데이트

이 스크립트는 물이라는 주요 자원을 관리하는 시스템을 구현합니다. 물의 양을 증가 및 감소시키는 메서드, 물의 양에 따라 레벨을 업그레이드하는 메서드, 그리고 UI 요소를 업데이트하는 메서드들이 포함되어 있습니다.

1. 변수 선언 및 초기 설정

먼저, 자원과 관련된 변수와 UI 요소를 선언합니다. Header 속성을 사용하여 인스펙터에서 보기 쉽게 그룹화합니다.

public class ResourceManager : MonoBehaviour
{
    [Header("Resource Fields")]
    public int waterAmount = 0;
    public int currentLevel = 1;
    public int waterPerLevel = 10; // 레벨 당 필요한 물의 양
    private const int maxWaterAmount = 200; // 물의 최대 양

    [Header("UI Elements")]
    public TextMeshProUGUI waterText; // 물의 재화량을 표시할 텍스트
    public TextMeshProUGUI levelText; // 현재 레벨을 표시할 텍스트
    public Image levelFillImage; // 레벨 바 이미지
    public Image currentTreeImage; // 현재 나무 이미지
    public Image upgradedTreeImage; // 강화된 나무 이미지
    public SpriteRenderer outsideTreeSpriteRenderer; // 밖에 있는 나무 이미지
    public TextMeshProUGUI upgradeRequirementText; // 강화에 필요한 재화를 표시할 텍스트
    public SpriteRenderer groundSpriteRenderer; // 지면의 SpriteRenderer 컴포넌트
    public Sprite[] treeImages; // 나무 이미지를 담을 배열

    // 초기 설정
    void Start()
    {
        UpdateUI(); // 초기 UI 업데이트
    }

2. 물의 양 증가 및 감소 메서드

물의 양을 증가시키거나 감소시키는 메서드입니다. 이 메서드들은 각각 IncreaseWaterDecreaseWater로 정의됩니다. 이 메서드들이 호출될 때마다 UpdateUI 메서드를 호출하여 UI를 업데이트합니다.

    // 물의 양을 증가시키는 메서드
    public void IncreaseWater(int amount)
    {
        waterAmount += amount;
        UpdateUI();
    }

    // 물의 양을 감소시키는 메서드
    public void DecreaseWater(int amount)
    {
        waterAmount -= amount;
        UpdateUI();
    }

3. 레벨 업그레이드 메서드

현재 물의 양이 업그레이드에 필요한 양보다 많거나 같을 때 레벨을 업그레이드하는 메서드입니다. 물의 양을 감소시키고 현재 레벨을 증가시킵니다. 그 후 UpdateUI와 UpdateGroundSize 메서드를 호출하여 UI와 지면 크기를 업데이트합니다.

    // 레벨을 업그레이드하는 메서드
    public void UpgradeLevel(int amount)
    {
        int waterNeededForUpgrade = (currentLevel + amount) * waterPerLevel;

        if (waterAmount >= waterNeededForUpgrade)
        {
            DecreaseWater(waterNeededForUpgrade);
            currentLevel += amount;
            UpdateUI();
            UpdateGroundSize();
        }
        else
        {
            Debug.Log("물이 부족하여 강화할 수 없습니다.");
        }
    }

4. 지면 크기 업데이트 메서드

현재 레벨에 따라 지면 크기를 업데이트하는 메서드입니다. 레벨이 증가함에 따라 지면의 크기가 커지도록 설정합니다.

    // 지면 크기를 업데이트하는 메서드
    private void UpdateGroundSize()
    {
        float groundScale = 8f + (currentLevel / 10f); // 레벨에 따른 지면 크기 계산
        groundSpriteRenderer.transform.localScale = new Vector3(groundScale, groundScale, groundScale);
    }

5. UI 업데이트 메서드

현재 물의 양과 레벨을 UI에 반영하는 메서드입니다. 레벨 바의 fill amount, 텍스트, 나무 이미지 등을 업데이트합니다.

    // UI를 업데이트하는 메서드
    public void UpdateUI()
    {
        // 현재 레벨에 필요한 물의 양 계산
        int waterNeededForCurrentLevel = (currentLevel + 1) * waterPerLevel;
        waterText.text = $"Water: {waterAmount}";
        levelText.text = $"Level: {currentLevel}";
        levelFillImage.fillAmount = (float)waterAmount / waterNeededForCurrentLevel;

        // 나무 이미지 업데이트
        UpdateTreeImages();

        // 업그레이드에 필요한 재화 텍스트 업데이트
        upgradeRequirementText.text = $"필요한 재화: {waterNeededForCurrentLevel} 물 ";
    }

    // 나무 이미지를 업데이트하는 메서드
    private void UpdateTreeImages()
    {
        int currentIndex = currentLevel / 5;
        int nextIndex = (currentLevel + 1) / 5;

        currentTreeImage.sprite = treeImages[currentIndex];
        upgradedTreeImage.sprite = treeImages[nextIndex];
        outsideTreeSpriteRenderer.sprite = treeImages[currentIndex];
    }
}

이 스크립트는 게임 내에서 자원(물)을 관리하고, 그에 따라 레벨을 업그레이드하며, UI를 적절하게 업데이트한다. 이로 인해 플레이어는 현재 자원 상태와 레벨을 명확히 파악할 수 있습니다.

고찰

지금보면 한개의 스크립트에 하드 코딩이 되어있는것같다... 이를 고민해서 리팩토링을 하는방법을 생각해 보아야겠다..

profile
게임개발자꿈나무

0개의 댓글