Skip to content

Instantly share code, notes, and snippets.

@wannasaynone
Last active July 25, 2019 15:36
Show Gist options
  • Save wannasaynone/fa48d167b4f8e024d7fdf97e58433a77 to your computer and use it in GitHub Desktop.
Save wannasaynone/fa48d167b4f8e024d7fdf97e58433a77 to your computer and use it in GitHub Desktop.
coding sample
public void SkipDays(int days) // 這是一個放在GameManager中,供呼叫"每日結算"的公用方法
{
// 在這裡會先將每日結算時會使用到的資料做初始化與設定
m_dayResult.totalSkipedDays = 0;
m_dayResult.gainMoney = 0;
for (int i = 0; i < days; i++)
{
m_dayResult.totalSkipedDays++;
m_dayResult.gainMoney += GameUtility.GetSubPayMoney();
}
// 由於每日結算時有相當的UI與邏輯需要「輪流執行」
// 所以設計了一個繼承了IProcessable的抽像類別叫EndDayStep
// IProcessable是一個自訂的介面,供後面的Processer類別使用
// IProcessable與Processer的關係類似於IEnumerable與foreach
// 不同點在於Processer的MoveNext的時機點作用於內傳事件callback時
// 以此方法實做每日結算的「流程」,達成好讀、好改、好擴充的目標
if(m_endDaySteps == null) // 由於個人習慣,物件的初始化不會集中在同一處(例如建構子內),而是要用到的時候才進行初始化
{
m_endDaySteps = new EndDayStep[]
{
new StartEndDayStep(),
new CheckUploadableFilmStep(),
new CheckMilestoneStep(m_milestoneChecker),
new ShowPreviousDaysResult()
};
for (int i = 0; i < m_endDaySteps.Length; i++)
{
m_endDaySteps[i].Init(m_dayResult); // 由於m_dayResult是類別,屬reference type,故Init時傳入一次就好
}
}
if(m_endDayStepProcesser == null)
{
m_endDayStepProcesser = new Processer<EndDayStep>(m_endDaySteps);
}
m_endDayStepProcesser.Start(StartNewDay); // 當上面的「流程」結束後,呼叫StartNewDay這個方法
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment