Slide 1

Slide 1 text

6OJUZͰ6*࡞Δ࣌ͷ ΞʔΩςΫνϟ UnibookৼΓฦΓʴՆͷLTେձʂ 2016-07-23 @mattak 1

Slide 2

Slide 2 text

ࣗݾ঺հ 2

Slide 3

Slide 3 text

3 ID: @mattak 位置ゲームエンジニア Unity⼒: にわか github.com/mattak/ qiita.com/mattak@github

Slide 4

Slide 4 text

ಥવͰ͕͢ɺ 4

Slide 5

Slide 5 text

6*࡞Δͱ͖ʹ ͲΜͳײ͡Ͱ ίʔυॻ͍ͯ·͢ʁ 5

Slide 6

Slide 6 text

6* 6 Tab切り替え 数値の反映 Collectionの表⺬ Gauge表⺬ ViewのOn/OFF …

Slide 7

Slide 7 text

͜Μͳײ͡ͷ6*͕ ૿͍͑ͯ͘ͱ ίʔσΟϯάϧʔϧʹ ࠔΔɻɻɻ 7

Slide 8

Slide 8 text

ίʔσΟϯάϧʔϧ ͸ඞཁʁ 8 規模⼩/短期/1⼈/メンテなしの場合 - コーディングルールがなくても成⽴ 規模⼤/⻑期/複数⼈/メンテありの場合 - コーディングルールがないとやってられない

Slide 9

Slide 9 text

ௐ΂ͯΈͨ 9 https://speakerdeck.com/mattak/application-architecture-for-unity-ui

Slide 10

Slide 10 text

݁Ռ 10 UnityでUI周りのアーキテクチャ考えてる事例少なそう ↓ UnityのUIアーキテクチャを考えて ライブラリにしました

Slide 11

Slide 11 text

11 github.com/mattak/Unidux

Slide 12

Slide 12 text

3FEVYΞʔΩςΫνϟ Λࢀߟʹ͠·ͨ͠ 12

Slide 13

Slide 13 text

ελʔΊ͙ΜͰ ͍ͩ͘͞ 13 github.com/mattak/Unidux

Slide 14

Slide 14 text

؆୯ʹ ϥΠϒϥϦͷઆ໌ 14

Slide 15

Slide 15 text

ཁૉͷؔ܎ 15

Slide 16

Slide 16 text

16 GameObject Action Reducer State Dispatcher(ActionCreator) Renderer(View)

Slide 17

Slide 17 text

17 GameObject Event情報 状態更新ロジック 状態 Event発⽕者 Viewの変化

Slide 18

Slide 18 text

$PPLJF$MJDLFSͷྫ 18

Slide 19

Slide 19 text

19 GameObject +1 count = count+1 count Button押下 text = count

Slide 20

Slide 20 text

-JTU7JFXͷྫ 20

Slide 21

Slide 21 text

21 GameObject {name:”poppo”} List.Add( {name:”poppo”} ) List Start() ListView更新

Slide 22

Slide 22 text

࣮૷ྫ 22

Slide 23

Slide 23 text

23 ActionCreator、Renderer、Uniduxを配置

Slide 24

Slide 24 text

"DUJPO 24 public enum CountAction
 {
 Increment,
 Decrement
 }

Slide 25

Slide 25 text

4UBUF 25 public class State : StateBase
 {
 public int Count { get; set; }
 }

Slide 26

Slide 26 text

"DUJPO$SFBUPS 26 public class CountDispatcher : MonoBehaviour
 {
 public CountAction ActionType = CountAction.Increment;
 
 void Start()
 {
 var button = this.GetComponent();
 button.onClick.AddListener(() => Unidux.Instance.Store.Dispatch(ActionType));
 }
 }

Slide 27

Slide 27 text

3FEVDFS 27 public static class CountReducer
 {
 public static State Reduce(State state, CountAction action)
 {
 switch (action)
 {
 case CountAction.Increment:
 state.Count++;
 break;
 case CountAction.Decrement:
 state.Count--;
 break;
 }
 
 return state;
 }
 }

Slide 28

Slide 28 text

3FOEFSFS 28 public class CountRenderer : MonoBehaviour
 {
 void OnEnable()
 {
 var store = Unidux.Instance.Store;
 this.AddDisableTo(store, Render);
 Render(store.State);
 }
 
 void Render(State state)
 {
 var text = this.GetComponent();
 text.text = state.Count.ToString();
 }
 }

Slide 29

Slide 29 text

6OJEVYDT 29 public class Unidux : SingletonMonoBehaviour
 {
 private Store _store;
 public Store Store
 {
 get
 {
 if (null == _store)
 {
 _store = new Store(new State());
 _store.AddReducer(CountReducer.Reduce);
 }
 return _store;
 }
 }
 
 void Update()
 {
 this.Store.Update();
 }
 }

Slide 30

Slide 30 text

ৄ͘͠͸ 30 github.com/mattak/Unidux

Slide 31

Slide 31 text

Կ͕͏Ε͍͠ʁ 31

Slide 32

Slide 32 text

32 特徴 - クラス間が疎結合になる (メンテ, テスト容易に) - 記述ルールが統⼀される - 状態がStateに集約される (記録、デバック容易に) - イベントサイクルが⼀⽅向 (可読性アップ) デメリット - 単純なものの記述量が少し増える - 短期書きなぐり系には冗⻑ (ゲームジャムとか)

Slide 33

Slide 33 text

ήʔϜδϟϜͰ΋ ͍͍ײ͡ʹ ίʔυॻ͖͍ͨɾɾɾ 33

Slide 34

Slide 34 text

34 github.com/mattak/Unibus

Slide 35

Slide 35 text

35 - ObserverPatternを気軽に書けるライブラリ - AndroidのEventBusに相当 - Uniduxのイベント通知部分だけほしい Unibus

Slide 36

Slide 36 text

36 Bus.Instance.Dispatch("message"); イベント送信 イベント受信 void OnEvent(string message) { var text = this.GetComponent(); text.text = message; }

Slide 37

Slide 37 text

ͬͪ͜΋ ελʔΊ͙ΜͰ ͍ͩ͘͞ 37 github.com/mattak/Unibus

Slide 38

Slide 38 text

·ͱΊ 38 github.com/mattak/Unidux スター恵んでください よろしくおねがいします github.com/mattak/Unibus

Slide 39

Slide 39 text

Ҏ্Ͱ͢ɻ ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂʂ 39