Slide 1

Slide 1 text

unity1week online共有会 #1 青木とと@lycoris102

Slide 2

Slide 2 text

だれ? 2 @lycoris102 青木とと ねんれい:30 かぞく: 妻と3歳の息子 ・Unityアンバサダー ・ゆるふわゲームクリエイター ・ゆるふわイベントオーガナイザー  ・Gotanda.unity  ・UnityDesigner’sCafe  ・unity1week Meetup

Slide 3

Slide 3 text

だれ? 3 #unity1week でゲームを作るのも好きです https://unityroom.com/users/lycoris102

Slide 4

Slide 4 text

4 「密」で作ったゲーム Sweet^2 Honey Hive

Slide 5

Slide 5 text

5 今日の話 アジェンダ 時間があれば コードの一例 (状態管理) Unityで 演出を作る ゲームデザインと 作り方 10分で話せるだけ話します! (時間ない)

Slide 6

Slide 6 text

6 今日の話 アジェンダ Unityで 演出を作る ゲームデザインと 作り方 時間があれば コードの一例 (状態管理)

Slide 7

Slide 7 text

7 ゲームデザインと作り方 やったこと 好きなゲームからアイデアを組み合わせる

Slide 8

Slide 8 text

8 ゲームデザインと作り方 カタン アニマロッタシリーズ ハニーエイト + サイコロ2つ降る 出た目から資源を獲得 ルーレットを回す 出た目を起点に領地を広げていく 出目が当たった時の高揚感と領地が広がったときの視覚的な嬉しさが好き

Slide 9

Slide 9 text

9 ゲームデザインと作り方 このままだと運しかなくて 自己統制感/意思決定がない
 (自分がゲームをコントロールしているような感覚がない) 中間目標がなくて メリハリがなく途中でダレる 脳内プレイによる課題感の洗い出し

Slide 10

Slide 10 text

10 ゲームデザインと作り方 人生ゲーム/桃鉄/じぱんぐ島 … etc から出目や盤面を操作するアイデアを追加 ショップ ゲームをコントロールしている感覚を追加 安定/チャレンジのジレンマ要素の追加

Slide 11

Slide 11 text

11 ゲームデザインと作り方 (これ何か元ネタあったっけな……) 宝箱 中間目標を追加し ゲームの流れにメリハリを生み出す

Slide 12

Slide 12 text

12 ゲームデザインと作り方 0から面白い体験を作るのは難しいので 複数のアイデアを組み合わせて 課題を解消し ゲームとして成立させる 自分が「面白い!」と思えるものを採択することが面白さにつながる / 「パクリ」を恐れない

Slide 13

Slide 13 text

13 ゲームデザインと作り方 やったこと デザインモックから作る

Slide 14

Slide 14 text

14 ゲームデザインと作り方 アイデアを決めてから イラレで作ったデザインモック(一枚絵) この時点で実際のゲーム画面に必要な情報は8割くらい揃っている

Slide 15

Slide 15 text

15 ゲームデザインと作り方 デザインモックによるデザインマター開発 目指すべき絵作りの指標を定義でき 後発する素材のテイストを統一出来る 素材がある状態で開発に取りかかることができる (仕様としての)要素を洗い出せているので 開発時のクラス設計に役立つ 自分はイラレでやったが、アセットを使う場合Unity上で挙動を組み込む前にハリボテで作ることも可能

Slide 16

Slide 16 text

16 ゲームデザインと作り方 画面だけ作ってお腹いっぱいになっちゃうので注意

Slide 17

Slide 17 text

17 今日の話 アジェンダ Unityで 演出を作る ゲームデザインと 作り方 時間があれば コードの一例 (状態管理)

Slide 18

Slide 18 text

18 Unityで演出を作る やったこと 基本Timeline 時々 DOTween

Slide 19

Slide 19 text

19 Unityで演出を作る Unity2017で提供されたビジュアルツール Timeline

Slide 20

Slide 20 text

20 Unityで演出を作る ゲームの状態毎に Timeline / PlayableDirector を用意

Slide 21

Slide 21 text

21 例: サイコロを振る時の Timeline 「TurnDiceRoll」という状態に遷移したときに、UIを捌けさせ、ダイスを振るアニメを実行する Unityで演出を作る

Slide 22

Slide 22 text

22 Timelineのいいところ 複数のオブジェクトの アニメーションを 同時に制御できる Unityで演出を作る

Slide 23

Slide 23 text

23 Timelineのいいところ Audio(効果音)の 再生タイミングも 合わせて制御できる Unityで演出を作る

Slide 24

Slide 24 text

24 Timelineのいいところ Signalにより Timeline中に 任意のコンポーネントの メソッドを実行可能 Unityで演出を作る

Slide 25

Slide 25 text

25 ランダムで画像を差し替え、最後にはターン開始時に定義されたダイス値の画像に差し替えする例 SignalReceiverで どのSignalが来たら どのメソッドを実行するかの定義 Unityで演出を作る

Slide 26

Slide 26 text

26 タイムラインの終了を通知するSignalを受けて、次の状態へ遷移する Unityで演出を作る

Slide 27

Slide 27 text

27 Signalの詳細について こちらのスライドでも発表してます (手前味噌) https://learning.unity3d.jp/2337/ Unityで演出を作る

Slide 28

Slide 28 text

28 Unityで演出を作る Script上で動かすTween系 (2値を補完するように動く) アセット DOTween

Slide 29

Slide 29 text

29 今回のDOTweenの使い所 数字のカウントアップ https://qiita.com/RyotaMurohoshi/items/f7312e802f7698e42cd0 ▼ @RyotaMurohoshi さんが拡張を書いてくれています! Unityで演出を作る

Slide 30

Slide 30 text

30 今回のDOTweenの使い所 時間をずらしての Timelineの連続再生 マス解放/はちみつを獲得するTimelineを一定時間間隔毎に順序よく再生する Unityで演出を作る

Slide 31

Slide 31 text

31 今日の話 アジェンダ Unityでの 演出の 作り方 ゲームデザインと 作り方 時間があれば、どういうコードを書いているか晒します 時間があれば コードの一例 (状態管理)

Slide 32

Slide 32 text

32 コードの一例 タイトル チュートリアル 初期設定 ターン開始 ダイスロール はちみつ獲得 マス獲得 ターン終了 結果発表 状態管理(GameState) Enumで定義

Slide 33

Slide 33 text

33 IGameStateHandler 大まかな構造 IGameStateRenderer View (MonoBehaviour) IGameStateController IGameStatePresenter Presenter IGameStateUseCase IGameStateEntity IDiceEntity IHexEntity IHoneyEntity IShopEntity … UseCase Entity 入力 描画 UseCaseへの伝搬 出力するViewのマッピング ビジネスロジックの実行/複数のEntityを跨ぐ処理 状態の保持/更新/変更の通知 IDiceUseCase IHexUseCase IHoneyUseCase IShopUseCase … Enum Stuct Installer Utility <リスペクト> CAFU (CleanArchitectureForUnity): https://github.com/umm/cafu_core コードの一例

Slide 34

Slide 34 text

34 MonoBehaviourからのイベントを流す責務
 (Timelineの終了時に値を発行) TimelineGameStateHandler View (MonoBehaviour) イベント通知/購読の仕組みに UniRx を利用 コードの一例

Slide 35

Slide 35 text

35 ButtonGameStateHandler View (MonoBehaviour) コードの一例 MonoBehaviourからのイベントを流す責務
 (ボタンが押された時に値を発行)

Slide 36

Slide 36 text

36 Viewからのイベント通知を集約して UseCaseに流す責務 GameStateController Presenter コードの一例 View群は、Zenjectによって依存性注入されている

Slide 37

Slide 37 text

37 通知を受けてEntityの状態変更を行ったり、Presenterに描画命令を投げたりする責務 GameStateUseCase UseCase コードの一例 EntityやPresenterは、Zenjectによって依存性注入されている

Slide 38

Slide 38 text

38 状態の保持/変更/通知をする責務 GameStateEntity Entity コードの一例

Slide 39

Slide 39 text

39 UseCaseからの描画命令を 条件を満たすView(群)に対して実行する責務 GameStatePresenter Presenter コードの一例

Slide 40

Slide 40 text

40 描画処理を行う責務 = 今回はTimelineの再生を行う TimelineGameStatePlayer View (MonoBehaviour) IGameStateRendererを実装すればTimeline以外にもState変更時に処理することが出来る コードの一例

Slide 41

Slide 41 text

41 Zenjectを使っている Installer経由で各クラスは初期生成され Bindすることで各クラスに依存性注入される GameInstaller 予めSceneにいる View (MonoBehaviour) は ZenjectBinding を利用して Bind コードの一例

Slide 42

Slide 42 text

42 正直ここまでやっちゃうのは ゲームジャムだとやりすぎ感もある ゲームを作る上で必須な技術というわけでも無いし
 UniRxやZenjectも使っているので 少なくとも初学者にはオススメ出来ない けど責務をきちんと分割することで (特にシミュレーションゲームのような情報を扱うゲームは) 読みやすくなったり、変更しやすくなったりするので 「こういう風に書いてる人もいるよ」くらいの話 何か調べてみたりするきっかけになったら良いかも コードの一例

Slide 43

Slide 43 text

43 今日の話 時間があれば コードの一例 (状態管理) Unityで 演出を作る ゲームデザインと 作り方 断片的な話で恐縮ですが、やっていることの雰囲気が伝われば幸いです

Slide 44

Slide 44 text

44 unity1week 毎回色々な事を試せるし 短い時間で自分のゲームを完成出来るし 面白ゲームいっぱい遊べるし サイコー! naichiさん、いつも本当にありがとうございます! さいごに

Slide 45

Slide 45 text

https://fonts.google.com/specimen/Fascinate ちなみにタイトルロゴの フォントは「Fascinate」

Slide 46

Slide 46 text

46 おまけ: 大まかなスケジュール 月    火    水    木    金    土    日 初期設定 アイデア出し デザインモック ビジネスロジック (Entity/UseCase) MonoBehaviour との繋ぎ込み コアな挙動の完成 ターンサイクル ショップの実装 演出ブラッシュアップ タイトル/チュートリアル/結果 ランキング/BGM/SE 合計25時間程度 今回は妻から土日に作業時間をたくさんもらえたので、圧倒的に感謝……!!