📝 24.02.16
팀 프로젝트 발표를 했다. 우리 팀은 기획부터 힘들거라 판단한 3D 퍼즐 게임을 만든 팀이 많아서 신기한 동시에 나도 도전해보고 싶다는 생각도 들었다.
이번 프로젝트는 2D 디펜스 게임이었다.
🔗 깃허브 링크 : https://github.com/purangi/OutOfWork
우리는 '팔라독'이라는 게임을 가장 주요하게 벤치마킹하였고, 이번에 내가 담당한 것은 스킬과 스킬 트리이다.
이 중 스킬 트리를 가장 신경썼다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class SkillTree : MonoBehaviour
{
public enum SkillType
{
DecreaseCool,
increaseAtk,
increaseAtkSphere
}
public SkillType type;
public bool isUnlocked = false;
[SerializeField] private int amount;
[SerializeField] private int price;
[SerializeField] TextMeshProUGUI priceTxt;
[SerializeField] AudioClip errorSound;
public SkillTree prevTree;
public void CanOpen()
{
if(prevTree.isUnlocked)
{
if (!isUnlocked && IsPointEnough())
UnLock();
}
}
private void UnLock()
{
switch((int)type)
{
case 0:
SkillManager.instance.decreaseCool(amount);
break;
case 1:
SkillManager.instance.increaseAtk(amount);
break;
case 2:
SkillManager.instance.increaseAtkSphere();
break;
}
SkillManager.instance.skillPoint -= price;
isUnlocked = true;
SkillTreeController.instance.UnlockInteract();
}
private bool IsPointEnough()
{
if (SkillManager.instance.skillPoint >= price) return true;
SoundManager.instance.PlaySFX(errorSound);
return false;
}
}
그리고 이를 관리하기 위해 SkillTreeController도 작성했다.
SkillTreeController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SkillTreeController : MonoBehaviour
{
[SerializeField] List<GameObject> skillTrees;
[SerializeField] List<Animator> linesAnim;
public static SkillTreeController instance;
private void Awake()
{
instance = this;
}
void Start()
{
LoadUnlocked();
UnlockInteract();
}
public void UnlockInteract()
{
for(int i = 1; i < skillTrees.Count; i++)
{
SkillTree tree = skillTrees[i].GetComponent<SkillTree>();
SkillTree prevTree = tree.prevTree;
Button btn = skillTrees[i].GetComponent<Button>();
if(prevTree.isUnlocked && !tree.isUnlocked)
{
btn.interactable = true;
linesAnim[i-1].SetBool("isInteractable", true);
} else
{
btn.interactable = false;
if(tree.isUnlocked)
{
linesAnim[i - 1].SetTrigger("Unlocked");
}
}
}
SaveUnlocked();
}
private void SaveUnlocked()
{
for(int i = 0; i < skillTrees.Count; i++)
{
SkillTree tree = skillTrees[i].GetComponent<SkillTree>();
SkillManager.instance.SaveUnlocked(i, tree.isUnlocked);
}
}
private void LoadUnlocked()
{
for (int i = 0; i < skillTrees.Count; i++)
{
SkillTree tree = skillTrees[i].GetComponent<SkillTree>();
tree.isUnlocked = SkillManager.instance.treeUnlocked[i];
}
}
}
스킬 트리를 만든 것은 좋았는데, 이를 저장하고 불러오는 것을 빼놓았어서 뒤늦게 작성한 스크립트이다. isLocked
를 SkillManager에 저장하고 불러오는 기능을 통해 스킬 트리를 제어하도록 하였다.
이와 함께 SoundManager도 구현하였는데, 여기서 큰 오류가 발생했었다.
📕 [버그] SoundManager에서 씬 변화할 때 bgmPlayer를 찾지 못하는 문제
해당 버그의 해결 과정은 위의 링크에 적어두었다.
어쨌든 이번주에도 프로젝트를 잘 마무리 하였다. 실력이 비약적으로 성장하고 있지는 않지만 점점 오브젝트 관리나 스크립트 분리 등의 디테일이 늘고 있다고 생각한다. 심화 주차도 열심히 달려보겠다.
오늘의 알고리즘 문제는 성능으로 인해 문제 풀이에 어려움을 겪어 포스팅하였다.