Slide 1

Slide 1 text

2021-新卒研修-ゲーム開発-前半

Slide 2

Slide 2 text

目次 I. T01. まずUnityをGUIだけで触ってみよう II. T02. スクリプトを書けるようになろう III. T03. ゲーム画面にUIをつけてみよう IV. T04. 当たり判定を実装してみよう V. T05. コルーチン(Coroutine)

Slide 3

Slide 3 text

自己紹介 ● 岡本 勇太(yuta.okamoto) ● 2018新卒入社 ● モンストクライアントG エンジニア ○ C++ / Cocos2dx ○ ストライクショット ○ 新規コンテンツのUI実装 ○ 開発フロー改善 ○ モンスターストライクスタジアムの開発サポート

Slide 4

Slide 4 text

T01. まずUnityをGUIだけで触ってみよう

Slide 5

Slide 5 text

T01. まずUnityをGUIだけで触ってみよう ● GameObject作成する ○ Hierarchy -> 右クリック -> Create Empty ○ GameObject名: FieldRoot ● 子GameObject作成する ○ Hierarchy -> オブジェクト選択右クリック -> 3D Object -> Cube ※ドラック&ドロップで移動も可 ○ GameObject名: Base

Slide 6

Slide 6 text

T01. まずUnityをGUIだけで触ってみよう ● 座標、向き、大きさを変更する ○ Inspector -> Transform Component ○ ※Unityの座標系はY軸が縦方向

Slide 7

Slide 7 text

T01. まずUnityをGUIだけで触ってみよう ● GameObjectが重力の影響を受けるようにする ○ Inspector -> Add Component -> RigidBody ○ 適当な高さのY座標に置いて、「Run   」すると、自由落下するようになっている。

Slide 8

Slide 8 text

T01. まずUnityをGUIだけで触ってみよう ● GameObjectに弾性を加えてみる ○ Assets/Tasks/T01/Physic Material.physicMaterial ■ Bounciness: 1 0~1の範囲でオブジェクトの弾性(跳ね返りの度合い)が設定できる ○ GameObjectのInspector -> ◯◯ Collider -> Material にドラック&ドロップ

Slide 9

Slide 9 text

T02. スクリプトを書けるようになろう

Slide 10

Slide 10 text

T02Ex. MonoBehaviour ● MonoBehaviour is the base class from which every Unity script derives. (MonoBehaviourは、すべてのUnityスクリプトが派生する基本クラスです。 ) らしい。(MonoBehaviour) ● 語弊を恐れず簡単に言うと スクリプトを書く際に MonoBehaviourを継承する必要があり、そのスクリプトで Unityのライフサイクルに よって呼び出されるイベント関数の内容を定義できる。 ● イベント関数はいくつかあり、詳しくは公式マニュアルに載っています。 https://docs.unity3d.com/ja/2019.4/Manual/ExecutionOrder.html

Slide 11

Slide 11 text

T02Ex. Awake, Start, Updateメソッド ● MonoBehaviourクラスのメソッドでUnityのシステムから呼び出されるイベント関数 ● Awake() ○ アタッチされたGameObjectが初期化された時に呼び出されるメソッド。 ○ Startよりも呼び出し順が早いため、シングルトンなど複数から参照される可能性のあるインスタンスの初期化処理を 呼び出したり。 ○ MonoBehaviour-Awake() - Unity スクリプトリファレンス ● Start() ○ スクリプトが有効になった最初のUpdate()が呼ばれる直前に呼び出されるメソッド ○ 例)初期化など1度だけ実行したい処理を呼び出したり。 MonoBehaviour-Start() - Unity スクリプトリファレンス ● Update() ○ スクリプトが有効な時に毎フレーム呼び出されるメソッド ○ 例)タッチ判定、フレーム単位での座標更新を行ったり。 MonoBehaviour-Update() - Unity スクリプトリファレンス

Slide 12

Slide 12 text

T02. スクリプトを書けるようになろう ● スクリプトで動かすGameObjectを作成する ○ 今回はカプセルのGameObjectを作成。(3D Object -> Capsule) ○ 用意されているMoveTarget.csをGameObjectにアタッチ。(Inspector -> AddComponent) ● MoveTargetクラスに変更を加えて 移動速度を調整できるようにしてみよう ● MoveTargetクラスに変更を加えて XZ平面を円形に移動するようにしてみよう ● チャレンジ:新しいスクリプトを作成して GameObjectにアタッチ、好きに変更してスクリプトの理解度を深 めよう

Slide 13

Slide 13 text

T02. スクリプトを書けるようになろう ● MoveTargetを量産する ○ MoveTargetをPrefab化する。(次スライド) ○ MoveTarget生成用のGameObjectを作成。(Create Empty) ○ FactoryMoveTarget.csをGameObjectにアタッチ。(Inspector -> AddComponent) ● FactoryMoveTargetクラスに変更を加えて 初期生成位置を指定できるようにしてみよう ● FactoryMoveTargetクラスに変更を加えて ランダムな位置に生成するようにしてみよう ● チャレンジ:別のPrefabを作成、好きな条件で 2種類のオブジェクトを出し分けてみよう

Slide 14

Slide 14 text

T02Ex. Prefab化 ● Prefab化する ○ 再利用出来るようGameObjectをオブジェクトファイルとして保存する ※拡張子は.prefab ○ Hierarchyから Project -> 保存したいフォルダ上にドラック &ドロップ ● Prefab化したオブジェクト自体を編集したい場合 ○ Prefab化したオブジェクトを選択 ○ Inspector -> Open Prefab ○ 値をいじると自動でScene側のGameObjectにも反映されてる。

Slide 15

Slide 15 text

T03. ゲーム画面にUIをつけてみよう

Slide 16

Slide 16 text

T03Ex. Canvas ● UnityにおいてUI表現をするために必要なコンポーネント ○ https://docs.unity3d.com/ja/2019.4/Manual/class-Canvas.html ○ UI オブジェクトはCanvasコンポーネントを持った GameObjectの子である必要があります。 ■ Text、Image、Button...etc ● Canvas = UI描画する領域(のようなもの) ○ 描画優先やCameraと組み合わせてどのように表示するかを設定できる。 ○ 複数Canvasを作成することで描画内容毎に UIオブジェクトを管理したりなど。 ■ Canvasの子要素の表示が変化した際、 Canvasの子要素全てが再描画されるため、 最適化の面でも静的な UIと動的なUIはCanvasを分けたほうが良いです。

Slide 17

Slide 17 text

T03Ex. UIオブジェクト ● UIを構築する上で扱うコンポーネントを持った GameObject ○ Inspector -> 右クリック -> UI ■ Text:文字を描画する ■ Text - TextMeshPro:文字を描画する(Textよりも機能が豊富でリッチな表現ができる) ■ Image:画像を描画する ■ Button:ボタンを実装する。etc… ● UIオブジェクトはRectTrasnformという矩形を扱うコンポーネントを持ちます。 ○ https://docs.unity3d.com/ja/2019.4/Manual/class-RectTransform.html ○ Position, Rotation, Scaleの他にWidth, Height, Anchor Pointなど UI描画に必要な要素を持ったコンポーネント。

Slide 18

Slide 18 text

T03. ゲーム画面にUIをつけてみよう ● Canvasにテキストを配置する ○ Hierarchy -> 右クリック -> UI -> Text - TextMeshPro ※今回はuGUIのTextではなく、TextMeshProを使用する ※Canvasが存在しない場合自動的に Canvasが生成され、子にTextオブジェクトが生成される ● Inspectorから好きな文字列をゲーム画面に表示させてみよう ● チャレンジ:早く終わった人はスクリプトで文字列を変えれるようにしてみよう

Slide 19

Slide 19 text

T03. ゲーム画面にUIをつけてみよう ● Canvasに画像を配置する ○ Hierarchy -> 右クリック -> UI -> Image ○ ImageのInspector -> Source Imageに「CC0」という画像ファイルをドラッグ &ドロップ ● 好きな画像を画面に表示させてみよう ● チャレンジ:早く終わった人はスクリプトを使って時間経過やマウス動作によって画像や位置が変わるよう にしてみよう

Slide 20

Slide 20 text

T03. ゲーム画面にUIをつけてみよう ● Canvasにボタンを配置する ○ Hierarchy -> 右クリック -> UI -> Button - TextMeshPro ○ 作成されたButtonオブジェクトの子オブジェクトに Textが追加されているので、その Textを編集して ボタンに表示されている文字を変えてみる ○ ButtonオブジェクトにはImageコンポーネントがあるので先ほどの Imageと同じく画像を差し替えるこ とが出来る ● 好きな画像と文字列に変更してみよう

Slide 21

Slide 21 text

T03. ゲーム画面にUIをつけてみよう ● ボタンが押されたときの処理を追加する ○ Hierarchyにある先ほど作った Buttonオブジェクトに、ButtonCallback.csをアタッチして InspectorのButton欄にButtonオブジェクトをドラッグアンドドロップ 「Run  」 -> ゲーム画面に表示されたボタンを押してみる ● ButtonCallback.csの実装を見てみよう ● ButtonCallbackクラスに変更を加えて ボタンが押されたときの動作を変更してみよう ● チャレンジ:新しいシーンを作成して、ボタンが押されたらシーン遷移するようにしてみよう

Slide 22

Slide 22 text

T03Ex. ボタンのコールバックについて ● ボタンが押されてどんな処理をするかを指定するとき、 Unityでは2通りのやり方がある ○ InspectorからButtonコンポーネントを見ると On Click()という項目があるのでそちらを使う。 Scene中のオブジェクトを選択、そのオブジェクトにアタッチされたスクリプトの選択したメソッドを実 行させる。 ○ スクリプトからbutton.onClick.AddListener([Arg])で[Arg]に呼び出したいメソッドを指定する。

Slide 23

Slide 23 text

T04. 当たり判定を実装してみよう

Slide 24

Slide 24 text

T04. 当たり判定とは? ● 簡単に言うと、「物と物が接触した事を知る判定」のこと。 ● Unityでは主に2つのコンポーネント、「~ Collider」、「Rigidbody」を用いて当たり判定を行います。 ○ Collider : オブジェクトに物理衝突のための形状を与えるコンポーネント。 「BoxCollider」、「SphereCollider」等の数種類の形状の物が用意されています。 ○ Rigitbody : オブジェクトに物理特性を与えるコンポーネント。 基本的には物理演算で動作させたいオブジェクトに設定します。 壁や床等の動かさないオブジェクトにはアタッチする必要はありません。

Slide 25

Slide 25 text

T04. 当たり判定のコールバック ● Unityでは衝突が発生するとコールバックが実行されます。 それぞれの状況に応じたコールバックが存在するので、必要に応じて使い分けます。 ○ isTriggerにチェックが無い時 ■ 触れた時 : OnCollisionEnter ■ 触れている間: OnCollisionStay ■ 触れているのが離れた時 : OnCollisionExit ○ isTriggerチェック時 ■ 触れた時 : OnTriggerEnter ■ 触れている間: OnTriggerStay ■ 触れているのが離れた時 : OnTriggerExit

Slide 26

Slide 26 text

T04. 衝突した際に処理を行う ● Cubeにコンポーネントを設定する。 ○ Hierarchy -> Cubeを選択 ○ Inspector -> Add Commponent ■ RigidBodyとBoxColliderをアタッチ

Slide 27

Slide 27 text

T04. 衝突した際に処理を行う ● Assets/Tasks/T04/Cube.csにOnCollisionEnter実装し、 Cubeオブジェクトアタッチしてください。 ● 実行するとCubeが床に接触した際に Consoleに「 Cube:ヒットしました 」の文字が表示される ● OnCollisionEnterでは接触したオブジェクトの情報が引数の Collision型で受け取れるため、 「特定の対象にヒットした場合はこの処理をする」等のコードを書くことができる。 void OnCollisionEnter(Collision collision) { Debug.Log("Cube:ヒットしました"); }

Slide 28

Slide 28 text

T04. 見かけ上は接触しているけど、衝突させずに処理を行いたい ● Sphereにコンポーネントを設定する。 ○ Hierarchy -> Sphereを選択 ○ Inspector -> Add Commponent ■ RigidBodyとSphereColliderをアタッチ ● 衝突させたくないオブジェクトの Colliderコンポーネントの「IsTrigger」にチェックを入れる。 ● ここにチェックを入れる事で、物理演算を使った衝突が行われない状態になります。 ● このまま実行するとオブジェクトは床をすり抜けるはずです。

Slide 29

Slide 29 text

T04. 見かけ上は接触しているけど、衝突させずに処理を行いたい ● 「IsTrigger」にチェックを入れている状態で接触判定を行う。 ● Assets/Tasks/T04/Sphere.csにOnTriggerStay実装し、 Sphereオブジェクトアタッチしてください。 ● 実行するとSphereが床と接触している間、 ConsoleにSphere:「ヒットしていますが、すり抜けます。」の文字が表示される ● OnTriggerStayでも衝突したオブジェクトの情報が引数の Collision型で受け取れる void OnTriggerStay(Collider collider) { Debug.Log("Sphere:「ヒットしていますが、すり抜けます。」 "); }

Slide 30

Slide 30 text

T05. コルーチン(Coroutine)

Slide 31

Slide 31 text

T05. コルーチン(Coroutine) ● ゲーム開発において、◯秒後に処理 A、その後◯秒後に処理 Bなど 処理の完了や一定時間待って処理を行いたいことは多々あります。 ○ 演出シーケンス ○ 通信待ち..etc ● また、処理を待っている間も一部の他の処理の実行を止めたくないなど、 非同期実装もしたくなります。 ● Unityにおいて非同期実装を実現する手法の一つとして、 Coroutineがあります。 ○ https://docs.unity3d.com/ja/2019.4/ScriptReference/Coroutine.html

Slide 32

Slide 32 text

T05. コルーチン(Coroutine) ● Assets/Tasks/T05/Task_05.unityを開いて実行してみてください。 ○ 簡単なCoroutine処理のサンプル。 ○ Task_05ではクリックのたびにフェードインアニメーションが行われ、 画面が見えなくなったタイミングで Cubeを生成、 その後フェードアウトする処理。 ● フェード処理の終了を待ってから Cubeの生成が行われている ● 時間カウント表示は止まらずカウントされている

Slide 33

Slide 33 text

T05. コルーチン(Coroutine) ● 「処理を途中で一旦切り上げ」「切り上げた箇所から再開する」ことができる。 ○ 関数内部で状態を持てるため、 Updateで待機処理をするよりもシンプルに実装できる。 ● Coroutineは非常にベーシックな機能で複雑な非同期制御には向かない。 ○ Coroutine内の処理結果の値を返せないため、コールバックによる数珠つなぎな実装になりやすい。 ○ 並列で実行し両方が終了したタイミングなど、複数のコルーチンを組み合わせた制御が難しい。 ● Unity2018で.NET 4.xに対応し、C#のTask,async/await構文が使用できるようになった。 ○ async/await構文 : 非同期処理を同期処理のような記法で扱える。処理の一時停止、再開など。 ○ Task : async/awaitと組み合わせて使う。非同期で実行する処理。

Slide 34

Slide 34 text

ここまでがチュートリアル

Slide 35

Slide 35 text

これからが本編

Slide 36

Slide 36 text

● 本編に入る前に「Unityに触ってみて」どうでしたか? ● よく分からなかったなどあれば本編に入る前に気軽に聞いてください! ● また、Unityはゲームを作るために提供されている機能が説明しきれないほど豊富にあります。 興味持ってみたら公式チュートリアルを見てみるなどしてみてください! Learn game development w/ Unity | Courses & tutorials in game design, VR, AR, & Real-time 3D | Unity Learn