Slide 1

Slide 1 text

僕が考えた 最強のゲーム制作フロー Coading guu

Slide 2

Slide 2 text

目次 第1部 全体の流れをざっくり解説  企画  ゲーム企画の考え方  企画を詰める・文書化  設計  画面設計やり方  役割分担やり方  実装  見直し 第2部 ゲームシステムの考え方 じっくり解説  必要な機能を考える  機能を具体的に  機能をさらに分割  機能をグループ分け  機能を関数に  変数、関数をクラスに  公開する範囲を考える  クラスのグループ分け  クラス同士をつなげる  同じものは共通化する

Slide 3

Slide 3 text

第1部 全体の流れをざっくり解説企画

Slide 4

Slide 4 text

最強のゲーム制作フロー 企画 •案出し •企画を詰める •企画の文書化 設計 •画面設計 •クラス設計 •役割分担 実装 •ひたすら制作 見直し •バグ、エラーチェック •使用感の改善 •仕様変更

Slide 5

Slide 5 text

ゲーム企画の考え方 何のためにゲームを作る? 誰が 私 30代の仕事で 疲れた男性 大人数で遊ぶのが好き な小学生 技術力向上 仕事忘れられるといい 簡単なルール 何を学びたい? ローカルマルチゲーム 短時間で遊べる サーバを動かす 必要があるゲーム 爽快感があるゲーム ソーシャルゲーム的な 少ない操作で遊べる 白熱するゲーム

Slide 6

Slide 6 text

ゲーム企画の考え方 何を感じてほしい 吹っ飛ばした 時の爽快感 悲壮な世界への 苦い気持ち ステージクリア の達成感 UIとかのデザインを統一 ストーリが必要? やりこみ要素が欲しい 死にゲーとかもあり 演出凝りたい 吹っ飛ばしたら何かよいことある?

Slide 7

Slide 7 text

おすすめツール  オンラインホワイトボード  思い付きを付箋で張っていく  共有しやすい  基本無料 https://miro.com/ja/

Slide 8

Slide 8 text

企画を詰める・文書化  コンセプトを文字にしよう  どんな気持ちになってほしいか入れておくのがポイント  ex:「逃げられない恐怖」→閉鎖的な状況になるようにしよう  ゲームジャンルの設定  どんなゲームなのか分かるように 企画の文書化も進めよう‼

Slide 9

Slide 9 text

企画を詰める・文書化 ゲームの仕様を決めよう  ゲームスタートからゲームクリアの流れは?  できるだけ詳しく  ゴール扉に入るとステージクリア → ゴールの扉にプレイヤーが触れたら、扉に入る動作をしてリザルト画面を表示 この時、プレイヤーは空中にいてもよい また、プレイヤーはいかなる動作中でもそれを中断し、 扉の地面に移動した後、扉にはいる動作を行う  認識の違いを減らす  ゴールの扉にプレイヤーが触れたら、扉に入る動作をしてリザルト画面を表示 →プランナーは、空中でゴールしたら、扉の前まで移動するモーションが入ると思っていたが、 プログラマーは、扉の前に瞬間移動すると思っていた

Slide 10

Slide 10 text

おすすめツール  オンライン上の共有スペース  素材や文書、URLの共有がやりやすい  様々なツールが使える  スプレッドシート  ドキュメント  miro などなど  基本無料 https://workspace.google.com/intl/ja/prod ucts/drive/

Slide 11

Slide 11 text

画面設計 ゲーム画面に何があるか決めよう  ゲーム画面は何がある  コマンド選択画面、攻撃画面、オプション画面などなど  画面はどんな遷移になっている?  コマンド選択画面から、ポーズ画面に遷移できるの?  特に、UIは念入りに設計しよう  設計したUIの配置をそのままゲームに持っていけるように

Slide 12

Slide 12 text

おすすめツール  デザインツール  画面に必要なパーツを作成しすいし、配置しやすい  共有しやすい  基本無料 https://www.figma.com/login?is_not_gen_0=true&res ource_type=team

Slide 13

Slide 13 text

クラス設計 どんなスクリプトを作る? クラス同士はどういう関係? クラス図を書こう 詳しくは、第2部で

Slide 14

Slide 14 text

おすすめツール  クラス図が書きやすい  共有しやすい  基本無料 https://www.drawio.com/

Slide 15

Slide 15 text

役割分担 どこの機能をだれが担当するか決めよう  大きな機能の塊ごとに分けるとよい  アウトゲーム、インゲーム、プレイヤー、ステージなどなど  いつまでにどの機能を制作完了するか決めよう  他の機能制作までに完成しておく必要がある機能があるかも

Slide 16

Slide 16 text

実装 ひたすら決めた仕様に沿って実装 確実に動くように、機能単体でテストはしておこう できた機能は、他のチームメンバーに見てもらおう 実装の考え方は、第2部で

Slide 17

Slide 17 text

見直し 実際に遊んでみよう 実施に遊んでみると、大抵バグ・エラーが発生したり、使用感が悪いなどの問題 が発生する 残りの時間を気にしながら、どこを修正するのか重要度を決めて修正しよう‼ 重要度  高い → ゲームプレイに深刻な被害を及ぼす  進行不能バグ、コンセプトから外れた機能  低い → ゲームの完成度に影響が少ないもの  発生度が低く、問題にならないバグ、あってもなくてもいいもの

Slide 18

Slide 18 text

第2部 ゲームシステムの考え方じっくり解説

Slide 19

Slide 19 text

お題とするゲーム 横スクロールアクションゲームを題材に考えていく プレイヤーの歩き動作を制作していく

Slide 20

Slide 20 text

必要な機能を考える プレイヤーは何ができる? できることを書きだそう 歩く 走る しゃがむ ジャンプ 大きくなる 小さくなる 炎を投げる 泳ぐ ヒップドロップ 無敵

Slide 21

Slide 21 text

機能を具体的に 洗い出した機能を具体的にしていく 歩く 左方向の入力があった時に、 毎フレーム0.1(Unity座標)ずつ x座標を増加する 右方向の入力があった時に、 毎フレーム0.1(Unity座標)ずつ x座標を減少する

Slide 22

Slide 22 text

機能をさらに分割 機能を具体的にすると 複数の機能が含まれている場合がある 左方向の入力があった時に、 毎フレーム0.1(Unity座標)ずつ x座標を増加する 左方向の入力を受け取る 毎フレーム0.1(Unity座標)ずつ x座標を増加する

Slide 23

Slide 23 text

機能をグループ分け これまでの過程で生まれたたくさんの機能を 同じような機能同士でグループ化します 右方向の入力 を受け取る x座標を 0.1減少 マウスのクリック を受け取る スペースキーの 入力を受け取る 入力 座標変更 y軸を基準に 180度回転 y座標を 1増加

Slide 24

Slide 24 text

機能を関数に 機能を実際にプログラムにしていきましょう 数値や文字は、変数にしておきましょう(生のデータは避ける) const string HORIZONTAL_KEY_PARAM = "Horizontal"; float IsHorizontalKeyDown() { return Input.GetAxisRa(HORIZONTAL_KEY_PARAM); } void Move(float speed) { transform.position += new Vector3(speed, 0, 0); } 入力 座標変更

Slide 25

Slide 25 text

変数、関数をクラスに 1つのクラスには、1つの責任 作成した変数、関数をクラスにまとめるときには、複数の機能が入り込まないよ うに気を付けましょう public class PlayerInputReader: MonoBehaviour { const string HORIZONTAL_KEY_PARAM = "Horizontal"; float IsHorizontalKeyDown() { return Input.GetAxisRaw(HORIZONTAL_KEY_PARAM ); } } 入力 public class PlayerMover: MonoBehaviour { void Move(Vector3 direction, float speed) { transform.position += direction * speed; } } 座標変更

Slide 26

Slide 26 text

公開する範囲を考える どの機能を他のクラスが使うのか考えよう 特別な理由がない限り、基本はprivateな方がいい

Slide 27

Slide 27 text

公開する範囲を考える public class PlayerInputReader: MonoBehaviour { private const string HORIZONTAL_KEY_PARAM = "Horizontal"; public float IsHorizontalKeyDown() { return Input.GetAxisRaw(HORIZONTAL_KEY_PARAM ); } } 入力 public class PlayerMover: MonoBehaviour { public void Move (Vector3 direction, float speed) { transform.position += direction * speed; } } 座標変更

Slide 28

Slide 28 text

クラスのグループ分け 作成したクラスをプレイヤーや敵など カテゴリごとにグループ化しましょう PlayerInputReader PlayerMover Player

Slide 29

Slide 29 text

クラスのグループ分け 名前空間を使ってモジュール化しましょう 名前空間をつけるとプログラム上でカテゴリ分けされます namespace Player { public class InputReader: MonoBehaviour { // 省略 } } 入力 namespace Player { public class Mover: MonoBehaviour { // 省略 } } 座標変更

Slide 30

Slide 30 text

クラス同士をつなげる 作成したクラスは独立しています クラスをつなげるクラスを 作成しましょう namespace Player { public class Mediator: MonoBehaviour { [SerializeField] private Transform _transform; [SerializeField] private float _speed = 0.1f; [SerializeField] private InputReader _inputReader; [SerializeField] private Mover _mover; private Vector3 _forward => _transform.forward; pivate void OnValidate() { _transform = _transform ?? Transform; } private void Update() { if(_inputReader. IsHorizontalKeyDown >= 1f) { _mover. Move(_forward, _speed); } } } } クラスをつなげる

Slide 31

Slide 31 text

同じものは共通化する コードのコピはエラーの元 同じコードは書かないように共通クラスや共通メソッドなどにまとめましょう namespace Common { public static class UtilityData { public static float MIN_ROTATION = 0f; public static float MAX_ROTATION = 360f; public static float ClampRotation(float rotation) { return Mathf.Clamp(rotation, MIN_ROTATION, MAX_ROTATION ); } } }

Slide 32

Slide 32 text

おわりに これが最強のゲーム制作フローだー‼ 今回は全体的な流れをざっくり解説しました。 皆さんも自分自身の最強のゲーム制作フローを見つけましょう‼