더 많은 스테이지 구조를 위해 BaseTileMap도 저장해서 생성하도록 하였고,
StageID의 저장된 데이터를 불러와 화면에 표시해주는 Preview 기능과
기존에 존재하는 프리셋이 있으면 확인 후 덮어쓰는 Overwrite 기능을 추가하였다.
// 프리셋 덮어쓰기
private void OverwritePreset(StagePresetTool tool)
{
string path = $"{PATH}Stage_{tool.stageID}.asset";
StagePreset exist = AssetDatabase.LoadAssetAtPath<StagePreset>(path);
if (exist == null)
{
Debug.LogWarning("Doesn't Exist Preset to Overwirte");
return;
}
if (!EditorUtility.DisplayDialog("Check Overwrite", $"Overwrite {tool.stageID} Preset?", "Yes", "No"))
{
return;
}
// 새로운 임시 ScriptableObject를 만들어 데이터 채움
StagePreset temp = CreateInstance<StagePreset>();
SaveDataToPreset(tool, temp);
// 기존 프리셋에 덮어쓰기
EditorUtility.CopySerialized(temp, exist);
EditorUtility.SetDirty(exist);
AssetDatabase.SaveAssets();
Debug.Log($"StagePreset(ID: {tool.stageID})is Overwrited");
}
// 프리셋 미리보기
private void PreviewPreset(StagePresetTool tool)
{
StagePreset[] presets = Resources.LoadAll<StagePreset>("StagePresets");
StagePreset preset = presets.SingleOrDefault(p => p.stageID == tool.stageID);
if (preset == null)
{
Debug.LogWarning($"Doesn't Exist Preset (ID: {tool.stageID})");
return;
}
tool.stageManager.PreviewStage(preset);
}


간단하게 아이템도 추가를 했다.
using UnityEngine;
public abstract class ItemBase : MonoBehaviour
{
protected virtual void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.CompareTag("Player"))
{
UseItem(other.GetComponent<BaseCharacter>());
}
}
abstract protected void UseItem(BaseCharacter player);
}
using UnityEngine;
public class HealItem : ItemBase
{
[SerializeField] int value = 10;
protected override void UseItem(BaseCharacter player)
{
player.currentHealth += value;
Destroy(gameObject);
}
}
어떤 아이템들을 추가하면 좋을지 구상 중이다.
에디터 기능을 직접 구현해보면서 ScriptableObject를 활용하는 법을 더 잘 이해하게 됐다. Overwrite나 Preview 기능 덕분에 프리셋 작업이 훨씬 편해졌다.
아이템 시스템도 기본 구조를 만들었고, 앞으로 다양한 아이템을 쉽게 추가할 수 있을 것 같다.
하나하나 만들어가면서 점점 시스템이 갖춰지는 게 개발의 즐거움인 거 같다.