EasyCastleUNITY

미션 만들기 (저장 빼고) 본문

C#프로그래밍

미션 만들기 (저장 빼고)

EasyCastleT 2023. 7. 30. 21:41

하는 게임이 없어서 예시 정보 그대로 사용 

데이터 저장 클래스

MissionData

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class MissionData
    {
        public int id; //미션 데이터 id 
        public string name; //이름
        public int goal; //완료해야 되는 미션 횟수
        public int reward_item_id; //보상 아이템 id
        public int reward_item_amount; //보상 아이템 수량 
    }
}

RewardItemData

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class RewardItemData
    {
        public int id; //아이템 id 
        public string name; //아이템 이름
    }
}

--------------------------------------------------------------------------------------------------------------------

변화하는 정보 info

MissionInfo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class MissionInfo
    {//저장객체 
        //멤버 
        public int id;
        public int goal;
        public int reward_item_amount;
        //생성자 
        public MissionInfo(int id, int goal, int reward_item_amount)
        {
            this.id = id;
            this.goal = 0;
            this.reward_item_amount = reward_item_amount;
        }
    }
}

RewardItemInfo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class RewardItemInfo
    {
        //멤버
        public int id;
        public string name;
        //생성자
        public RewardItemInfo(int id,string name)
        {
            this.id = id;
            this.name = name;
        }
    }
}

----------------------------------------------------------------------------------------------------------

데이터 관리 DataManager

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Newtonsoft.Json;

namespace Misson
{
    //싱글톤 패턴 이용, 언제 어디서나 접근 가능 
    public class DataManager
    {
        public static readonly DataManager instance = new DataManager();
        //mission 정보를 저장하는 사전 
        Dictionary<int, MissionData> missionDic = new Dictionary<int, MissionData>();
        //보상 아이템 정보를 저장하는 사전
        Dictionary<int, RewardItemData> rewardItemDic = new Dictionary<int, RewardItemData>();
        //json 파일을 통해 받아온 정보를 저장할 MissionData 배열 
        MissionData[] missionDatas;
        //json 파일을 통해 받아온 정보를 저장할 RewardItemData 배열 
        RewardItemData[] rewardItemDatas;

        //생성자, 싱글톤 패턴이기에 생성자에 접근 할 수 없도록 private 사용 
        private DataManager()
        {

        }
        //MissionData 정보를 json 파일에서 읽어오는 메서드 
        public void LoadMissionData()
        {
            string json = File.ReadAllText("./mission_data.json");
            missionDatas = JsonConvert.DeserializeObject<MissionData[]>(json);
            foreach(MissionData missionData in missionDatas)
            {
                missionDic.Add(missionData.id, missionData);
            }
        }
        //RewardItemData 정보를 json 파일에서 읽어오는 메서드 
        public void LoadRewardItemData()
        {
            string json = File.ReadAllText("./reward_item_data.json");
            rewardItemDatas = JsonConvert.DeserializeObject<RewardItemData[]>(json);
            foreach (RewardItemData rewardItemData in rewardItemDatas)
            {
                rewardItemDic.Add(rewardItemData.id, rewardItemData);
            }
        }
        //Mission 데이터 반환
        public MissionData GetMissionData(int id)
        {
            return missionDic[id];
        }
        //RewardItem 데이터 반환 
        public RewardItemData GetRewardItemData(int id)
        {
            return rewardItemDic[id];
        }
    }
}

----------------------------------------------------------------------------------------------------------

실제 생성 클래스 

Mission

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class Mission
    {
        
        public MissionInfo info;
        public Action onClear;
        public MissionData data;
        //생성자
        public Mission(MissionInfo info)
        {
            this.info = info;
            data = DataManager.instance.GetMissionData(info.id);
        }
        public int GetMissionGoal()
        {
            return this.info.goal;
        }
        public int GetMissionItemId()
        {
            return this.data.reward_item_id;
        }
        public void Clear()
        {
            if(data.goal == info.goal)
            {
                this.onClear();
                Console.WriteLine("미션이 완전히 종료");
            }
        }
    }
}

RewardItem

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class RewardItem
    {
        private RewardItemInfo info;
        private RewardItemData data; 
        //생성자
        public RewardItem(RewardItemInfo info)
        {
            this.info = info;
            this.data = DataManager.instance.GetRewardItemData(info.id);
            Console.WriteLine("{0} 생성", data.name);
        }
    }
}

----------------------------------------------------------------------------------------------------------

실행

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Misson
{
    public class App
    {
        private Mission mission;
        private RewardItem rewardItem;
        public App()
        {
            //-----------------환경구성--------------------------
            DataManager.instance.LoadMissionData();
            DataManager.instance.LoadRewardItemData();

            //------------------시작-----------------------
            Console.WriteLine("시작");
            this.mission = this.CreateMission(1000);
            this.mission.onClear = () => { //goal이 목표지점에 도달했다는 것을 가져옴
                //보상 아이템 생성 
                int rewardId = this.mission.GetMissionItemId();
                rewardItem = this.CreateRewardItem(rewardId);

            };
            for(int i = 0; i < 7; i++) //미션 일곱번 클리어 
            {
                this.MissionClear(this.mission);
               // Console.WriteLine(this.mission.info.goal);
            }

        }
        //미션 생성 
        public Mission CreateMission(int id)
        {
            MissionData data = DataManager.instance.GetMissionData(id);
            MissionInfo info = new MissionInfo(data.id, data.goal, data.reward_item_amount);
            return new Mission(info);
        }
        //보상 아이템 생성 
        public RewardItem CreateRewardItem(int id)
        {
            RewardItemData data = DataManager.instance.GetRewardItemData(id);
            RewardItemInfo info = new RewardItemInfo(data.id, data.name);
            return new RewardItem(info);
        }
        //미션 클리어 
        public void MissionClear(Mission mission)
        {
            int goal = mission.GetMissionGoal();
            goal++;
            mission.info.goal = goal;
            mission.Clear();
        }
    }
}

reward_item_data.json
0.00MB
mission_data.json
0.00MB