오늘은 ResourceManager 스크립트 작성과 5레벨마다 이미지 업데이트 강화할때 소모하는 재화와 증가 지면크기 업데이트를 만들어볼것이다.
이 스크립트는 물이라는 주요 자원을 관리하는 시스템을 구현합니다. 물의 양을 증가 및 감소시키는 메서드, 물의 양에 따라 레벨을 업그레이드하는 메서드, 그리고 UI 요소를 업데이트하는 메서드들이 포함되어 있습니다.
먼저, 자원과 관련된 변수와 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 업데이트
}
물의 양을 증가시키거나 감소시키는 메서드입니다. 이 메서드들은 각각 IncreaseWater와 DecreaseWater로 정의됩니다. 이 메서드들이 호출될 때마다 UpdateUI 메서드를 호출하여 UI를 업데이트합니다.
// 물의 양을 증가시키는 메서드
public void IncreaseWater(int amount)
{
waterAmount += amount;
UpdateUI();
}
// 물의 양을 감소시키는 메서드
public void DecreaseWater(int amount)
{
waterAmount -= amount;
UpdateUI();
}
현재 물의 양이 업그레이드에 필요한 양보다 많거나 같을 때 레벨을 업그레이드하는 메서드입니다. 물의 양을 감소시키고 현재 레벨을 증가시킵니다. 그 후 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("물이 부족하여 강화할 수 없습니다.");
}
}
현재 레벨에 따라 지면 크기를 업데이트하는 메서드입니다. 레벨이 증가함에 따라 지면의 크기가 커지도록 설정합니다.
// 지면 크기를 업데이트하는 메서드
private void UpdateGroundSize()
{
float groundScale = 8f + (currentLevel / 10f); // 레벨에 따른 지면 크기 계산
groundSpriteRenderer.transform.localScale = new Vector3(groundScale, groundScale, groundScale);
}
현재 물의 양과 레벨을 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를 적절하게 업데이트한다. 이로 인해 플레이어는 현재 자원 상태와 레벨을 명확히 파악할 수 있습니다.
지금보면 한개의 스크립트에 하드 코딩이 되어있는것같다... 이를 고민해서 리팩토링을 하는방법을 생각해 보아야겠다..
