ãšãã°ã©ãïŒ
ãã©ãããããããããããªãå Žåãã©ã®ããã«è©äŸ¡ããŸããïŒã
-ãŸããç»é¢ãšãã¿ã³ããããŸãã
-ãã£ããããªãã¯ä»ãç§ã®äººçã3ã€ã®èšèã§èª¬æããŠããŸãïŒ
ïŒcïŒã²ãŒã äŒç€Ÿã®éäŒã§ã®çã®å¯Ÿè©±ãã®èšäºã§èª¬æããäžé£ã®ããŒãºãšãœãªã¥ãŒã·ã§ã³ã¯ãæåã«Flashã§ãåŸã«Unityã§ãçŽ12ã®å€§èŠæš¡ãããžã§ã¯ãã«åå ããŠåœ¢æãããŸããã æ倧ã®ãããžã§ã¯ãã«ã¯200,000ãè¶
ããDAUãããã貯éç®±ã«æ°ããªèª²é¡ãè¿œå ãããŸããã äžæ¹ã以åã®èª¿æ»çµæã®é¢é£æ§ãšå¿
èŠæ§ââã確èªãããŸããã
ç§ãã¡ã®å³ããçŸå®ã§ã¯ãå°ãªããšãäžåºŠã¯å€§èŠæš¡ãªãããžã§ã¯ããå°ãªããšãäžåºŠã¯èªåã®èãã§èšèšãã人ã¯èª°ã§ãããããè¡ãæ¹æ³ã«ã€ããŠç¬èªã®ã¢ã€ãã¢ãæã¡ãå€ãã®å ŽåãæåŸã®äžæ»ŽãŸã§ã¢ã€ãã¢ãå®ãæºåãã§ããŠããŸãã ä»ã®äººã«ãšã£ãŠã¯ãããã¯ç§ãç¬é¡ã«ããŸãããããŠãçµå¶è
ã¯ãã°ãã°ãããããã¹ãŠã誰ã«ãè² ããŠããªã巚倧ãªãã©ãã¯ããã¯ã¹ãšèŠãªããŸãã ããããæ£ãããœãªã¥ãŒã·ã§ã³ããæ°ããæ©èœã®äœæã2ã3åãå€ã5ã10åã®ãšã©ãŒã®æ€çŽ¢ãåæžãã以åã¯ã¢ã¯ã»ã¹ã§ããªãã£ãå€ãã®æ°ããéèŠãªããšãè¡ããããã«ãªããšãããã©ãã§ããããã 建ç¯ç©ãããªãã®å¿ã«å
¥ããã®ã«ååã§ãïŒ
ã¢ãã€ã«ã²ãŒã ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã ããŒã2ïŒã³ãã³ããšãã®ãã¥ãŒã¢ãã€ã«ã²ãŒã ã®ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã ããŒã3ïŒãžã§ããæšåã®è¡šç€ºã¢ãã«
ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹
ã»ãšãã©ã®ããã°ã©ããŒã¯ãMVCã®ãããªãã®ã䜿çšããããšã®éèŠæ§ãèªèããŠããŸãã 4人ã®ã®ã£ã³ã°ã®æ¬ã®çŽç²ãªMVCã䜿çšãã人ã¯ã»ãšãã©ããŸããããéåžžã®ãªãã£ã¹ã®ãã¹ãŠã®ãœãªã¥ãŒã·ã§ã³ã¯ããã®ãã¿ãŒã³ã®ç²Ÿç¥ã«äœããã®åœ¢ã§äŒŒãŠããŸãã ä»æ¥ã¯ããã®ç¥èªã®æåã®æåã«ã€ããŠã話ããŸãã ã¢ãã€ã«ã²ãŒã ã§ã®ããã°ã©ãã®äœæ¥ã®å€§éšåã¯ãã¡ã¿ã²ãŒã ã®æ°æ©èœã§ãããã¢ãã«ã®æäœãšããŠå®è£
ããããããã®æ©èœã«äœåãã®ã€ã³ã¿ãŒãã§ã€ã¹ããã蟌ãã§ããŸãã ãã®ã¬ãã¹ã³ã§ã¯ãã¢ãã«ã®å©äŸ¿æ§ãéèŠãªåœ¹å²ãæãããŸãã
å®å
šãªã³ãŒãã¯æäŸããŸããããããã¯ã¡ãã£ãšãããã®ã§ãäžè¬çã«ã¯åœŒã«é¢ãããã®ã§ã¯ãªãããã§ãã ç§ã¯ç°¡åãªäŸã䜿ã£ãŠæšè«ã説æããŸãã
public class PlayerModel { public int money; public InventoryModel inventory; public void SomeTestChanges() { money = 10; inventory.capacity++; } }
ãã®ãªãã·ã§ã³ã¯ãã¢ãã«ã§çºçããå€æŽã«é¢ããã€ãã³ããéä¿¡ããªãããããŸã£ããé©ããŠããŸããã ã©ã®ãã£ãŒã«ããå€æŽã®åœ±é¿ãåããã©ã®ãã£ãŒã«ããå€æŽããããã©ã®ãã£ãŒã«ããåæç»ãããå¿
èŠããããã©ã®ãã£ãŒã«ããåæç»ãããªããã«ã€ããŠã®æ
å ±ãããå Žåãããã°ã©ããŒã¯äœããã®åœ¢ã§æåã§æ瀺ããŸã-ããããšã©ãŒã®äž»ãªåå ãšãªããæéãè²»ããããŸã ç§ãåããŠããã»ãšãã©ã®å€§èŠæš¡ãªãªãã£ã¹ã§ã¯ãããã°ã©ããŒãããããçš®é¡ã®InventoryUpdatedEventãèªåã§éä¿¡ããå Žåã«ãã£ãŠã¯æåã§å
¥åããããšããããŸããã ãããã®ãªãã£ã¹ã®ããã€ãã¯ãæ°çŸäžãã«ã皌ãã§ããŸãããæè¬ã§ããããããšãããã§ããïŒ
ç¬èªã®ã¯ã©ã¹ReactiveProperty <T>ã䜿çšããŸããããã¯ãå¿
èŠãªã¡ãã»ãŒãžéä¿¡ã®ãã¹ãŠã®æäœãå
éšã§é ããŸãã 次ã®ããã«ãªããŸãã
public class PlayerModel : Model { public ReactiveProperty<int> money = new ReactiveProperty<int>(); public ReactiveProperty<InventoryModel> inventory = new ReactiveProperty<InventoryModel>(); public void SomeTestChanges() { money.Value = 10; inventory.Value.capacity.Value++; } public void Subscription(Text text) { money.SubscribeWithState(text, (x, t) => t.text = x.ToString()); } }
ããã¯ã¢ãã«ã®æåã®ããŒãžã§ã³ã§ãã ãã®ãªãã·ã§ã³ã¯å€ãã®ããã°ã©ããŒã«ãšã£ãŠãã§ã«å€¢ã§ãããç§ã¯ãŸã ããã奜ãã§ã¯ãããŸããã æåã«æ°ã«å
¥ããªãã®ã¯ãå€ãžã®ã¢ã¯ã»ã¹ãè€éã ãšããããšã§ãã ãã®äŸãæžããŠããéãç§ã¯æ··ä¹±ããValueã1ãæã§å¿ããŠããŸããŸããããŸãã«ãããã®ããŒã¿æäœããè¡ãããã¢ãã«ãšæ··åããããã¹ãŠã®å€§éšåãå ããŠããŸãã 4.xèšèªããŒãžã§ã³ã䜿çšããŠããå Žåããããè¡ãããšãã§ããŸãã
public ReactiveProperty<int> money { get; private set; } = new ReactiveProperty<int>();
ããããããã¯ãã¹ãŠã®åé¡ã解決ããããã§ã¯ãããŸããã ç§ã¯ç°¡åã«æžãããã§ãïŒinventory.capacity ++;ã ã¢ãã«ãã£ãŒã«ãããšã«ååŸããããšãããšããŸãã ã»ãã; ãã ããã€ãã³ãããµãã¹ã¯ã©ã€ãããã«ã¯ãReactivePropertyèªäœãžã®ã¢ã¯ã»ã¹ãå¿
èŠã§ãã æãããªäžäŸ¿ããšæ··ä¹±ã®åå ã ã©ã®ãã£ãŒã«ããç£èŠããããæå®ããã ãã§ãããšããäºå®ã«ããããããã ãããŠãããã§ç§ã¯ç§ã奜ãã ã£ãããªãããŒãªæäœãæãã€ããã
æ°ã«å
¥ã£ããèŠãŠã¿ãŸãããã
ã«ãŒã«ãèšè¿°ããããã°ã©ããŒãåŠçããç¹å®ã®ã¢ãã«ã«æ¿å
¥ãããã®ã¯ReactivePropertyèªäœã§ã¯ãããŸãããããã®PValueéçèšè¿°åãããäžè¬çãªããããã£ã®çžç¶äººããã£ãŒã«ããèå¥ããModelã³ã³ã¹ãã©ã¯ã¿ãŒã®å
éšã§ã¯ãç®çã®ã¿ã€ãã®ReactivePropertyã®äœæãšä¿åãé ãããŠããŸãã æè¯ã®ååã§ã¯ãããŸããããå®éã«ååãå€æŽãããŸããã
ã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã
public class PlayerModel : Model { public static PValue<int> MONEY = new PValue<int>(); public int money { get { return MONEY.Get(this); } set { MONEY.Set(this, value) } } public static PModel<InventoryModel> INVENTORY = new PModel<InventoryModel>(); public InventoryModel inventory { get { return INVENTORY.Get(this); } set { INVENTORY.Set(this, value) } } public void SomeTestChanges() { money = 10; inventory.capacity++; } public void Subscription(Text text) { this.Get(MONEY).SubscribeWithState(text, (x, t) => t.text = x.ToString()); } }
ããã¯2çªç®ã®ãªãã·ã§ã³ã§ãã ãã¡ãããã¢ãã«ã®äžè¬çãªç¥å
ã¯ããã®èšè¿°åã«åŸã£ãŠå®éã®ReactivePropertyãäœæããã³æœåºããããšãç ç²ã«ããŠè€éã§ããããããã¯éåžžã«è¿
éã«ããªãã¬ã¯ã·ã§ã³ãªãã§ããŸãã¯ããããã¯ã©ã¹åæåã®æ®µéã§1åã ããªãã¬ã¯ã·ã§ã³ãé©çšã§ããŸãã ãããŠãããã¯ãšã³ãžã³ã®äœæè
ã«ãã£ãŠäžåºŠè¡ãããäœæ¥ã§ããããã®åŸããã¹ãŠã®äººã«ãã£ãŠäœ¿çšãããŸãã ããã«ããã®èšèšã«ãããReactivePropertyã«æ ŒçŽãããŠããå€ã§ã¯ãªããReactivePropertyèªäœãæäœããããšããå¶çºçãªè©Šã¿ãåé¿ãããŸãã ãã£ãŒã«ãã®äœæã¯ç
©éã§ããããã¹ãŠã®å Žåã§ãŸã£ããåãã§ããããã³ãã¬ãŒãã䜿çšããŠäœæã§ããŸãã
èšäºã®æåŸã«ãã©ã®ãªãã·ã§ã³ãäžçªå¥œãããšããã¢ã³ã±ãŒãããããŸãã
以äžã§èª¬æãããã®ã¯ãã¹ãŠãäž¡æ¹ã®ããŒãžã§ã³ã§å®è£
ã§ããŸãã
ååŒ
ããã°ã©ããŒãã¢ãã«ãã£ãŒã«ããå€æŽã§ããããã«ãããã®ã¯ããšã³ãžã³ã§æ¡çšãããŠããå¶éã«ãã£ãŠèš±å¯ãããŠããå Žåã«ã®ã¿ãã€ãŸãããŒã å
ã§ããã以éã¯ã¢ãã«ãã£ãŒã«ããå€æŽã§ããªãããã«ããããšã§ãã ãããè¡ãã«ã¯ãã»ãã¿ãŒã¯ã©ããã«ç§»åãããã©ã³ã¶ã¯ã·ã§ã³ã³ãã³ããçŸåšéããŠãããã©ããã確èªããã¢ãã«å
ã®æ
å ±ãç·šéã§ããããã«ããå¿
èŠããããŸãã ããã¯éåžžã«å¿
èŠã§ãããªããªãããšã³ãžã³ã®ãŠãŒã¶ãŒã¯ãéåžžã®ããã»ã¹ããã€ãã¹ããããã«å¥åŠãªããšãå®æçã«è©Šã¿ããšã³ãžã³ã®ããžãã¯ãå£ãã埮åŠãªãšã©ãŒãåŒãèµ·ããããã§ãã ç§ã¯ããã1ã2å以äžèŠãŸããã
ã¢ãã«ããã®ããŒã¿ã®èªã¿åããšæžã蟌ã¿ã®ããã«å¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæãããšãäœããã®åœ¢ã§åœ¹ç«ã€ãšèããããŠããŸãã å®éã«ã¯ãè¿œå ã®ãã¡ã€ã«ãšéå±ãªè¿œå æäœã§ã¢ãã«ã倧ãããªããããŠããŸãã ããã°ã©ããŒã¯ããç¹å®ã®åæ©èœãã¢ãã«ããŸãã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãäžããã¹ãããšããæåã«ç¥ããåžžã«èããããšã匷ãããã次ã«ããããã®å¶éãåé¿ããªããã°ãªããªãç¶æ³ãçºçããŸããåºå£ã«ã¯ãããããã¹ãŠçœã§æãã€ãããã«ã¿ãã£ã³ãšããããžã§ã¯ããããŒãžã£ãŒã®èŠåå¡ã§ãã圌ã®ãšã³ãžã³ã®å€ãã®ãŠãŒã¶ãŒãããŸãã ãããã£ãŠããã®ãããªééãã®å¯èœæ§ããã£ãããšãããã¯ããããšã奜ã¿ãŸãã ããã°ãã³ã³ãã³ã·ã§ã³ã®ç·éãæžãããŠãã ããã
ReactivePropertyã»ãã¿ãŒã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®çŸåšã®ç¶æ
ã確èªããå Žæãžã®ãªã³ã¯ãå¿
èŠã§ãã ãã®å ŽæãclassCModelRootã§ãããšããŸãããã æãç°¡åãªãªãã·ã§ã³ã¯ãã¢ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒã«æ瀺çã«æž¡ãããšã§ãã RPropertyãåŒã³åºããšãã®ã³ãŒãã®2çªç®ã®ããŒãžã§ã³ã¯ããããžã®ãªã³ã¯ãæ瀺çã«åãåããããããå¿
èŠãªæ
å ±ããã¹ãŠååŸã§ããŸãã ã³ãŒãã®æåã®ããŒãžã§ã³ã§ã¯ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®ReactivePropertyåã®ãã£ãŒã«ããå®è¡ããããã«æäœããããã«ãããžã®ãªã³ã¯ãæäŸããå¿
èŠããããŸãã å°ãäžäŸ¿ãªã®ã¯ã次ã®ãããªåã¢ãã«ã®ãã©ã¡ãŒã¿ãŒãæã€æ瀺çãªã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããå¿
èŠãããããšã§ãã
public class PlayerModel : Model { public PlayerModel(ModelRoot gamestate) : base (gamestate) {} }
ããããã¢ãã«ã®ä»ã®æ©èœã«ã€ããŠã¯ãã¢ãã«ã«èŠªã¢ãã«ãžã®ãªã³ã¯ããããåé£çµæ§æã圢æããŠãããšéåžžã«äŸ¿å©ã§ãã ãã®äŸã§ã¯ãããã¯player.inventory.Parent == playerã«ãªããŸãã ãããŠããã®ã³ã³ã¹ãã©ã¯ã¿ã¯åé¿ã§ããŸãã ã©ã®ã¢ãã«ã§ãã次ã®èŠªããã®éæ³ã®å Žæã§ããããšãå€æãããŸã§ã芪ããéæ³ã®å Žæãžã®ãªã³ã¯ãååŸããŠãã£ãã·ã¥ã§ããŸãã ãã®çµæã宣èšã®ã¬ãã«ã§ã¯ãããã¯ãã¹ãŠæ¬¡ã®ããã«ãªããŸãã
public class ModelRoot : Model { public bool locked { get; private set; } } public partial class Model { public Model Parent { get; protected set; } public ModelRoot Root { get; } }
ã¢ãã«ãã²ãŒã ã¹ããŒãããªãŒã«å
¥ããšããã®ãã¹ãŠã®çŸãããèªåçã«æºããããŸãã ã¯ãããŸã ããã«å°éããŠããªãæ°ããäœæãããã¢ãã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã«ã€ããŠåŠç¿ã§ãããããèªäœã§æäœããããã¯ã§ããŸãããããã©ã³ã¶ã¯ã·ã§ã³ã®ç¶æ
ãçŠæ¢ãããŠããå Žåããã®åŸã®ç¶æ
ã«ãªãããšã¯ã§ãããå°æ¥ã®èŠªã®ã»ãã¿ãŒã¯ãããèš±å¯ããŸãããã®ãããã²ãŒã ã¹ããŒãã®æŽåæ§ã¯åœ±é¿ãåããŸããã ã¯ããããã¯ãšã³ãžã³ã®ããã°ã©ãã³ã°æ®µéã§è¿œå ã®äœæ¥ãå¿
èŠã«ãªããŸãããäžæ¹ã§ããšã³ãžã³ã䜿çšããããã°ã©ããŒã¯ãäœãééã£ãããšãããããšããŠæã«å
¥ãããŸã§ãããã«ã€ããŠç¥ãå¿
èŠãèããå¿
èŠããŸã£ãããããŸããã
ãã©ã³ã¶ã¯ã·ã§ã³ã«é¢ããäŒè©±ãå§ãŸã£ãŠããã®ã§ãå€æŽã«é¢ããã¡ãã»ãŒãžã¯ãå€æŽãè¡ãããçŽåŸã«åŠçãããã¹ãã§ã¯ãªããçŸåšã®ã³ãã³ãå
ã®ã¢ãã«ã§ã®ãã¹ãŠã®æäœãå®äºãããšãã«ã®ã¿åŠçãããŸãã ããã«ã¯2ã€ã®çç±ããããŸãã1ã€ç®ã¯ããŒã¿ã®äžè²«æ§ã§ãããã¹ãŠã®ããŒã¿ç¶æ
ãå
éšçã«äžè²«ããŠããããã§ã¯ãããŸããããããããã¬ã³ããªã³ã°ãè©Šã¿ãããšã¯ã§ããŸããã ãŸãã¯ãããšãã°ãã«ãŒãå
ã§é
åã䞊ã¹æ¿ããããã¢ãã«å€æ°ãå€æŽãããããã®ãåŸ
ã¡ãããªãå Žåã äœçŸãã®å€æŽã¡ãã»ãŒãžãåãåãã¹ãã§ã¯ãããŸããã
ãããè¡ãã«ã¯2ã€ã®æ¹æ³ããããŸãã 1ã€ã¯ãå€æ°ã®æŽæ°ããµãã¹ã¯ã©ã€ããããšãã«ããªãããŒãªé¢æ°ã䜿çšããããšã§ããããã«ããããã©ã³ã¶ã¯ã·ã§ã³ã®çµäºã®ã¹ããªãŒã ãå€æ°ã®å€æŽã®ã¹ããªãŒã ã«è¿œå ãããã¡ãã»ãŒãžã®åŸã«ã®ã¿æž¡ãããŸãã ããšãã°ãUniRXã䜿çšããŠããå Žåãããã¯ç°¡åã§ãã ãããããã®ãªãã·ã§ã³ã«ã¯å€ãã®æ¬ ç¹ããããç¹ã«å€ãã®äžå¿
èŠãªåããçããŸãã å人çã«ã¯ãä»ã®ãªãã·ã§ã³ã奜ãã§ãã
åReactivePropertyã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®éå§åã®ç¶æ
ãšçŸåšã®ç¶æ
ãèšæ¶ããŸãã å€æŽããã³å€æŽã®ä¿®æ£ã«é¢ããã¡ãã»ãŒãžã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®çµäºæã«ã®ã¿äœæãããŸãã å€æŽã®ãªããžã§ã¯ããäœããã®çš®é¡ã®ã³ã¬ã¯ã·ã§ã³ã§ããå Žåãããã«ãããéä¿¡ãããã¡ãã»ãŒãžã«çºçããå€æŽã«é¢ããæ
å ±ãæ瀺çã«å«ããããšãã§ããŸããããšãã°ããªã¹ãã«ãã®ãããª2ã€ã®ã¢ã€ãã ãè¿œå ããããã®2ã€ãåé€ãããŸããã åã«äœããå€ãã£ããšèšã£ãŠãåä¿¡è
ã«åæç»ãå¿
èŠãªæ
å ±ãæ±ããŠé·ã1000é
ç®ã®ãªã¹ããåæããããšã匷å¶ãã代ããã«ã
public partial class Model { public void DispatchChanges(Command transaction); public void FixChanges(); public void RevertChanges(); }
ãã®ãªãã·ã§ã³ã¯ããšã³ãžã³ã®äœæ段éã§ããæéãããããŸããã䜿çšã³ã¹ãã¯äœããªããŸãã ãããŠæãéèŠãªããšã¯ã次ã®æ¹åã®å¯èœæ§ãéãããšã§ãã
ã¢ãã«ã«å ããããå€æŽã«é¢ããæ
å ±
ã¢ãã«ã«ãã£ãšæ¬²ããã ãã€ã§ããã¢ã¯ã·ã§ã³ã®çµæãšããŠã¢ãã«ã®ç¶æ
ã«äœãå€ãã£ãã®ããç°¡åãã€äŸ¿å©ã«èŠããã§ãã ããšãã°ããã®åœ¢åŒã§ã¯ïŒ
{"player":{"money":10, "inventory":{"capacity":11}}}
ã»ãšãã©ã®å Žåãããã°ã©ããŒã«ãšã£ãŠãã³ãã³ãã®éå§åãšçµäºåŸããŸãã¯ã³ãã³ãå
ã®ããæç¹ã§ã®ã¢ãã«ã®ç¶æ
ã®å·®åã確èªãããšäŸ¿å©ã§ãã ãã®ããã®ããã€ãã¯ãããŒã ã®éå§åã«ã²ãŒã å
šäœãè€è£œããæ¯èŒããŸãã ããã«ããããããã°æ®µéã§åé¡ãéšåçã«è§£æ±ºãããŸããã補åã§ãããå®è¡ããããšã¯çµ¶å¯Ÿã«äžå¯èœã§ãã 2ã€ã®ãªã¹ãéã®åãã«è¶³ããªãå·®ãèšç®ããããã®ç¶æ
ã®è€è£œã¯ããããã¿ãããããã«éæ¹ããªãé«äŸ¡ãªæäœã§ãã
ãããã£ãŠãReactivePropertyã¯çŸåšã®ç¶æ
ã ãã§ãªããåã®ç¶æ
ãä¿åããå¿
èŠããããŸãã ããã«ãããéåžžã«æçšãªæ©äŒã®ã°ã«ãŒãå
šäœãçãŸããŸãã 第äžã«ããã®ãããªç¶æ³ã§ã®éãã®æœåºã¯é«éã§ãããç§ãã¡ã¯ããããã¹ãŠéãã«é£åã«æšãŠãããšãã§ããŸãã 第äºã«ãããã°ãdiffã§ã¯ãªããå€æŽããã³ã³ãã¯ãã§å°ããªããã·ã¥ãååŸãããããå¥ã®åãã²ãŒã ç¶æ
ã®å€æŽã®ããã·ã¥ãšæ¯èŒã§ããŸãã åæããªãå Žåãåé¡ããããŸãã 第äžã«ãã³ãã³ãã®å®è¡ãå®è¡ã«å€±æããå Žåããã€ã§ãå€æŽããã£ã³ã»ã«ãããã©ã³ã¶ã¯ã·ã§ã³ãéå§ãããæç¹ã§ã®æãªãããŠããªãç¶æ
ãèŠã€ããããšãã§ããŸãã ç¶æ
ã«é©çšãããããŒã ãšäžç·ã«ããã®æ
å ±ã¯ãç¶æ³ãæ£ç¢ºã«ç°¡åã«åçŸã§ãããããéåžžã«è²Žéã§ãã ãã¡ããããã®ããã«ã¯ãã²ãŒã ç¶æ
ã®ã·ãªã¢ã«åãšã·ãªã¢ã«å解é€ã䟿å©ã«ããæ¢è£œã®æ©èœãå¿
èŠã§ããããšã«ããå¿
èŠã«ãªããŸãã
ã¢ãã«å€æŽã®ã·ãªã¢ã«å
ãšã³ãžã³ã¯ãã·ãªã¢ã«åãšãã€ããªãæäŸããjsonã§-ããã¯å¶ç¶ã§ã¯ãããŸããã ãã¡ããããã€ããªã·ãªã¢ã«åã¯ããå°ãªãã¹ããŒã¹ãå æããã¯ããã«é«éã«åäœããŸããããã¯ãç¹ã«åæããŒãäžã«éèŠã§ãã ããããããã¯äººéãèªãã圢åŒã§ã¯ãããŸãããããã§ã¯ããããã°ã®å©äŸ¿æ§ãç¥ã£ãŠããŸãã ããã«ãå¥ã®èœãšãç©ŽããããŸãã ã²ãŒã ã補åçã«ãªããšãåžžã«ããŒãžã§ã³ãåãæ¿ããå¿
èŠããããŸãã ããã°ã©ããŒãããã€ãã®ç°¡åãªäºé²çã«åŸããã²ãŒã ã®ç¶æ
ããäžå¿
èŠã«äœãåé€ããªãå Žåããã®ç§»è¡ãæããããšã¯ãããŸããã ãã€ããªåœ¢åŒã§ã¯ãæãããªçç±ã§æååãã£ãŒã«ãåããããŸãããããŒãžã§ã³ãäžèŽããªãå Žåã¯ãå€ãããŒãžã§ã³ã®ç¶æ
ã®ãã€ããªãèªã¿åã£ãŠãåãjsonãªã©ã®ããæçãªãã®ã«ãšã¯ã¹ããŒãããŠãããæ°ããç¶æ
ã«ã€ã³ããŒãããŠããã€ããªã«ãšã¯ã¹ããŒãããå¿
èŠããããŸããæžãçããŠãã ããããããŠããã®ãã¹ãŠã®äœæ¥ãéåžžã©ããã«è¡ãããåŸã«ã®ã¿ã ãã®çµæãäžéšã®ãããžã§ã¯ãã§ã¯ãèšå®ãã·ã¯ãããŒã³ã®ãµã€ãºãèæ
®ããŠãã€ããªã«æžã蟌ãŸãããã§ã«jsonã®åœ¢åŒã§ç¶æ
ãååŸã«ãã©ãã°ããããšã奜ã¿ãŸãã ãªãŒããŒããããè©äŸ¡ããŠéžæããŠãã ããã
[Flags] public enum ExportMode { all = 0x0, changes = 0x1, serverVerified = 0x2,
Exportã¡ãœããã®ã·ã°ããã£ãŒïŒExportModeã¢ãŒããout Dictionary <stringãobject>ããŒã¿ïŒã¯ãå°ã
é©ãã¹ããã®ã§ãã ãããŠãããã¯æ¬¡ã®ãšããã§ããããªãŒå
šäœãã·ãªã¢ã«åãããšãããã«ã¹ããªãŒã ã«æžã蟌ãããšãã§ããŸãããã®å Žåã¯ãStringWriterã®ç°¡åãªã¢ããªã³ã§ããJSONWriterã«æžã蟌ãããšãã§ããŸãã ããããå€æŽããšã¯ã¹ããŒããããšããããã¯ããã»ã©åçŽã§ã¯ãããŸãããããªãŒã®å¥¥æ·±ãã«ç§»åããŠãã©ã³ãã®1ã€ã«ç§»åãããšãããããäœãããšã¯ã¹ããŒããããã©ããããŸã£ããããããªãããã§ãã ãã®ããããã®æ®µéã§2ã€ã®ãœãªã¥ãŒã·ã§ã³ãèãåºããŸããã1ã€ã¯åçŽãªãœãªã¥ãŒã·ã§ã³ã§ããã1ã€ã¯ããè€éã§çµæžçãªãœãªã¥ãŒã·ã§ã³ã§ãã ããç°¡åãªæ¹æ³ã¯ãå€æŽã®ã¿ããšã¯ã¹ããŒãããããšã«ããããã¹ãŠã®å€æŽãèŸæž<stringãobject>ããã³List <object>ããããªãŒã«å€æããããšã§ãã ãããŠãäœãèµ·ãã£ãã®ããããªãã®å¥œããªã·ãªã¢ã©ã€ã¶ãŒãé€ããŸãã ããã¯ãã¿ã³ããªã³ãšèžãå¿
èŠã®ãªãåçŽãªã¢ãããŒãã§ãã ãããããã®æ¬ ç¹ã¯ãããŒããžã®å€æŽããšã¯ã¹ããŒãããããã»ã¹ã§ã1åéãã®ã³ã¬ã¯ã·ã§ã³ã®å Žæãå²ãåœãŠãããããšã§ãã å®éããã®å®å
šãªãšã¯ã¹ããŒãã¯å€§ããªããªãŒãæäŸããå
žåçãªã³ãã³ãã¯ããªãŒã«ã»ãšãã©å€æŽãæ®ããªããããã¹ããŒã¹ã¯ããŸããããŸããã
ãã ããå€ãã®äººã
ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒããã®èãããšããŠäŸçµŠããããšã¯ã極端ãªå¿
èŠãªãã«ã¯å¿
èŠãªããšèããŠããŸãã 圌ãã®ããã«ããããŠç§ã®è¯å¿ãèœã¡çãããããã«ãç§ã¯ããè€éãªè§£æ±ºçãçšæããŸããïŒ
public partial class Model { public void ExportAll(ExportMode mode, Type propertyType, JSONWriter writer, bool newModel = false); public bool DetectChanges(ExportMode mode, Stack<Model> ierarchyChanged = null); public void ExportChanges(ExportMode mode, Type propertyType, JSONWriter writer, Queue<Model> ierarchyChanges = null); }
ãã®æ¹æ³ã®æ¬è³ªã¯ãããªãŒã2åéãæããããšã§ãã åããŠãèªåèªèº«ãå€æŽãããã¹ãŠã®ã¢ãã«ããŸãã¯åã¢ãã«ã«å€æŽããããã¹ãŠã®ã¢ãã«ã確èªãããããããã¹ãŠçŸåšã®ç¶æ
ã§ããªãŒã«è¡šç€ºãããé åºã§ãã¥ãŒ<Model> ierarchyChangesã«æ£ç¢ºã«æžã蟌ã¿ãŸãã å€ãã®å€æŽã¯ãããŸããããã¥ãŒã¯é·ããªããŸããã ããã«ãåŒã³åºãéã§Stack <Model>ãšQueue <Model>ãä¿æããããšã劚ãããã®ã¯äœããªããããåŒã³åºãäžã®å²ãåœãŠã¯ã»ãšãã©ãããŸããã
ãããŠãããªãŒã2åç®ã«ééãããšãæ¯åãã¥ãŒã®å
é ãèŠãŠãããªãŒã®ãã®ãã©ã³ãã«å
¥ãããããã«é²ãå¿
èŠãããããç解ããããšãã§ããŸãã ããã«ãããJSONWriterã¯ä»ã®äžéçµæãè¿ããã«ããã«æžã蟌ãããšãã§ããŸãã
åŸã§ããªãŒãžã®å€æŽã®ãšã¯ã¹ããŒãã¯ãããã°ãŸãã¯äŸå€ã§ã¯ã©ãã·ã¥ããå Žåã«ã®ã¿å¿
èŠã§ããããšããããã®ã§ããã®è€éãã¯å®éã«ã¯å¿
èŠã§ã¯ãªãå¯èœæ§ãéåžžã«é«ãã§ãã éåžžã®æäœäžã¯ããã¹ãŠãGetHashCodeïŒExportModeã¢ãŒããout intã³ãŒãïŒã«å¶éãããããããã¹ãŠã®åã³ã¯ãŸã£ããç°è³ªã§ãã
ã¢ãã«ãè€éã«ãç¶ããåã«ãããã«ã€ããŠè©±ããŸãããã
ãªããããªã«éèŠãªã®
ãã¹ãŠã®ããã°ã©ããŒã¯ãããã¯éåžžã«éèŠã ãšèšããŸãããé垞誰ãä¿¡ããŠããŸããã ãªãã§ïŒ
第äžã«ããã¹ãŠã®ããã°ã©ããŒã¯å€ããã®ãæšãŠãŠæ°ãããã®ãæžãå¿
èŠããããšèšã£ãŠããããã§ãã è³æ Œã«é¢ä¿ãªããããã ãã§ãã ãããçå®ã§ãããã©ããã確èªãã管çäžã®æ¹æ³ã¯ãªããå®éšã¯éåžžé«äŸ¡ãããŸãã ãããŒãžã£ãŒã¯1人ã®ããã°ã©ããŒãéžæãã圌ã®å€æãä¿¡é ŒããããšãäœåãªããããŸãã åé¡ã¯ããã®ãããªã¢ããã€ã¶ãŒã¯éåžžãçµå¶é£ãé·ãéåããŠããã¢ããã€ã¶ãŒã§ããããã®ã¢ã€ãã¢ãå®çŸã§ãããã©ããã«ãã£ãŠè©äŸ¡ãããšããããšã§ãã ãããã£ãŠãããã¯ä»ã®äººã®ã¢ã€ãã¢ãç°è³ªãªã¢ã€ãã¢ãã©ãã»ã©åªããŠããããç¥ãçæ³çãªæ¹æ³ã§ããããŸããã
第äºã«ããã¹ãŠã®ã¢ãã€ã«ã²ãŒã ã®80ïŒ
ã¯ãç涯ã§500ãã«æªæºã§ãã ãããã£ãŠããããžã§ã¯ãã®éå§æã«ã¯ã管çã«ã¯ä»ã®åé¡ããããããã«éèŠãªã®ã¯ã¢ãŒããã¯ãã£ã§ãã ãããããããžã§ã¯ãã®æåã®æ®µéã§äžããã決å®ã¯äººã
ã人質ã«ãã6ã¶æãã3幎ãŸã§ã¯ææŸããŸããã ãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããã§ã«ã¯ã©ã€ã¢ã³ããããäœæ¥äžã®ãããžã§ã¯ãã§ä»ã®ã¢ã€ãã¢ã«åãæ¿ããããã»ã¹ã¯ãéåžžã«é£ãããè²»çšããããããªã¹ã¯ã®é«ãããžãã¹ã§ãã æåã®ãããžã§ã¯ãã§ãéåžžã®ã¢ãŒããã¯ãã£ã«3ãæãæè³ããããšã¯å®¹èªã§ããªãèŽ
æ²¢ã®ããã«æããŸãããæ°ããæ©èœã§ã®æŽæ°ãæ°ãæ延æããã³ã¹ãã«ã€ããŠã¯ã©ãæããŸããïŒ
第äžã«ãããããã©ãããã¹ããããšããã¢ã€ãã¢èªäœãçæ³çã§ãã£ãŠãããã®å®è£
ã«ã©ã®ãããæéãããããã¯ããããŸããã ããã°ã©ããŒã®ã¯ãŒã«ãã«è²»ããæéã®äŸåæ§ã¯éåžžã«éç·åœ¢ã§ãã èè·è
ã¯ãåŸèŒ©ã»ã©éããªãåçŽãªã¿ã¹ã¯ãå®è¡ããŸãã ãã¶ã1.5åã ããããåããã°ã©ããŒã«ã¯ç¬èªã®ãè€éãã®éçããããããããè¶
ãããšãã®å¹æã¯åçã«äœäžããŸãã ããªãè€éãªå»ºç¯äœæ¥ãå®çŸããå¿
èŠãããã家ã§ã€ã³ã¿ãŒãããããªãã«ããŠ1ãæåã®é£äºã泚æãããšããåé¡ã«å®å
šã«éäžããå¿
èŠãããã£ããšãã«ãç§ã¯äººçã®äžã§åé¡ãæ±ããŠããŸããã ãç§ã¯3æ¥ã§ãã®åé¡ã解決ããŸããã 誰ãããã®ãããªããšããã£ãªã¢ã§èŠããŠãããšæããŸãã ãããŠãããã«ãã£ããããããŸãïŒ äºå®ãçŽ æŽãããã¢ã€ãã¢ãæãã€ããå Žåããã®æ°ããã¢ã€ãã¢ã¯ããããããªãã®å人çãªè€éãã®éçã®ã©ããã«ãããããããå°ãé
ããŠããå¯èœæ§ããããŸãã ãã®ãããªããšã«ç¹°ãè¿ãçããŠããçµå¶è
ã¯ãæ°ããã¢ã€ãã¢ãå¹ãå§ããŸãã ãããŠãèªåã§ã²ãŒã ãäœããšãããªããæ¢ãã人ã¯ããªãã®ã§ãçµæã¯ããã«æªããªãå¯èœæ§ããããŸãã
ããããããã§ã¯ãã©ã®ããã«ããŠåªãããœãªã¥ãŒã·ã§ã³ã䜿çšããããšãã§ããŸããïŒ ããã€ãã®æ¹æ³ããããŸãã
ãŸããåäŒæ¥ã¯ã以åã®éçšäž»ã§ãã§ã«ãããè¡ã£ãŠããæ¢è£œã®äººãéããããšèããŠããŸãã ããã¯ãå®éšã®è² æ
ãä»ã®äººã«ç§»ãæãäžè¬çãªæ¹æ³ã§ãã
第äºã«ãæåã«æåããã²ãŒã ãäœæããäžžlurã¿ãã次ã®ãããžã§ã¯ããéå§ããäŒæ¥ãŸãã¯äººã
ã¯ãå€æŽã®æºåãã§ããŠããŸãã
第äžã«ã絊äžã®ããã§ã¯ãªããããã»ã¹ã®åã³ã®ããã«äœããããããšãããããšãæ£çŽã«èªããŠãã ãããäž»ãªããšã¯ããã®æéãèŠã€ããããšã§ãã第4ã«ãã²ãŒãã³ã°äŒç€Ÿã®äž»èŠãªè³éãæ§æããã®ã¯ãå®çžŸã®ãããœãªã¥ãŒã·ã§ã³ãšã©ã€ãã©ãªã®ã»ããã§ããã人ã
ãšäžç·ã§ããããã¯ãäžéšã®ããŒããŒãœã³ãéè·ããŠãªãŒã¹ãã©ãªã¢ã«ç§»åãããšãã«æ®ããã®ã§ããæãæãããªçç±ã§ã¯ãããŸããããæåŸã«ãªããŸããããã¯éåžžã«æçã ããã§ããåªãããœãªã¥ãŒã·ã§ã³ã¯ãæ°ããæ©èœã®äœæããããã°ããšã©ãŒã®æ€åºã«ãããæéãè€æ°ååæžããããšã«ã€ãªãããŸããäŸãæããŸãããã2æ¥åãã¯ã©ã€ã¢ã³ãã¯æ°ããæ©èœãå®è¡ããŠããŸããããã®å¯èœæ§ã¯1000åã®1ã§ããã€ãŸããQAã¯ãããåçŸããããã«æ·åããŸãããã¹ãŠã厩å£ããåã«ç¶æ³ãåçŸãããã¬ãŒã¯ãã€ã³ãã§ã¯ã©ã€ã¢ã³ãã1è¡ãã£ããããã®ã«ã©ããããæéãããããŸããïŒããšãã°ã10åãããŸããã¢ãã«
ã¢ãã«ããªãŒ
ã¢ãã«ã¯å€ãã®ãªããžã§ã¯ãã§æ§æãããŠããŸããããã°ã©ããŒã«ãã£ãŠãããããæ¥ç¶ããæ¹æ³ãç°ãªããŸããæåã®æ¹æ³ã¯ãã¢ãã«ã眮ãããŠããå Žæã«ãã£ãŠèå¥ãããå Žåã§ããããã¯ãã¢ãã«ãžã®åç
§ãModelRootã®åäžã®å Žæã«å±ããŠããå Žåãéåžžã«äŸ¿å©ã§ç°¡åã§ãããããããå Žæããå Žæãžãšç§»åããããšãã§ããŸãããç°ãªãå Žæããã®2ã€ã®ãªã³ã¯ãããã«ã€ãªããããšã¯ãããŸããããããè¡ãã«ã¯ãããã¢ãã«ããããã«ããä»ã®ã¢ãã«ãžã®ãªã³ã¯ãåŠçããModelPropertyèšè¿°åã®æ°ããããŒãžã§ã³ãå°å
¥ããŸããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã public class PModel<T> : Property<T> where T:Model {} public partial class PlayerModel : Model { public PModel<InventoryModel> INVENTORY = new PModel<InventoryModel>(); public InventoryModel inventory { get { return INVENTORY.Value(this); } set { INVENTORY.Value(this, value); } } }
éãã¯äœã§ããïŒ
ãã®ãã£ãŒã«ãã«æ°ããã¢ãã«ãè¿œå ããããšããã®ã¢ãã«ãè¿œå ãããã¢ãã«ããã®èŠªãã£ãŒã«ãã«æžã蟌ãŸããåé€ããããšã芪ãã£ãŒã«ãããªã»ãããããŸããçè«çã«ã¯ããã¹ãŠãããŸããããŸãããå€ãã®èœãšãç©ŽããããŸããæåã®-ããã䜿çšããããã°ã©ãã¯ãééããå¯èœæ§ããããŸãããããåé¿ããããã«ãããŸããŸãªè§åºŠãããã®ããã»ã¹ã«é ãããã§ãã¯ã課ããŸãã- PValueãä¿®æ£ããŠãå€ã®ã¿ã€ãããã§ãã¯ããã¢ãã«ãžã®åç
§ãä¿åããããšãããšãã«å°é家ãèªãããã«ããŸããããã«ã¯ãæ··ä¹±ããªãããã«ãç°ãªãæ§é ã䜿çšããå¿
èŠãããããšã瀺ããŸãããã¡ãããããã¯å®è¡æãã§ãã¯ã§ãããæåã®èµ·åè©Šè¡ã§èªãã®ã§ãå®è¡ãããŸãã
- PModel Parent - , . . , .
ããã«ããå¯äœçšãçºçããŸãããã®ãããªã¢ãã«ãããå Žæããå¥ã®å Žæã«ç§»åããå¿
èŠãããå Žåãæåã«ãã®å Žæãåé€ãã次ã«ããã2çªç®ã«è¿œå ããå¿
èŠããããŸããããããããã¯å®éã«ã¯ãã£ãã«èµ·ãããŸãããã¢ãã«ã¯å³å¯ã«å®çŸ©ããã1ã€ã®å Žæã«ããããã®èŠªãžã®åç
§ãæã£ãŠãããããæ°ããã¡ãœãããè¿œå ã§ããŸããModelRootããªãŒå
ã®ã©ã®æ¹åã«ããããç¥ãããšãã§ããŸããããã¯ãããã°ã«ã¯éåžžã«äŸ¿å©ã§ãããäžæã«èå¥ã§ããããã«ããããã«ãå¿
èŠã§ããããšãã°ãå¥ã®åãã²ãŒã ç¶æ
ã§ãŸã£ããåãã¢ãã«ãèŠã€ãããããµãŒããŒã«éä¿¡ãããã³ãã³ãã§ãã³ãã³ãã«å«ãŸããã¢ãã«ãžã®ãªã³ã¯ãæå®ããŸãã次ã®ããã«ãªããŸãã
public class ModelPath { public Property[] properties; public Object[] indexes; public override ToString(); public static ModelPath FromString(string path); } public partial class Model { public ModelPath Path(); } public partial class ModelRoot : Model { public Model GetByPath(ModelPath path); }
ãããŠããªããããå Žæã«æ ¹ããããªããžã§ã¯ããæã€ããšã¯äžå¯èœã§ãããå¥ã®å Žæãããããåç
§ããããšã¯äžå¯èœãªã®ã§ããïŒãŸããJSONãããªããžã§ã¯ãããã·ãªã¢ã©ã€ãºããŠããããšãæ³åãããšãããã«ã¯ãŸã£ããå¥ã®å Žæã«æ ¹ããããªããžã§ã¯ããžã®ãªã³ã¯ããããŸãããããŠããã®ããã®å Žæã¯ãŸã ãããŸããããã·ãªã¢ã©ã€ãºã®åºãéããŠã®ã¿äœæãããŸãããã£ãš
ãã«ããã¹éã·ãªã¢ã«åãæäŸããªãã§ãã ãããããããã®æ¹æ³ã®å¶éã§ãããããã£ãŠã2çªç®ã®æ¹æ³ãèããŸãã2çªç®ã®æ¹æ³ã§äœæããããã¹ãŠã®ã¢ãã«ã¯1ã€ã®éæ³ã®å Žæã§äœæãããã²ãŒã ç¶æ
ã®ä»ã®ãã¹ãŠã®å Žæã§ã¯ãªã³ã¯ã®ã¿ãæ¿å
¥ãããŸããéã·ãªã¢ã«åäžã«ãªããžã§ã¯ããžã®åç
§ãè€æ°ããå Žåããªããžã§ã¯ãã¯éæ³ã®å Žæã«æåã«ã¢ã¯ã»ã¹ãããšãã«äœæãããåããªããžã§ã¯ããžã®åŸç¶ã®åç
§ããã¹ãŠè¿ãããŸããä»ã®æ©èœãå®è£
ããããã«ãã²ãŒã ã«ã¯è€æ°ã®ã²ãŒã ç¶æ
ãèšå®ã§ãããããéæ³ã®å Žæã¯äžè¬çãªãã®ã§ã¯ãªããããšãã°ã²ãŒã ç¶æ
ã«é
眮ããå¿
èŠããããŸãããã®ãããªã¢ãã«ãžã®åç
§ã«ã¯ãPPersistentèšè¿°åã®å¥ã®ããªãšãŒã·ã§ã³ã䜿çšããŸããã¢ãã«èªäœã¯ãPersistentïŒModelã«ãã£ãŠããã«ç¹å¥ãªãã®ã«ãªããŸããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã public class Persistent : Model { public int id { get { return ID.Get(this); } set { ID.Set(this, value); } } public static RProperty<int> ID = new RProperty<int>(); } public partial class ModelRoot : Model { public int nextFreePersistentId { get { return NEXT_FREE_PERSISTENT_ID.Get(this); } set { NEXT_FREE_PERSISTENT_ID.Set(this, value); } } public static RProperty<int> NEXT_FREE_PERSISTENT_ID = new RProperty<int>(); public static PDictionaryModel<int, Persistent> PERSISTENT = new PDictionaryModel<int, Persistent>() { notServerVerified = true };
å°ãé¢åã§ããã䜿çšã§ããŸããã¹ãããŒã眮ãããã«ãPersistentã¯ModelRootãã©ã¡ãŒã¿ãŒã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒãåºå®ã§ããŸããããã«ããããã®ModelRootã®ã¡ãœããã䜿çšããã«ãã®ã¢ãã«ãäœæããããšãããšãã¢ã©ãŒã ãçºçããŸããã³ãŒãã§äž¡æ¹ã®ãªãã·ã§ã³ã䜿çšãããšãçåãçºçããŸãã2çªç®ã®ãªãã·ã§ã³ãèãããããã¹ãŠã®ã±ãŒã¹ãå®å
šã«ã«ããŒããŠããå Žåããªãæåã®ãªãã·ã§ã³ã䜿çšããã®ã§ããïŒçãã¯ãã²ãŒã ã®ç¶æ
ã¯ããŸã第äžã«ã人ã
ãèªãããã®ã§ãªããã°ãªããªããšããããšã§ããå¯èœã§ããã°ãæåã®ãªãã·ã§ã³ã䜿çšãããå Žåãã©ã®ããã«ãªããŸããïŒ { "persistents":{}, "player":{ "money":10, "inventory":{"capacity":11} } }
ãããŠä»ã2çªç®ã®ãªãã·ã§ã³ã®ã¿ã䜿çšãããå Žåã次ã®ããã«ãªããŸãã { "persistents":{ "1":{"money":10, "inventory":2}, "2":{"capacity":11} }, "player":1 }
å人çã«ãããã°ããã«ã¯ãæåã®ãªãã·ã§ã³ã奜ã¿ãŸããã¢ãã«ããããã£ãžã®ã¢ã¯ã»ã¹
æçµçã«ãªã¢ã¯ãã£ãããããã£ã¹ãã¬ãŒãžæœèšãžã®ã¢ã¯ã»ã¹ã¯ãã¢ãã«ã®å
éšã«é ããŠããããšãå€æããŸãããæçµã¢ãã«ã«ã³ãŒããè¿œå ãããããªãã¬ã¯ã·ã§ã³ãè¿œå ãããããã«ãè¿
éã«æ©èœããããã«æ©èœãããæ¹æ³ã¯ããŸãæ確ã§ã¯ãããŸãããããèŠãŠã¿ãŸããããèŸæžã«ã€ããŠæåã«ç¥ã£ãŠãããšäŸ¿å©ãªããšã¯ãèŸæžã®ãµã€ãºã«é¢ä¿ãªããèŸæžããã®èªã¿åãã«ããã»ã©æéãããããªãããšã§ããåã¿ã€ãã®ã¢ãã«ã«å«ãŸãããã£ãŒã«ãã®èª¬æãå²ãåœãŠãããã¢ãã«ã§ãã©ã€ããŒãéçãã£ã¯ã·ã§ããªãäœæããã¢ãã«ã®æ§ç¯æã«äžåºŠã¢ã¯ã»ã¹ããŸããåã³ã³ã¹ãã©ã¯ã¿ãŒã§ãåã®èª¬æããããã©ããã確èªãããªãå Žåã¯äœæããããå Žåã¯å®æãããã®ãäœæããŸãããããã£ãŠã説æã¯ã¯ã©ã¹ããšã«1åã ãäœæãããŸãã説æãäœæãããšããåéçããããã£ïŒãã£ãŒã«ãã®èª¬æïŒã«ããªãã¬ã¯ã·ã§ã³ãéããŠæœåºãããããŒã¿ïŒãã£ãŒã«ãã®ååãããã³ãã®ãã£ãŒã«ãã®ããŒã¿ã¹ãã¢ãé
åå
ã«ããã€ã³ããã¯ã¹ïŒãå
¥ããŸãããã®ããã«ãã£ãŒã«ãã®èª¬æãä»ããŠã¢ã¯ã»ã¹ãããšããã®èšæ¶åã¯ãæ¢ç¥ã®ã€ã³ããã¯ã¹ã§ãã€ãŸãè¿
éã«é
åããåãåºãããŸããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã public class Model : IModelInternals { #region Properties protected static Dictionary<Type, Property[]> propertiesDictionary = new Dictionary<Type, Property[]>(); protected static Dictionary<Type, Property[]> propertiesForBinarySerializationDictionary = new Dictionary<Type, Property[]>(); protected Property[] _properties, _propertiesForBinarySerialization; protected BaseStorage[] _storages; public Model() { Type targetType = GetType(); if (!propertiesDictionary.ContainsKey(targetType)) RegisterModelsProperties(targetType, new List<Property>(), new List<Property>()); _properties = propertiesDictionary[targetType]; _storages = new BaseStorage[_properties.Length]; for (var i = 0; i < _storages.Length; i++) _storages[i] = _properties[i].CreateStorage(); } private void RegisterModelsProperties(Type target, List<Property> registered, List<Property> registeredForBinary) { if (!propertiesDictionary.ContainsKey(target)) { if (target.BaseType != typeof(Model) && typeof(Model).IsAssignableFrom(target.BaseType)) RegisterModelsProperties(target.BaseType, registered, registeredForBinary); var fields = target.GetFields(BindingFlags.Public | BindingFlags.Static); // | BindingFlags.DeclaredOnly List<Property> alphabeticSorted = new List<Property>(); for (int i = 0; i < fields.Length; i++) { var field = fields[i]; if (typeof(Property).IsAssignableFrom(field.FieldType)) { var prop = field.GetValue(this) as Property; prop.Name = field.Name; prop.Parent = target; prop.storageIndex = registered.Count; registered.Add(prop); alphabeticSorted.Add(prop); } } alphabeticSorted.Sort((p1, p2) => String.Compare(p1.Name, p2.Name)); registeredForBinary.AddRange(alphabeticSorted); Property[] properties = new Property[registered.Count]; for (int i = 0; i < registered.Count; i++) properties[i] = registered[i]; propertiesDictionary.Add(target, properties); properties = new Property[registered.Count]; for (int i = 0; i < registeredForBinary.Count; i++) properties[i] = registeredForBinary[i]; propertiesForBinarySerializationDictionary.Add(target, properties); } else { registered.AddRange(propertiesDictionary[target]); registeredForBinary.AddRange(propertiesForBinarySerializationDictionary[target]); } } CastType IModelInternals.GetStorage<CastType>(Property property) { try { return (CastType)_storages[property.storageIndex]; } catch { UnityEngine.Debug.LogError(string.Format("{0}.GetStorage<{1}>({2})",GetType().Name, typeof(CastType).Name, property.ToString())); return null; } } #endregion }
ãã®ã¢ãã«ã®ç¥å
ã§å®£èšãããéçããããã£èšè¿°åã«ã¯ãã§ã«ã¹ãã¬ãŒãžã€ã³ããã¯ã¹ãç»é²ãããŠããå¯èœæ§ããããType.GetFieldsïŒïŒããããããã£ãè¿ãé åºã¯ä¿èšŒãããªããããèšèšã¯å°ãåçŽã§ããæã«ã¯ãããªãèªèº«ãç£èŠããå¿
èŠããããŸããã³ã¬ã¯ã·ã§ã³ã®ããããã£
ã¢ãã«ããªãŒã®ã»ã¯ã·ã§ã³ã§ã¯ãåè¿°ãããŠããªãæ§é ã«æ°ä»ãããšãã§ããŸããPDictionaryModel<intãPersistent>-ã³ã¬ã¯ã·ã§ã³ãå«ããã£ãŒã«ãã®èšè¿°åãã³ã¬ã¯ã·ã§ã³çšã®ç¬èªã®ãªããžããªãäœæããå¿
èŠãããããšã¯æããã§ãããã®ãªããžããªã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®éå§åã®ã³ã¬ã¯ã·ã§ã³ã®å€èŠ³ãšçŸåšã®å€èŠ³ã«é¢ããæ
å ±ãæ ŒçŽãããŸããããã®æ°Žäžã®å°ç³ã¯ãããŒã¿ãŒIã®äžã®ãµã³ããŒã¹ããŒã³ã®ãµã€ãºã§ãã2ã€ã®é·ãèŸæžãæã«æã£ãŠããã®ã§ããããã®éã®å·®åãèšç®ããã®ã¯éåžžã«é«äŸ¡ãªäœæ¥ã§ãããã®ãããªã¢ãã«ã¯ãã¡ã¿ã«é¢é£ãããã¹ãŠã®ã¿ã¹ã¯ã«äœ¿çšããå¿
èŠããããšæããŸããã€ãŸãããããã¯è¿
éã«åäœããã¯ãã§ãã 2ã€ã®ç¶æ
ãä¿åããããããè€è£œããŠæ¯èŒããã®ã«è²»çšããããã®ã§ã¯ãªããããªãããŒãªããã¯ãäœæããŸã-èŸæžã®çŸåšã®ç¶æ
ã®ã¿ãã¹ãã¢ã«ä¿åãããŸãã眮æãããèŠçŽ ã®å€ãå€ãæåŸã«ãèŸæžã«è¿œå ãããæ°ããããŒã®ã»ãããä¿åãããŸãããã®æ
å ±ã¯ç°¡åãã€è¿
éã«å
¥åãããŸããå¿
èŠãªãã¹ãŠã®å·®åãç°¡åã«çæã§ããå¿
èŠã«å¿ããŠä»¥åã®ç¶æ
ã埩å
ããã ãã§ååã§ããã³ãŒãã§ã¯ã次ã®ããã«ãªããŸãã public class DictionaryStorage<TKey, TValues> : BaseStorage { public Dictionary<TKey, TValues> current = new Dictionary<TKey, TValues>(); public Dictionary<TKey, TValues> removed = new Dictionary<TKey, TValues>(); public Dictionary<TKey, TValues> changedValues = new Dictionary<TKey, TValues>(); public HashSet<TKey> newKeys = new HashSet<TKey>(); }
ãªã¹ãã«åããã°ããããªããžããªãæãä»ãããšãã§ããªãã£ãããŸãã¯ååãªæéããªãã®ã§ã2ã€ã®ã³ããŒãä¿æããŸããå·®åã®ãµã€ãºãæå°éã«æããã«ã¯ãè¿œå ã®ã¢ããªã³ãå¿
èŠã§ãã public class ListStorage<TValue> : BaseStorage { public List<TValue> current = new List<TValue>(); public List<TValue> previouse = new List<TValue>();
åèš
äœãã©ã®ããã«åãåãããããæ確ã«ããã£ãŠããå Žåã¯ãæ°é±éã§ãã¹ãŠãæžãããšãã§ããŸããåæã«ãã²ãŒã ã®éçºé床ã¯åçã«å€åãããããè©ŠããŠã¿ããšãããåªãããšã³ãžã³ããªããã°èªåã®ã²ãŒã å¶äœã²ãŒã ãéå§ããããšããã§ããŸããã§ããããªããªããæåã®æã«ç§ãžã®æè³ãæããã«å ±ãããããã§ãããã¡ãããããã¯ã¡ã¿ã«ã®ã¿é©çšãããŸããã²ãŒã ãã¬ã€ã¯æãªããã®æ¹æ³ã§è¡ããªããã°ãªããŸãããèšäºã®æ¬¡ã®éšåã§ã¯ãã³ãã³ãããããã¯ãŒã¯ãããã³ãµãŒããŒå¿çã®äºæž¬ã«ã€ããŠèª¬æããŸãããŸããç§ã«ãšã£ãŠéåžžã«éèŠãªè³ªåãããã€ããããŸããããªãã®çããæ¬åŒ§ã§äžãããããã®ãšç°ãªãå Žåãç§ã¯åãã§ã³ã¡ã³ãã§ããããèªãããããªããèšäºãæžãããšããããã§ããããåçããããšãããããŸãã
PSå€æ°ã®æ§æãšã©ãŒã«é¢ããååãšæ瀺ã®ææ¡ã¯ãPMã§ãé¡ãããŸãã