Upgrade to Pro — share decks privately, control downloads, hide ads and more …

なぜ技術がないと 面白いゲームが創れないのか?

なぜ技術がないと 面白いゲームが創れないのか?

「現場のエンジニアが語る『Fate/Grand Order』の開発技術からアップデートに関するノウハウまで一挙公開 Presented by GMOアプリクラウド」の講演資料です。

Yuki Tamura

July 10, 2017
Tweet

More Decks by Yuki Tamura

Other Decks in Technology

Transcript

  1. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE class Programmer { // ԿͰ΋΍ΔϓϩάϥϚʔΫϥε public String Programming(); //

    ϓϩάϥϜΛ͢Δ public Document writeSpecification(); // ࢓༷ॻΛॻ͘ public GanttChart getNewestProgressAll(); // શମਐḿ } ͜ͷྫͰ͸ɺϓϩάϥϚʹ͋·Γʹ΋ଟ͘ͷ੹೚Λ ෛΘ͍ͤͯ·͢ɻ ਐḿͷ΍Γํ͕มΘΕ͹͜ͷΫϥεΛมߋɺ ࢓༷ॻͷܗ͕ࣜมΘΕ͹͜ͷΫϥεΛมߋɺ Կ͔͋Δ౓ʹ͜ͷΫϥεΛ৮ΔӋ໨ʹͳΓ·͢ɻ
  2. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE class Programmer { public String Programming(); // ϓϩάϥϜΛ͢Δ }

    class GameDesigner { public Document writeSpecification(); // ࢓༷ॻΛॻ͘ } class ProjectManager { public GanttChart getNewestProgressAll(); // શମਐḿ } ໾ׂΛม͑ͯ͋͛Δ͜ͱͰɺγϯϓϧʹͳΓ·͢ɻ ͨͩ͠ɺצҧ͍͠΍͍͢ͷͰ͕͢ɺ ҰͭͷΫϥε͸Ұͭͷػೳɺͱ͍͏ҙຯͰ͸͋Γ·ͤΜɻ
  3. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Rectangle +Draw() +Area() Computational Geometry Application ジオメトリアプリ 計算させようとする Graphical

    Application 描画させようとする グラフィックアプリ GUI 責任が二つ!!! ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
  4. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Rectangle +Draw() Computational Geometry Application ジオメトリアプリ Graphical Application グラフィックアプリ

    GUI Geometric Rectangle +Area() 責任を分解 ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ 責任は一つ!
  5. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE 10:00 ग़ࣾ 10:30 A͞ΜͱMTG 11:00 A͞ΜMTG౿·͑ͯB͞ΜͱMTG 12:00 B͞ΜMTG౿·͑ͯεέδϡʔϧMTG 13:00

    εέδϡʔϧMTG౿·͑ͯλεΫMTG 14:00 λεΫMTG౿·͑ͯΞαΠϯMTG 15:00 ΞαΠϯMTG౿·͑ͯ࠾༻MTG ྫͱͯ͠ͷ͋Δ̍೔ɿ
 ͜͏ͨ͠ྲྀΕʢߏ଄ʣ͸ɺ Կ͔Λલఏʹಈ͍͍ͯΔͨΊɺ ඇৗʹ༥௨͕ར͖ͮΒ͍ɻ Ұ͕ͭϦεέ͞ΕΔ͚ͩͰɺ ଞͷ.5(͕։࠵Ͱ͖ͳ͔ͬͨΓɺ ҙຯ͕ͳ͘ͳͬͯ͠·͏ɻ ݸʑ͕ີ݁߹ʹͳ͍ͬͯΔɻ
  6. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE class Rectangle { // ௕ํܗ public Rectangle(int x, int

    y, int width, int height) { … } public void SetWidth(int width) { … } public void SetHeight(int height) { … } } class Square : Rectangle { // ௕ํܗΛܧঝͯ͠ਖ਼ํܗ public Square(int x, int y, int width, int height) { … } public void SetWidth(int width) { … } public void SetHeight(int height) { … } } ྫ͑͹ɺ௕ํܗΛܧঝͯ͠ਖ਼ํܗΛͭ͘Δ ͦΕ͸ਖ਼͍͔͠ʁ
  7. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Shape ShapeType Circle +Draw() Square +Draw() void DrawShape(Shape& s)

    { switch(s.type) { case Square: ((Square&)s).Draw(); break; case Circle: ((Circle&)s).Draw(); break; } これではCircleやSquareは
 Shapeの代わりに使えない。 ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ Draw()
 がない
  8. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE <<interface>>
 ButtonServer +TurnOn() +TurnOff() Button +Poll() Lamp 上位とは何か?
 それは即ち「抽象」です。

    Buttonが依存するのは、 ButtonServerというInterfaceで
 あるべきで、LampはButtonServerを
 実装すれば良いので依存が逆転します。 ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
  9. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Door Timed Door <<interface>> Timer Client +Lock() +Unlock() +IsOpen()

    + TimeOut() Timer Doorから、一定時間開放されていると
 警報が鳴るTimed Doorを作りましたが……。 DoorというInterfaceがTimeOutという口を使う羽目に。 Doorを汚染 ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
  10. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Door Timed Door <<interface>> Timer Client +Lock() +Unlock() +IsOpen()

    + TimeOut() Timer + TimeOut() Door Timer
 Adapter + TimeOut() TimerClientから 派生する
 Adapterを作成 具体的処理は TimedDoorに委譲 ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ
  11. $PQZSJHIU%&-J()5803,4*OD"MM3JHIUT3FTFSWFE Door Timed Door <<interface>> Timer Client +Lock() +Unlock() +IsOpen()

    + TimeOut() Timer + TimeOut() 多重継承に近いことができるなら こうした設計も考えられる ࢀߟɿϩόʔτɾ$ɾϚʔνϯʢʣʮΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʯ4#ΫϦΤΠςΟϒ