< Return to Video

Unity 4.3 - 2D Game Development Walkthrough

  • 0:01 - 0:04
    Unity 4.3 より新たな2D機能が追加されました。
  • 0:04 - 0:06
    我々の作成したデモを元に、
  • 0:06 - 0:08
    これらの機能を解説したいと思います。
  • 0:08 - 0:12
    この「Tower Bridge Defence」というゲームは
  • 0:12 - 0:14
    宇宙人の侵略に晒されている
  • 0:14 - 0:16
    ロンドンのタワーブリッジを描いたデモです。
  • 0:16 - 0:19
    これは、スプライトのみで構成された物理駆動のゲームで、
  • 0:19 - 0:22
    Unityにおける2Dゲーム制作の理解に役立つのではないかと思います。
  • 0:23 - 0:25
    この動画では
  • 0:25 - 0:28
    デモの背景と前景の作り方
  • 0:28 - 0:30
    キャラクター、エフェクト、カメラの追従
  • 0:30 - 0:32
    アニメーションとスクリプトについて解説します。
  • 0:32 - 0:36
    まずは、Unity 2Dの基本的な操作を説明しましょう。
  • 0:37 - 0:40
    まず、2D機能を使うにあたって
  • 0:40 - 0:42
    「Editor Behaviour Mode」を2Dにしてください。
  • 0:43 - 0:45
    新規プロジェクトウィザードのドロップダウン
  • 0:45 - 0:48
    またはメニューから
    Edit > Project Settings > Editor
  • 0:48 - 0:51
    で設定出来ます。
  • 0:53 - 0:55
    この設定により
  • 0:55 - 0:57
    インポートされたテクスチャーはデフォルトでスプライトに設定され、
  • 0:57 - 1:00
    「Scene View」のデフォルトの表示は2Dになります。
  • 1:00 - 1:02
    このモードでは2Dゲーム制作を行いやすい様に
  • 1:02 - 1:04
    ビューは並行投影になります。
  • 1:04 - 1:07
    そして、ビューの右上に表示されている3D Gizmoが非表示になり、
  • 1:07 - 1:09
    より広いスペースを使えるようになります。
  • 1:09 - 1:12
    この設定以外の点では
  • 1:12 - 1:16
    2Dのワークフローは従来の3Dゲームを作るアプローチとよく似ています。
  • 1:17 - 1:20
    なので、既にUnityを使ったことがある方なら
  • 1:20 - 1:22
    すぐに2Dゲームを作ることができると言うことです。
  • 1:23 - 1:25
    また、2Dと3Dの要素は混在できるので
  • 1:25 - 1:27
    2Dゲームに3Dの要素を加える事も
  • 1:27 - 1:32
    またその逆に3Dのゲームに2Dの要素を加えることもできます。
  • 1:33 - 1:35
    ではデモプロジェクトを元に
  • 1:35 - 1:39
    我々がどのようにステージを作成したのかを見てみましょう。
  • 1:41 - 1:43
    まず、Photoshopでステージ構成の概要を作成し
  • 1:43 - 1:45
    そこからレイアウトを決めました。
  • 1:45 - 1:47
    レイヤー毎に書き出す事で、
  • 1:47 - 1:50
    Unityのスプライトタイプとしてインポートできます
  • 1:58 - 2:01
    背景を視点に応じて移動させるため
  • 2:01 - 2:04
    いくつかの背景要素は別にして
  • 2:04 - 2:07
    Background Sorting レイヤーに配置します。
  • 2:07 - 2:10
    これはUnityの新たなもう一つの2D開発機能です。
  • 2:10 - 2:13
    このレイヤーにすべての背景を追加する事で、
  • 2:13 - 2:15
    Order In LayerというSprite Rendererのプロパティで
  • 2:15 - 2:17
    一括して描画順番を変更する事ができます。
  • 2:17 - 2:19
    配置位置が決まったなら
  • 2:19 - 2:21
    Sorting Layerの”Background”をロックする事で
  • 2:21 - 2:23
    前景の要素を追加するときに
  • 2:23 - 2:27
    間違えて背景を動かせることを予防できます。
  • 2:28 - 2:30
    右上のLayersドロップダウンで
  • 2:30 - 2:32
    この設定を指定できます。
  • 2:33 - 2:36
    背景は飾りの要素だけですので、
  • 2:36 - 2:38
    スプライト以外のコンポーネントは必要ありません。
  • 2:38 - 2:40
    背景オブジェクトの親オブジェクトには
  • 2:40 - 2:42
    視点に応じて位置を操作する
  • 2:42 - 2:46
    BackgroundParallaxという単純なスクリプトが追加してあります。
  • 2:46 - 2:49
    このスクリプトに関しての詳しい説明は
  • 2:49 - 2:51
    Scriptsフォルダにあるスクリプトのコメントを参照して下さい。
  • 2:55 - 2:59
    次は、前景の要素、キャラクターの作成です。
  • 3:00 - 3:02
    デザインはロンドンのタワーブリッジの中に
  • 3:02 - 3:03
    UFOが着陸した状況です。
  • 3:03 - 3:05
    プレイヤーはフィールド内を動き回り、
  • 3:05 - 3:07
    敵は空から登場して
  • 3:07 - 3:09
    フィールドの中を移動します。
  • 3:09 - 3:11
    そういった、キャラクターの移動のために、
  • 3:11 - 3:14
    各前景の部分にはコライダーが必要です。
  • 3:14 - 3:18
    大体のフィールドには2DのBox Colliderで良いのですが、
  • 3:18 - 3:21
    UFOの形はかなり複雑です。
  • 3:22 - 3:24
    UnityのPolygon Colliderはスプライトの形に基づき
  • 3:24 - 3:29
    自動的にコライダーを作成してくれます。
  • 3:29 - 3:32
    また、生成されたコライダーの形を手動で調整する事も可能です。
  • 3:32 - 3:34
    ポイントの移動、追加、削除で
  • 3:34 - 3:38
    コライダーの形を歩かせるのに適切な形にします。
  • 3:39 - 3:41
    前景を背景より手前に表示するために
  • 3:41 - 3:43
    Tags and Layersマネジャーに
  • 3:43 - 3:46
    "Foregrounds"ソートレイヤーを作成してあります。
  • 3:49 - 3:51
    次は、プレイヤーキャラクターを見てみましょう。
  • 3:54 - 3:56
    プレイヤーキャラクターもPhotoshopでデザインしました。
  • 3:56 - 3:59
    2Dゲームに合うように
  • 3:59 - 4:03
    Raymanの様に手足が独立したデザインです。
  • 4:04 - 4:08
    もしくは、スプライトアニメを用いた
    コマアニメーションで表現する事も可能です。
  • 4:08 - 4:13
    そのアプローチは後で背景の鳥に使用します。
  • 4:15 - 4:17
    キャラクターの手足を別々に動かしたいので
  • 4:17 - 4:20
    Unityが別のスプライトとしてインポートされる様に
  • 4:20 - 4:26
    それぞれ分割して配置します。
  • 4:27 - 4:33
    これにより、全てのスプライトを独立的に動く様に配置する事ができます。
  • 4:33 - 4:35
    新しい"Character"ソートレイヤーに配置して
  • 4:35 - 4:40
    PositionのZの値を入力して描画順を設定します。
  • 4:49 - 4:51
    プレイヤーキャラクターのスプライトは空のGameObjectの子供に設定し
  • 4:51 - 4:53
    親のオブジェクトにはコントロールスクリプト、コライダー、
  • 4:53 - 4:57
    フィジックス、その他を付加します。
  • 4:57 - 4:59
    その後、新しくなったAnimation Windowで
  • 4:59 - 5:03
    待機、移動、ジャンプ、攻撃、死亡の時の
  • 5:03 - 5:07
    各スプライトのパーツの動きを設定します。
  • 5:07 - 5:10
    Animation windowのDopesheetビューを使う事で
  • 5:10 - 5:12
    簡単に設定ができます。
  • 5:13 - 5:16
    親オブジェクトにアニメーションを追加して
  • 5:16 - 5:19
    子オブジェクトのKeyframeを作成します。
  • 5:19 - 5:21
    再生位置を動かし、キャラクターのパーツを動かして
  • 5:21 - 5:25
    自動的にKeyframeを作ってアニメーションを作る事ができます。
  • 5:27 - 5:30
    CurveとDopesheet、2つの表示を切り替える事で
  • 5:30 - 5:37
    タイミング及びデザインを調整も
  • 5:37 - 5:39
    完成したアニメーションを
  • 5:39 - 5:43
    ステートマシーンを使って切り替える事が出来ます。
  • 5:45 - 5:47
    キャラクターのAnimator Controllerは
    bipedを使用していないので
  • 5:47 - 5:51
    Apply Root Motionのチェックを解除して
  • 5:51 - 5:54
    Animate Physicsを有効にします。
  • 5:54 - 5:58
    これで、物理エンジンで正しくアニメーションされる様になります。
  • 5:58 - 6:00
    フィールド上を移動する為に
  • 6:00 - 6:02
    プレイヤーの足元にはCircle Colliderがあります。
  • 6:02 - 6:05
    また、体を囲うBox Colliderもあります。
  • 6:05 - 6:07
    これにより、段差をスムーズに乗り越える事ができ
  • 6:07 - 6:09
    ジャンプの時は頭が天井にをぶつかるようになります。
  • 6:10 - 6:13
    キャラクターのアニメーションを制御するために、
  • 6:13 - 6:16
    2Dフィジックスで動かすスクリプトを作りました。
  • 6:16 - 6:18
    フィジクスを使ってキャラクターと
  • 6:18 - 6:20
    敵を動かしてもっとダイナミックな
  • 6:20 - 6:21
    ゲームプレーが可能になります。
  • 6:21 - 6:24
    キャラクターのPlayerControlスクリプトでは
  • 6:24 - 6:26
    プレイヤーの入力をチェックします。
  • 6:26 - 6:28
    入力は物理制御を通してキャラクターを移動させ、
  • 6:28 - 6:31
    また、この入力をAnimatorに渡し
  • 6:31 - 6:33
    ステートから正しいアニメーションを選択して
  • 6:33 - 6:37
    それぞれのアニメーション間をスムーズに遷移させます。
  • 6:40 - 6:43
    アニメーションからステートを作成すると便利な点は
  • 6:43 - 6:47
    物理の速度に応じてアニメーションの速度を変化させられる事です。
  • 6:47 - 6:52
    速度に応じてアニメーションを切り替える必要はありません。
  • 7:23 - 7:25
    FixedUpdateという関数は物理更新の毎に呼び出されます。
  • 7:25 - 7:29
    この関数で水平方向の入力を取得し、
  • 7:29 - 7:33
    AnimatorのSpeedパラメータに入れます。
  • 7:36 - 7:38
    ステートマシーンの待機と移動間の遷移条件は
  • 7:38 - 7:42
    Speedパラメータが0.1以上かどうか、になります。
  • 7:42 - 7:44
    その状況になると、アニメーターは待機のステートから
  • 7:44 - 7:46
    移動のステートにブレンドします。
  • 7:52 - 7:55
    次は、プレイヤーのRigidbody2Dという2D物理要素に
  • 7:55 - 7:58
    力を加えてプレイヤーを動かします。
  • 8:00 - 8:03
    キャラクターの向いている向きを制御するのにも
  • 8:03 - 8:07
    水平方向の入力を利用します。
  • 8:08 - 8:11
    Unityでは、左キーを押すと-1が返り
  • 8:11 - 8:15
    右キーを押すと+1が返ってきます。
  • 8:15 - 8:19
    入力された値に応じて、Flip()関数で
  • 8:19 - 8:21
    キャラクターのXスケールを反転させて
  • 8:21 - 8:25
    反対側を向いている状態を表現します。
  • 8:27 - 8:29
    地面を接地しているかどうかを決めるために、
  • 8:29 - 8:32
    Groundというレーヤーを追加して
  • 8:32 - 8:35
    すべての歩ける地面に適用します。
  • 8:43 - 8:46
    そして2DのLinecastという関数を使い
  • 8:46 - 8:48
    キャラクターの足元にGroundレイヤーがあるかどうかを
  • 8:48 - 8:50
    チェックできます。
  • 8:50 - 8:53
    より簡単に変更できるようにするため、
  • 8:53 - 8:55
    接地判定用の空のGameObjectを追加しました
  • 8:57 - 8:59
    この空GameObjectにGizmoを追加する事で
  • 8:59 - 9:01
    接地判定の距離を調整できます。
  • 9:03 - 9:05
    ゲーム中は
  • 9:05 - 9:08
    キャラクターは地面に設置している状況でのみでジャンプできます。
  • 9:08 - 9:10
    プレイヤーの制御の詳細は、
  • 9:10 - 9:13
    スクリプトのコメントを確認してみてください。
  • 9:13 - 9:16
    プレイヤーの攻撃に関しては後ほどお話したいと思います。
  • 9:16 - 9:18
    次は、このデモで
  • 9:18 - 9:20
    カメラがどのような動きをするか見てみましょう。
  • 9:21 - 9:24
    2Dゲームにおいても、3Dゲームと変わらず
  • 9:24 - 9:27
    カメラの動作はとても重要です。
  • 9:28 - 9:31
    古典的2Dアクションのカメラを学ぶために
  • 9:31 - 9:36
    スーパーファミコンのスーパーマリオワールドを見てみましょう。
  • 9:37 - 9:39
    スーパーマリオワールドでは
  • 9:39 - 9:43
    カメラは横方向に追従しますが
  • 9:43 - 9:48
    画面の中心にはキャラクターに追従しない遊び幅があります。
  • 9:49 - 9:52
    この遊び幅の外側に動こうとすると
  • 9:52 - 9:54
    カメラはプレイヤーの位置に追従します。
  • 9:54 - 9:57
    高さ方向に対しては一定段階の高さを保ちますが、
  • 9:57 - 10:00
    我々のゲームに関してはその必要はありません。
  • 10:00 - 10:04
    ステージの横幅はそれほど長くなく
  • 10:04 - 10:06
    殆どが画面に収まる広さのステージです。
  • 10:07 - 10:11
    ですので、カメラの水平の動きと垂直の動きは同じ動きにします。
  • 10:19 - 10:21
    mainCameraのGameObjectに付属している
  • 10:21 - 10:23
    CameraFollowというスクリプトを見てみましょう。
  • 10:23 - 10:25
    どのような働きをするのか、コメントを確認してください。
  • 10:26 - 10:29
    色々な機能の中で最も重要なことは
  • 10:29 - 10:31
    ヒーローの宇宙人を倒す能力です。
  • 10:33 - 10:36
    ヒーローのバズーカは発砲後の反動アニメーションがあります。
  • 10:36 - 10:39
    このアクションはいくつかの部分に分かれています。
  • 10:39 - 10:42
    Fireキーの入力があると
  • 10:42 - 10:44
    ロケットを発射して、オーディオを再生して
  • 10:44 - 10:48
    アニメーションステートを再生します。
  • 10:48 - 10:50
    もっと詳しく調べてみましょう。
  • 10:50 - 10:52
    Runや他のアニメーションの再生中に
  • 10:52 - 10:54
    Shootアニメーションを再生するのため、
  • 10:54 - 10:57
    Shootingという別のレイヤーを作成しました。
  • 10:58 - 11:00
    Weightプロパティを1にすると
  • 11:00 - 11:03
    Shootingレイヤーに含まれるパーツは
  • 11:03 - 11:07
    ベースレイヤーの動きを完全に上書きします。
  • 11:20 - 11:22
    このレイヤーは、プログラムからShootトリガーを呼び出されると
  • 11:22 - 11:25
    いつでもShootアニメーションに切り替わります。
  • 11:27 - 11:31
    Gunスクリプトのこの機能を調べてみましょう。
  • 11:33 - 11:35
    ここで、アニメーターを操作して
  • 11:35 - 11:37
    ShootトリガーをTrueにします。
  • 11:37 - 11:41
    トリガーはスイッチのように
  • 11:41 - 11:43
    次のフレームにFalseに戻り、再び使用できるようになります。
  • 11:43 - 11:46
    これは攻撃のようなアクションにぴったりです。
  • 11:46 - 11:49
    アニメーションをセットし、
  • 11:49 - 11:51
    ロケットもこのスクリプトで発射します。
  • 11:51 - 11:53
    オーディオを再生して
  • 11:53 - 11:55
    プレイヤーの向いている方向に対して
  • 11:55 - 12:00
    ロケットの速度を設定します。
  • 12:01 - 12:04
    このスクリプトはヒーローの
  • 12:04 - 12:05
    Gunという空のGameObjectに付属します。
  • 12:05 - 12:08
    空のGameObjectにスクリプトを追加するのは、
  • 12:08 - 12:11
    簡単にロケットの発射位置を設定できるようにするためです。
  • 12:12 - 12:16
    バズーカの先に空のGameObjectを配置して
  • 12:16 - 12:21
    オブジェクトの位置にロケットが生成されるようにします。
  • 12:40 - 12:43
    ロケットは2DRigidbodyを持って
  • 12:43 - 12:47
    それに速度を与えて動かします。
  • 12:47 - 12:51
    スプライトの排気炎を付け
  • 12:51 - 12:53
    パーティクルシステムの煙も足します。
  • 12:55 - 12:58
    パーティクルシステムも新たなスプライト版機能が追加されました。
  • 12:58 - 13:02
    煙のコマが描かれたスプライトをマテリアルに追加する事で
  • 13:02 - 13:07
    簡単にスプライトアニメーションのパーティクルを作成できます。
  • 13:16 - 13:19
    敵またはフィールドにロケットが当たると
  • 13:19 - 13:21
    ロケットは消え
  • 13:21 - 13:23
    爆発が生成されます。
  • 13:23 - 13:26
    爆発は単純なコマアニメーションを行うスプライトです。
  • 13:28 - 13:32
    Sorting Layerで前景の最後に描画されるようにします。
  • 13:36 - 13:38
    このようなスプライトに基づいたアニメーションの追加は、
  • 13:38 - 13:40
    Project Panelからファイルを選んで
  • 13:40 - 13:43
    Sprite Modeを"Multiple"にします。
  • 13:45 - 13:47
    これでスプライトエディタを使い
  • 13:47 - 13:50
    手動、もしくは自動的に分割する事ができます。
  • 13:50 - 13:52
    ファイルをスプライトに設定する利点は、
  • 13:52 - 13:54
    この様にApplyをクリックするだけで
  • 13:54 - 13:57
    Unityはファイルの子供としてそれぞれのスプライトを生成し
  • 13:57 - 13:59
    そのスプライトをそのまま使う事が出来ます。
  • 14:00 - 14:02
    これがロケットの構造です。
  • 14:02 - 14:04
    どのようにして敵を倒すのかは、
  • 14:04 - 14:07
    後ほど敵の項目でお話したいと思います。
  • 14:07 - 14:09
    話をプレイヤーキャラクターに戻して
  • 14:09 - 14:12
    HPとダメージのことを調べましょう。
  • 14:12 - 14:14
    HPはfloatとして保存されています。
  • 14:14 - 14:18
    敵からのダメージはTakeDamage関数を呼び出して与えます。
  • 14:19 - 14:21
    プレイヤーが簡単に倒されてしまうのを避けるため、
  • 14:21 - 14:23
    前回のダメージからrepeatDamagePeriodが経過した場合のみ
  • 14:23 - 14:25
    ダメージを受けます。
  • 14:27 - 14:29
    また、敵から逃げ易くするため、
  • 14:29 - 14:31
    そしてプレイヤーのダメージを表現するため、
  • 14:31 - 14:34
    ダメージを受けたキャラクターをヒットバックさせます。
  • 14:35 - 14:41
    TakeDamage関数で一時的にプレイヤーのジャンプを止め、
  • 14:41 - 14:45
    敵からキャラクターへの方向に物理的な力を与えて動かします。
  • 14:46 - 14:51
    hurtForceの変数はInspectorで表示しているので、
  • 14:51 - 14:55
    スクリプトを編集せずにゲーム要素の調整が出来ます。
  • 14:55 - 14:57
    ダメージ表現に加えて
  • 14:57 - 15:00
    もちろんプレイヤーのHPも減らした上で
  • 15:00 - 15:02
    HPバーを更新します。
  • 15:02 - 15:07
    HPの差を表示するのためにバーの長さを縮め
  • 15:07 - 15:09
    色を緑から赤に補間します。
  • 15:10 - 15:15
    最大HPに対する現在のHPの比率を計算すれば出来ますね。
  • 15:15 - 15:18
    HPバーはシンプルなスプライト2つで構成されています。
  • 15:18 - 15:21
    バーの外周部分とバーの部分です。
  • 15:22 - 15:24
    これらもPhotoshopでデザインして
  • 15:24 - 15:26
    2つのテクスチャを書き出しました。
  • 15:26 - 15:28
    このスプライトのImport Settingsで
  • 15:28 - 15:30
    Pivotを左の中央に設定して
  • 15:30 - 15:34
    スケールを小さくした時に左側に縮んでいく様にします。
  • 15:49 - 15:51
    この2つのスプライトは
  • 15:51 - 15:53
    プレイヤーに追従するスクリプトを追加した
  • 15:53 - 15:55
    空のGameObjectの子供として配置します。
  • 15:55 - 15:59
    プレイヤーのGameObjectの位置とオフセットを足すので
  • 15:59 - 16:01
    表示位置はInspectorで調整できます。
  • 16:16 - 16:18
    プレイヤーは残りHPが0になると
  • 16:18 - 16:20
    コライダーをトリガーモードに設定されるので
  • 16:20 - 16:23
    プレイヤーはステージを突き破って落ちます。
  • 16:23 - 16:25
    その時、最前面に描画される様に
  • 16:25 - 16:30
    SpriteRendererを”UI”ソートレイヤーに移動させます。
  • 16:32 - 16:34
    プレイヤーの死亡アニメーションは、2段階で構成されます。
  • 16:34 - 16:37
    最初の”Death”は、帽子と武器を落とします。
  • 16:37 - 16:39
    2番目は”Falling”という名前です。
  • 16:39 - 16:41
    アニメータにExit Timeのコンディションを使って
  • 16:41 - 16:44
    ”Death”アニメーションが終わると
  • 16:44 - 16:47
    自動的に”Falling”に遷移します。
  • 16:51 - 16:53
    最後に、プレイヤの動きと攻撃を停止させるために
  • 16:53 - 16:57
    PlayerControlとGunのスクリプトを無効にします。
  • 16:58 - 17:01
    Die関数はPublicなので
  • 17:01 - 17:03
    どこからでも呼び出せます。
  • 17:03 - 17:05
    例えば、水に落ちた時。
  • 17:05 - 17:08
    プレイヤーが水に落ちるとゲームをリセットするために、
  • 17:08 - 17:10
    トリガーコライダーとスクリプトだけがある
  • 17:10 - 17:12
    KillTriggerという名前のGameObjectがあります。
  • 17:12 - 17:15
    Removerスクリプトには
  • 17:15 - 17:17
    川にザブンと飛び込んだ敵を消して
  • 17:17 - 17:21
    飛沫のアニメーションとサウンドを再生する役割があります。
  • 17:21 - 17:24
    しかしこのコライダーにプレイヤーが衝突すると
  • 17:24 - 17:27
    PlayerHealthスクリプトの”Die”関数呼び出して
  • 17:27 - 17:30
    プレイヤーを画面外に動かしている間カメラの追従を無効にし、
  • 17:30 - 17:35
    2秒後にステージをリセットするコルーチンを実行します。
  • 17:37 - 17:39
    さて、プレイヤーキャラクターの死について考えるのではなく、
  • 17:39 - 17:42
    彼が生き残るために何をあげればいいかを考えましょう。
  • 17:42 - 17:47
    このゲームでは2種類のプレイヤーを助けるアイテムボックスが落下してきます。
  • 17:47 - 17:50
    一つは爆弾、もう一つは救急箱です。
  • 17:50 - 17:53
    このアイテムは2つの部分で構成されています。
  • 17:53 - 17:56
    箱本体と落下傘の部分です。
  • 17:58 - 18:03
    これらの要素は空のオブジェクトでグループにして動かす事ができます。
  • 18:04 - 18:08
    落下傘の中心を親オブジェクトの中心に位置します。
  • 18:09 - 18:15
    これで箱を、落下中左右に揺れるようにできます。
  • 18:15 - 18:17
    オブジェクトが落下させる為には
  • 18:17 - 18:19
    単にRigidbodyを追加するだけです。
  • 18:19 - 18:22
    そして、箱の着地やプレイヤーの取得を検出する為に
  • 18:22 - 18:24
    コライダーも追加します。
  • 18:25 - 18:27
    箱が着陸したら
  • 18:27 - 18:31
    落下傘をしぼませるステートに遷移します。
  • 18:31 - 18:33
    他のアニメータと同じ様に
  • 18:33 - 18:35
    アニメーターはオブジェクトのステートを管理しています。
  • 18:35 - 18:37
    デフォルトではfloatDownステートですが
  • 18:37 - 18:43
    LandトリガーがTrueになると着陸のステートに切り替わります。
  • 18:44 - 18:47
    この処理はスクリプトのonTriggerEnter関数で実行しています。
  • 18:47 - 18:50
    タグで地面を見て地面かどうかを判断しています。
  • 18:50 - 18:54
    箱を親オブジェクトからデタッチし、
  • 18:54 - 18:55
    Rigidbodyを追加します。
  • 18:55 - 18:57
    それにより、地形の影響を受け
  • 18:57 - 19:01
    斜面に着陸した場合でも正しい角度で停止します。
  • 19:01 - 19:04
    さて、爆弾を見てみましょう。
  • 19:04 - 19:06
    爆弾を取得する処理は
  • 19:06 - 19:08
    箱に付属したBombPickupスクリプトで行われます。
  • 19:08 - 19:11
    爆弾を拾うと、箱を消して
  • 19:11 - 19:14
    プレイヤーに付属したLayBombsスクリプト内の
  • 19:14 - 19:17
    爆弾を持つ数を加算します。
  • 19:18 - 19:20
    LayBombsのスクリプトは
  • 19:20 - 19:23
    プレイヤーが爆弾を持っているかどうかをチェックして
  • 19:23 - 19:25
    BombのPrefabを生成します。
  • 19:27 - 19:33
    BombのPrefabはBombDetonationというcoroutineで
  • 19:33 - 19:36
    待ってExplode関数を呼び出します。
  • 19:37 - 19:40
    Explode関数は様々な動作があります。
  • 19:40 - 19:42
    まず、他の爆弾が出現できる様にするため
  • 19:42 - 19:44
    変数bombLaidをリセットします。
  • 19:44 - 19:47
    そしてアイテム管理に新しい箱が追加可能な事を通知し
  • 19:47 - 19:50
    範囲内にいる全ての敵を倒します。
  • 19:51 - 19:53
    最後の部分がどのような働きをするのか注目して下さい。
  • 19:53 - 19:55
    残りHPに関係なく全ての敵を倒すために
  • 19:55 - 19:57
    Physics.OverlapCircleAllを使って
  • 19:57 - 20:03
    全てのEnemyタグが付けられたオブジェクトを取得します。
  • 20:03 - 20:09
    foreachループで見つかった全ての敵のHPを0にして
  • 20:09 - 20:14
    爆弾から敵の方向に吹き飛ばします。
  • 20:16 - 20:19
    ループが終わったら
  • 20:19 - 20:21
    エフェクトを再生し
    爆発の効果音を再生して
  • 20:21 - 20:24
    爆弾を消去します。
  • 20:27 - 20:29
    爆発には2つの要素で構成されています。
  • 20:29 - 20:32
    主な部分は、一時的に登場して消える丸です。
  • 20:34 - 20:36
    2番目の部分はロケットの爆発のスプライトを再利用した
  • 20:36 - 20:39
    星のパーティクルです。
  • 20:42 - 20:44
    効率よくこのパーティクルを使用するために
  • 20:44 - 20:46
    常にシーンに配置しておき
  • 20:46 - 20:51
    表示させたいタイミングで表示位置に動かして再生します。
  • 20:53 - 20:55
    メモリにパーティクルを常駐させる事で効率が良くなります。
  • 20:55 - 20:57
    これは、プレイヤーは1つしか爆弾を持てない、
  • 20:57 - 21:01
    つまり爆発も1つしか表示されないので出来る事です。
  • 21:01 - 21:05
    パーティクルを常駐させておくことで
  • 21:05 - 21:13
    毎回パーティクルのインスタンスを生成して削除するよりも効率的です。
  • 21:16 - 21:19
    ですが、ロケットの爆発は一度にたくさん出る事があるので
  • 21:19 - 21:22
    毎回生成と削除する事が必要です。
  • 21:22 - 21:26
    プレイヤーが敵を倒してポイントを得る処理を見てみましょう。
  • 21:27 - 21:28
    これは2つのパーツでできています。
  • 21:28 - 21:32
    プレイヤーが100ポイントを獲得した表示と
  • 21:32 - 21:35
    画面の上に表示されているスコアーが加算されてゆくUIです。
  • 21:36 - 21:39
    得点のアニメーションは1と0のスプライトで構成されています。
  • 21:40 - 21:43
    空のオブジェクトの子として配置し
  • 21:43 - 21:47
    アニメーションが終わると簡単なスクリプトで
  • 21:47 - 21:49
    シーンから削除されます。
  • 21:49 - 21:52
    アニメーションの最後にイベントを追加し
  • 21:52 - 21:55
    スクリプトの削除関数を呼び出します。
  • 22:06 - 22:10
    ScoreUIは、カスタムフォントと
  • 22:10 - 22:12
    プレイヤーの得点を管理するスクリプト付属された
  • 22:12 - 22:14
    シンプルなGUIコンポーネントです。
  • 22:14 - 22:17
    Scoreはパブリック変数です。
  • 22:17 - 22:19
    なので敵が倒された時、
  • 22:19 - 22:21
    Enemyのスクリプトからポイントを追加する事ができます。
  • 22:21 - 22:25
    さて、今度は敵の話です。
    詳細を見てみましょう。
  • 22:25 - 22:28
    このゲームには2種類の敵が登場します。
  • 22:28 - 22:31
    緑のナメクジモンスターと
  • 22:31 - 22:34
    宇宙船に乗った宇宙人です。
  • 22:35 - 22:41
    挙動はほぼ同じなので同じスクリプトを使い回し、
  • 22:41 - 22:45
    Inspectorから移動速度とHPを調整して差を付けています。
  • 22:47 - 22:49
    各敵はそれぞれのWalkアニメーションがあります。
  • 22:49 - 22:51
    ナメクジには動く尾があり
  • 22:51 - 22:54
    宇宙船の敵は行ったり来たりします。
  • 22:56 - 22:58
    ナメクジの尾の部分は
  • 22:58 - 23:02
    スプライトインポータで独立したパーツとしてインポートしました。
  • 23:02 - 23:04
    なので、尾の部分を独立して動かす事ができ、
  • 23:04 - 23:07
    スプライト全体が伸び縮みししないようになっています。
  • 23:07 - 23:09
    Pivotを右にする事で
  • 23:09 - 23:14
    そこから尾が伸び縮みするアニメーションをつけます。
  • 23:16 - 23:20
    まぶたを上下に動かして
  • 23:20 - 23:22
    Z値でスプライトがソートされるようにし
  • 23:22 - 23:26
    目がまぶたの下に表示されるようにします。
  • 23:29 - 23:31
    次の敵はかなりシンプルです。
  • 23:31 - 23:34
    行ったり来たりを繰り返すアニメーションにします。
  • 23:36 - 23:40
    敵の動きには、Rigidbodyの速度をセットします。
  • 23:41 - 23:44
    宇宙船が障害物、例えば壁等への衝突は
  • 23:44 - 23:48
    ある点がコライダーと重なっているかどうかを
  • 23:48 - 23:51
    Physics.OverlapPoint関数を用いて検知します。
  • 23:51 - 23:54
    障害物、このステージ両端のタワーは
  • 23:54 - 23:56
    障害物としてタグが設定されています。
  • 23:56 - 23:59
    衝突を検知するとFlip関数を呼び出して
  • 23:59 - 24:04
    敵のXスケールを反対にして反対方向に向かわせます。
  • 24:04 - 24:06
    敵を倒す判定のために、
  • 24:06 - 24:11
    ロケットが敵に当たる度にHurt関数を呼び出します。
  • 24:15 - 24:19
    この関数の内部では、敵のHPを1づつ下げています。
  • 24:19 - 24:23
    FixedUpdate関数の中で敵のHPを監視しており、
  • 24:23 - 24:27
    0になっている場合はDeath関数が呼び出されます。
  • 24:31 - 24:34
    敵が死亡する時には様々な処理が実行されます。
  • 24:34 - 24:40
    まず、2Dのキャラクターの全てのスプライトを非表示にします。
  • 24:41 - 24:43
    これは、アニメーションのためにある複数のスプライトを
  • 24:43 - 24:47
    1つの死亡したキャラクターのスプライトに差し替えたいからです。
  • 24:48 - 24:52
    メインのSprite RendererにdeadEnemyのスプライトを設定します。
  • 24:54 - 24:58
    Scoreスクリプトのパブリック変数に対し
    スコアを加算します。
  • 24:58 - 25:01
    敵の死亡のビジュアルをわかりやすくするため
  • 25:01 - 25:04
    Rigidbodyにトルクを追加して回転させます。
  • 25:04 - 25:08
    背景を突き抜けて川に落下させたいので
  • 25:09 - 25:11
    すべてのコライダーを探して
  • 25:11 - 25:14
    IsTriggerパラメーターをTrueにします。
  • 25:14 - 25:17
    これで背景のコライダーを突き抜ける事になります。
  • 25:17 - 25:21
    死亡時に再生するオーディオクリップ中の1つを選び再生し
  • 25:21 - 25:25
    前述の得点表示アニメーションを再生します。
  • 25:28 - 25:30
    敵をシーンから削除するため、
  • 25:30 - 25:32
    KillTriggerオブジェクトを使います。
  • 25:32 - 25:35
    これは先ほど説明した通り、
    水しぶきをあげオブジェクトを消去する機能を持ちます。
  • 25:35 - 25:37
    プレイヤー以外のオブジェクトが触ると
  • 25:37 - 25:40
    水しぶきのエフェクトを表示して
    オブジェクトを削除します。
  • 25:40 - 25:43
    効果音は水しぶきエフェクトが表示される時に
  • 25:43 - 25:46
    付属しているAudio Clipが同時に再生されます。
  • 25:46 - 25:48
    なので、オブジェクトを生成するだけで
  • 25:48 - 25:51
    効果音も鳴るようになっています。
  • 25:55 - 25:57
    動的なオブジェクトを追加し
  • 25:57 - 26:01
    背景を飾ってステージを完成させましょう。
  • 26:02 - 26:06
    飛んでいる白鳥と
  • 26:06 - 26:07
    川岸を走るバスとタクシーを追加します。
  • 26:07 - 26:13
    まずは白鳥のスプライトシートをPhotoshopで描いて
  • 26:13 - 26:15
    InspectorのMultiple Sprite Modeを使ってインポートしました。
  • 26:16 - 26:19
    この方法では
  • 26:19 - 26:22
    Unityが全てのコマを選択し自動的にインポートして
  • 26:22 - 26:25
    アセットのヒエラルキーに追加してくれます。
  • 26:25 - 26:27
    このコマは連続したアニメーションのセットなので、
  • 26:27 - 26:29
    全てのコマをシーンにドラッグするだけで
  • 26:29 - 26:32
    Unityが自動的にアニメーションさせてくれます。
  • 26:32 - 26:35
    ね、簡単でしょ?
  • 26:35 - 26:38
    白鳥は背景に追加します。
  • 26:38 - 26:40
    速度を与えて画面中を動けるように
  • 26:40 - 26:43
    Rigidbody2Dを追加します。
  • 26:43 - 26:47
    バスとタクシーのように、白鳥もPrefabです。
  • 26:49 - 26:51
    バスとタクシーのPrefabには、
  • 26:51 - 26:54
    Sprite Importerで車体とタイヤを分割して
  • 26:54 - 26:57
    シンプルなアニメーションを生成します。
  • 26:58 - 27:02
    これらにもRigidbody2Dを追加して
  • 27:02 - 27:04
    速度の追加で画面内を動かす事ができます。
  • 27:07 - 27:10
    白鳥、バス、タクシー
  • 27:10 - 27:12
    この3種のオブジェクトの生成を
  • 27:12 - 27:14
    管理するスクリプトを作成してあります。
  • 27:14 - 27:18
    BackgroundPropsSpawnerスクリプトは
  • 27:19 - 27:22
    頻度、速度、そして最初の位置を管理しています。
  • 27:22 - 27:27
    3種のオブジェクトに同じスクリプトを使うことができます。
  • 27:27 - 27:29
    生成するPrefabとプロパティを変更します。
  • 27:31 - 27:36
    詳細は、スクリプトのコメントをご覧ください。
  • 27:36 - 27:40
    最後に、動いている雲、川の流れ、そして霧を追加しました。
  • 27:41 - 27:45
    親オブジェクトに2つのスプライトを持たせ、
  • 27:45 - 27:48
    ゆっくりと横に動かします。
  • 27:50 - 27:55
    アニメーションはループで動き続けます。
  • 27:59 - 28:02
    以上が、私たちがどのようにしてこのゲームを作ったか、の全てです。
  • 28:02 - 28:05
    このビデオが2Dゲームの作り方の参考になれば嬉しく思います。
  • 28:06 - 28:08
    将来的には、より基本的なプロジェクトと
  • 28:08 - 28:09
    チュートリアルをお届けしたいと考えています。
  • 28:09 - 28:13
    私達は、Unity4.3についての感想と
  • 28:13 - 28:15
    あなたの作る素晴らしい2Dゲームが本当に楽しみです。
  • 28:15 - 28:16
    それでは、ご清聴ありがとうございました!
Title:
Unity 4.3 - 2D Game Development Walkthrough
Description:

more » « less
Video Language:
English
Duration:
28:22

Japanese subtitles

Revisions