Slide 1

Slide 1 text

ゲームエンジニア ワークフロー Unity × C#講座 MIXI 23年卒ゲーム研修 開発本部CTO室 クライアントG サステナビリティ 学校教育推進担当 tanabe akira 田那辺輝

Slide 2

Slide 2 text

この章で実践すること 1. 実用C# 2. 多少のUnity操作 ... Scene/Hierarchy/Inspector 3. ゲーム実装基本テクニック 4. ストレージデータ読み書き 5. Webデータ参照 目次 ● 準備解説 10min ● 実践① 検証アプリ 30min ● 実践②ゲーム応用 30min ● 実践③データ駆動 30min

Slide 3

Slide 3 text

準備解説

Slide 4

Slide 4 text

C#言語の確認 C#言語記法の確認として、 を開い て一緒に読み合わせをしましょう。

Slide 5

Slide 5 text

ゲーム開発とは

Slide 6

Slide 6 text

ゲーム開発とは何を作ることか 例えばノベル+編成+ターンバトルだとすれば... ● コマンドバトルアクションをつくる ● 編成・アウトゲームをつくる ● ノベルをつくる …? これらゲームっぽい何らかの機能実装はスタートライン 本質は "さまざまな「システムをつくる」" ということ ※システムとは、主要コンポーネントと相互作用するいくつかのプログラム、関連するファイル、ドキュメント、保 守などを含む包括的な概念( wikipediaより意訳

Slide 7

Slide 7 text

システムという視点でのゲーム構築 1. アプリシステム 1.1. フレームワーク・アセットデータ管理・セーブデータ・メモリ・キャッシュなど 1.2. + 運営ゲームなら、通信・メンテナンス・中断再開・データ復旧など 2. ゲームパートシステム 2.1. 画像、モーション、パラメータ、ステージ(レベル)を読み込みゲームルールで実行 (再生)するインタラクティブ(入力に呼応する)プレイヤーシステム 3. アウトゲームシステム 3.1. UI遷移起動と通信API/セーブの効率的な制御とパラメータ管理 4. データシステム(設定は多くの場合プランナーがつける) 4.1. 設定値参照。使いやすいのはJSON , ScriptableObject。配布時に何らか難読化する 4.2. Scene配置(実体またはマーカーで)を併用することもある 4.3. 多くの場合で効率的なツールを提供する

Slide 8

Slide 8 text

本編

Slide 9

Slide 9 text

ゲームフラグと ビットフラグと ビット演算と Q.ソフトウェア開発で多 用するbool値の記録は bool型ですか?

Slide 10

Slide 10 text

フラグを扱う型 bool型 > 1byte > 1つのon/offを持つ > サイズは1bitではなく8bit byte型 > 1byte > 8つのon/offを持つ

Slide 11

Slide 11 text

型情報 型 byte サイズ bit サイズ 値の範囲 利用可能 bit数 bool 1byte 8bit (0-1) 1 byte整数 1byte 8bit 0~255 8 int整数 4byte 32bit -2147483648 ~ 2147483647 32

Slide 12

Slide 12 text

sizeof() テスト出力 bool : 1 byte byte : 1 byte, size (8), 0~255 short : 2 byte, size (16), -32768~32767 ushort : 2 byte, size (16), 0~65535 Int16 : 2 byte, size (16), -32768~32767 UInt16 : 2 byte, size (16), 0~65535 int : 4 byte, size (32), -2147483648~2147483647 uint : 4 byte, size (32), 0~4294967295 Int32 : 4 byte, size (32), -2147483648~2147483647 UInt32 : 4 byte, size (32), 0~4294967295 Int64 : 8 byte, size (64), -9223372036854775808~9223372036854775807 UInt64 : 8 byte, size (64), 0~18446744073709551615

Slide 13

Slide 13 text

ビットフラグ渡し ● 1つの値に複数のフラグが保持できるビット演算は多様 な状態を並列管理するクライアント開発で重宝 ● 例1 ○ somefunction(A,B,C,D,E,F); ○ void somefunction(bool a, bool b, bool c, bool d, bool e, bool f, bool g); ● 例2 ○ somefunction(A|B|C|D|E|F); ○ void somefunction(byte value);

Slide 14

Slide 14 text

ビットフラグの利用箇所 ゲームは軽快であることと多くのフラグを扱うという性質 メモリ、ストレージの制約と最適化が求められてきたクライアン ト開発ならではの工夫や慣習でもある フラグのよくある使用例 1. 多様な状態異常の同時保持(毒、SLOW、呪い、暗闇など) 2. ノベル、アドベンチャー、RPGゲーム進行フラグ 3. アクションゲームキャラ動作・判定フラグ Unityでも 1. UnityのPhysics Layerフィルタ/CameraのCulling Mask 2. そのほか関数引数Optionのフラグ

Slide 15

Slide 15 text

実践

Slide 16

Slide 16 text

1 検証アプリ ビット値を確認するゲームを開 発しながら確認 【branch】 feature/chapter1.gameworkflow

Slide 17

Slide 17 text

ビットフラグと実数を確認する ビットフラグはbyte整数、int整数になるわけなので相互に見比べてみる章 Issue1.unity 1. bool, byteなどの情報をcontextmenu, console確認する(テスト) 1.1. @see SceneBItTest.TestPrint 2. 画面を作る 2.1. @see SceneBItTest.SetUIInfos 3. 選択したビットフラグがbyte整数がいくつかを出力する(テスト 3.1. @see SceneBItTest.CheckValue 4. 整数をビットフラグでどう表すか次々に試す(クイズ) 4.1. @see SceneBItTest.NextQuestion

Slide 18

Slide 18 text

4ビットのセルが並ぶ 出題文の整数になるビットを 入力する 指定数正解でクリア、タイム 表示 ビットフラグと実数を確認する

Slide 19

Slide 19 text

2 ゲーム応用 【branch】 feature/chapter1.2.gameworkflow

Slide 20

Slide 20 text

ビットフラグをゲームフラグとして利用する 8つビットフラグと連動する扉の正解を開けてゴールに向かうゲーム進行フラグの基本を試す (アドベンチャー・RPGゲーム) Issue2.unity 1. todo 1.1. 現在のビットフラグを取得するproperty実装 @see SceneBitQuest.currentselect 1.2. 選択のビットがSAFETYか検査するmethod実装 @see SceneBitQuest.SelectValue 1.3. 与えたビットフラグで合格するか検査するmethod実装 @see SceneBitQuest.CheckValue 1.4. 指定テロップを表示してゲームを止めるmethod実装 @see SceneBitQuest.SetGamestop 2. api 2.1. [Flag] Enum.HasFlag 2.1.1. attributeにて[Flag]が与えられているEnumではHasFlagで検査 2.1.2. https://learn.microsoft.com/ja-jp/dotnet/api/system.enum.hasflag?view=net-7.0 2.2. ビット演算 2.2.1. そのほか全ての整数にビット演算によって検査 2.2.2. 例) 4 & (1<<2) == 1 2.2.3. https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/bitwise-and-shift-operators

Slide 21

Slide 21 text

ゲームスタート 指示の扉を開く 全て開けばOK、次のクエスト 間違いは2回まで 全クエスト達成でクリア 間違いもしくは時間切れでゲームオーバー ビットフラグをゲームフラグとして利用する

Slide 22

Slide 22 text

3 データ駆動 ここの題材はこちら ● 宇宙侵略者の撃退 ● Issue3.unityシーンをプ レイしてみよう 【branch】 feature/chapter1.3.gameworkflow

Slide 23

Slide 23 text

(題材)宇宙侵略者の撃退 タイトル画面 ゲーム開始しステージ1の宇宙人と対峙する 全て倒すとステージクリア 次々とステージが表示される 残機(3)を消費するとゲームオーバー なおゲームクリアは無くint.maxvalueまで繰り返す

Slide 24

Slide 24 text

準備運動

Slide 25

Slide 25 text

0. 自動オブジェクト XXController.cs(準備運動) Issue3-1.unity ● 画面の指示に沿ってオブ ジェクトを配置してPlay するとそれぞれが稼働す る様を確認する

Slide 26

Slide 26 text

0. 自動配置Stage.cs(準備運動) Issue3-2.unity ● 画面の指示に沿ってオブ ジェクトを自動配置する Componentを作成しPlay すると期待した配置にな り稼働する様を確認する (写真は12x5体) using System.Collections; using System.Collections.Generic; using UnityEngine; public class Stage : MonoBehaviour { public GameObject player; public GameObject enemy; /// /// /// private void Start() { // @todo // var rect = (transform as RectTransform).rect; // GameObject.Instantiate() // recttransform.anchoredPosition = leftbottomposition } }

Slide 27

Slide 27 text

Stage.cs 実装例 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Stage : MonoBehaviour { public GameObject player; public GameObject enemy; /// /// /// private void Start() { // @todo // var rect = (transform as RectTransform).rect; // GameObject.Instantiate() // recttransform.anchoredPosition = leftbottomposition } }

Slide 28

Slide 28 text

データ駆動実践

Slide 29

Slide 29 text

1. ゲーム設定データファイル読み込み Issue3.unity 1. StageMaker.ImportStageSettingFromFile() 関数実装 2. DataLoader.ReadCurrentDir() 関数実装 ○ プロジェクトフォルダ/stagesetting.json 3. StageMaker.Start() にてImportStageSettingFromFile() 呼び出し

Slide 30

Slide 30 text

scene読み込み状態 再生開始で宇宙人が増えていることが確認できる 1. ゲーム設定データファイル読み込み

Slide 31

Slide 31 text

2. 設定データ出力保存 Issue3.unity 1. StageMaker.ExportCurrentStageSettingToFile()関数実装 2. DataLoader.WriteCurrentDir()関数実装 3. 新データ保存+動作確認 ○ 保存したデータが反映されていることを確認するためタイトル画面のキャラ クター数と位置を変えるタスク ○ StageMaker.fieldsettingの配置を変え、”再生中に”canvas/telop/titleのenemy を増やし、StageMakerコンテキストメニュー"export current setting"にて stagesetting.jsonへ保存 ○ (StageMaker.fieldsetting、StageMaker.enemystatusは空にして )次の再生 時にstagesetting.jsonに保存されるものが反映されることを確認する

Slide 32

Slide 32 text

Vanvas/telop/title/enemyを増やす  ctrl + D(command + D)でコピー シーンにあるGameSystemを選択して StageMakerの 「…」 メニューから export stage setting を実行すると実装でき ていれば現在の値でjson出力されるはず 2. 設定データ出力保存

Slide 33

Slide 33 text

3. Webからの設定データ参照を確認する Issue3.unity 1. StageMaker.Start()を IEnumeratorに置き換え ○ UnityEngine.Networking.UnityWebRequest.Get(url) ○ テストurl (後日利用はご自身でWebアップロード。 /chapter1.gameengineerworkflow/stagesetting_websample.json ) ○ StageMaker.SetStageSettingFromString()呼び出し 2. DataLoader.ConvertData()を実装 ○ (string) Json to Object 3. StageMaker.SetStageSettingFromString()を実装 ○ WebRequestリザルトをDataLoader.ConvertData()へ ○ ConvertリザルトをStageMakerプロパティへ反映

Slide 34

Slide 34 text

scene読み込み状態 再生開始で宇宙人が増えていることが確認できる 3. Webからの設定データ参照を確認する

Slide 35

Slide 35 text

回答例 【branch】 feature/chapter1.answer.gameengineerworkflow

Slide 36

Slide 36 text

おわり