HeadFirstの本を読んでStrategy Patternを覚えました。
O’Reilly Japan – Head Firstデザインパターンhttps://www.oreilly.co.jp/books/4873112494/初めて学ぶ方、過去に挫折した経験のある方、知識を確固たるものにしたい方を対象に、イラストや写真を使ってやさしく楽しく解説する人気のHead Firstシリーズのデザインパターン編。刺激的なレイアウト、思わず膝を叩く見事なたとえ、引き込まれる小話、楽しいクイズやパズルで飽きることなく読み進むことができます。複雑難解なデザインパターンの概念が面白いほどよくわか…
色んなひよこを作るとき副作用無しで動きを柔軟に変更できるのが良いです。
メモ
- 実装に対するプログラミングより、インターフェース/スーパータイプに対するプログラミングをするべき。
- サブクラスに動きの挙動を加えると隠蔽されて再利用できなくなる。
- 自分のプロジェクトで使ってみた。
スーパークラスにinterface型IFlyBehaviorを足す
flyBehaviorのプロパティだとUnityが落ちるのでSetPerformFlyメソッドで実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using UnityEngine; using System.Collections.Generic; using System.Collections; public class CharacterManager : MonoBehaviour { public IFlyBehavior flyBehavior; public void SetPerformFly(IFlyBehavior iFlyBehavior) { flyBehavior = iFlyBehavior; } public void PeformFly() { flyBehavior.Fly(); } } |
下は動かなかった
1 2 3 4 5 |
public IFlyBehavior flyBehavior { set{ flyBehavior = value;} get{ return flyBehavior;} } |
interfaceとinterfaceを継承したクラスを作成
.csは三つ作成
IFlyBehavior.cs
1 2 3 4 5 6 |
using UnityEngine; using System.Collections; public interface IFlyBehavior { void Fly(); } |
FlyNoWay.cs
1 2 3 4 5 6 7 8 9 10 11 12 |
using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; public class FlyNoWay : IFlyBehavior { public void Fly() { Debug.Log("FlyNoWay"); } } |
FlyWithWings.cs
1 2 3 4 5 6 7 8 9 10 11 12 |
using UnityEngine; using System.Collections; using UnityEngine; using System.Collections; public class FlyWithWings : IFlyBehavior { public void Fly() { Debug.Log("FlyWithWings"); } } |
実装に対するプログラミング
とりあえず爆弾ひよこを作ってみる
3Dモデルと飛ぶ振る舞いの細かい中身は後にしてログだけ出す。
動的に飛ぶ振る舞いを変えれるようにAwake,Startで変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using UnityEngine; using System.Collections; public class BombChick : ChickManager { void Awake () { SetPerformFly(new FlyWithWings()); base.PeformFly(); } void Start() { SetPerformFly(new FlyNoWay()); base.PeformFly(); } void Update () { } } |
UnityEditorで確認
FlyWithWings,FlyNoWayが呼ばれました^^
もし爆発振る舞いが欲しければChickManagerに追加すればよい、その時他のサブクラスには影響は無いですね。