Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ブロックバスター制作資料

1,217 views

Published on

デジゲー博2015で公開したブロックバスターの資料です。

Published in: Software
  • Be the first to comment

  • Be the first to like this

ブロックバスター制作資料

  1. 1. By Max Neet Games
  2. 2.  技術面では適当で汚い実装が多いので、 参考にすべきかは微妙な感じです。 (なら何故公開する!?)  このスライドの内容は過去作やブログで 解説した事はあまり載せていませんので、 良ければそちらも参照ください。  Farm Fury! 技術資料  幽霊の棲む家技術資料
  3. 3.  Max Neet Gamesについて  ゲーム紹介  開発環境  技術解説  使用アセット一覧
  4. 4.  Max Neet Games  (訳: Hatarakitakunai-De-Gozaruuuu!!)  活動概要  まったりとゲーム作ってます。きっと、多分、恐らく  作ったゲームの資料も公開していく予定  ホームページ  http://maxneet.web.fc2.com/  メンバー  大熊猫 : プログラム、エゴサーチ、惰眠担当  まる : アート、雑用担当
  5. 5.  プラットフォーム:Windows  プレイ人数 : 2~4人  ジャンル: 対戦アクション  想定プレイ時間: 1試合35~125秒  コントローラー必須
  6. 6.  ゲームエンジン  Unity5  ファイル管理  Dropbox上にsvnのリポジトリ作成し、Dropbox のフォルダを共有
  7. 7.  コントローラー必須と割り切ったので、基本はXBOXコント ローラー基準  基準にしているだけで他でも動きます  下記の物を改良しました  http://deciduousgames.blogspot.jp/2013/05/xbox-controller-input- wrapper-for-unity.html  改良点は主にXNAに近づける感じです(改悪の可能性有り)  コントローラーの各ボタンのenumを定義し、ゲームの入力 状態を保持する構造体(GamepadState)に各状態を保持する  Dictionary<GamePad.Button, bool> で各ボタン(スティックの向 きを含む)  各スティックの状態も保持
  8. 8.  前のスライドを元に、入力管理クラスを作成  コントローラー4つを基準とし、各GamePadStateの 現在のフレームと、前のフレームの状態を保持する  毎フレーム更新します  上記の状態を元に入力確認を行っております。  押されているか、このフレームに押されたか、離されたか  入力管理を別に作成したのはスティック方向も入力し たフレームだけを確認したかったり、実装してません がリピート入力も出来る様にしたかったからです。  ついでにリプレイでも使える様にしたかったからです。
  9. 9.  キャラに各キーのアサインを設定するコ ンポーネントをアタッチしてます  コントローラーのインデックスも設定  中で入力可能なボタンの種類も定義して います。
  10. 10. public enumType { Kick, Grab, Special, } publicGamePad.Index Controller = GamePad.Index.One; publicGamePad.Axis Move = GamePad.Axis.LeftStick; publicGamePad.Button KickButton = GamePad.Button.A; publicGamePad.Button GrabButton = GamePad.Button.B; publicGamePad.Button SpecialButton = GamePad.Button.Y;
  11. 11. If ( InputManager.Instance.IsPressed( InputSettings.Controller, InputSettings.KickButton ) ) { // …処理 }
  12. 12.  やる事としては、前のスライドで紹介した 入力設定(InputSetting)に入る値を設定する
  13. 13.  確認方法はコントローラーに入力が有るかを確認  有った場合は同じボタンが使われているか確認  使われていた場合、今設定しているボタンにアサ インされているボタンと交換する  無かったらそのまま設定  キーコンフィグを抜けたらセーブしています。  セーブには通常のPlayerPrefを使用  ゲーム開始時にセーブデータの設定を読み込んでます
  14. 14.  基本的にUnityのBoxCollider2Dと Rigid Body2Dを使っています。  キャラには自身と子オブジェクトにコライ ダーを付けてます。  自身はブロックや他のキャラ等の当たり、 子オブジェクトにはステージの壁だけに対 する当たりを付けています。  壁の当たりを別にしているのはキャラの当 たりだと、体の上の方で移動が停止してし まうからです。  子オブジェクトは別のレイヤー設定にし、 プロジェクト設定で当たりの確認を壁以外 とはしない様にしています。
  15. 15.  ブロックが他のブロックとぶつかった時に、 爆発するかの確認を行っています。  処理としては、そのブロックの周りに接触し ているブロックがあるか確認。  同じ確認処理を接触しているブロックにし、 それを繰り返す。  接触したブロックをリストに保存し、それが 一定数(3個)を超えた場合、それらを爆発 させます。
  16. 16.  接触ブロックの確認には Physics2D.OverlapAreaAll()を使用。  ブロックを専用のレイヤー設定にし、他 のオブジェクトは確認しない様にしてま す。  その中で同じ種類のブロックのみ接触リ ストに追加
  17. 17. public void SearchCollidingBlocks(Block currentBolck, BlockType chainBlockType, ref List<GameObject> chainList) { Vector3 adjustments = newVector3(0.1f, 0.1f, 0.0f); BoxCollider2D collider = currentBolck.GetComponent<BoxCollider2D>(); Collider2D[] colliders = Physics2D.OverlapAreaAll(collider.bounds.min - adjustments, collider.bounds.max + adjustments, m_layer); if (colliders == null || colliders.Length <= 0) { // 周りにブロックが無い return; }
  18. 18. List<Block> toAdd = new List<Block>(); int count = colliders.Length; for (int i = 0; i < count; ++i) { Block block = colliders[i].GetComponent<Block>(); if (block == null || chainList.Contains(block.gameObject) || toAdd.Contains(block) ) { continue; } if ( block.Type != chainBlockType ) { // 連鎖出来ない continue; } toAdd.Add(block); chainList.Add(block.gameObject); }
  19. 19.  接触リストを追加した後は確認処理を再 帰的に繰り返す int count = toAdd.Count; for (int i = 0; i < count; ++i) { SearchCollidingBlocks(toAdd[i], chainBlockType, ref chainList); } }
  20. 20.  検索が終わったら実際に爆発させます (検索処理呼び出し元) public void CheckChain() { List<GameObject> chainList = new List<GameObject>(); chainList.Add(gameObject); SearchCollidingBlocks(this, Type, ref chainList); m_chainCount = chainList.Count; if (IsChain(m_chainCount)) { for (int i = 0; i < chainList.Count; ++i) { chainList[i].GetComponent<Block>().StartExplode(); } chainList.Clear(); } }
  21. 21.  主に展示用に実装しました  デジゲー博では不具合が出て使えませんでしたが・・・  なので、最適化とかはまったく考えてない作り  保存している情報  毎フレーム入力状態を保存  ブロックの生成時に位置情報を保存  試合設定と人数(キャラを含め)を保存  ファイルがそこそこ大きくなるので、保存は別にスレッドを作って 行っています。  書き込みはC#のSystem.IO周りの物を使って実装  再生時の処理  キャラと試合設定を記録から指定  入力確認処理の戻り値を記録した物に変更する  ブロック生成時の位置指定を記録した物に変更する
  22. 22.  入力処理の上書き private void UpdateCurrentState(int index) { if (Utility.IsPlayBack) { // リプレイ時 m_currentPadState[index] = BattleRecorder.Instance.GetPadState(index); } else { m_currentPadState[index] = GamePad.GetState((GamePad.Index)index + 1); } }
  23. 23.  uGui + UniRxで実装  UniRxは試しに使ってみただけだったりしま す・・・  キャラにReactiveProperty<float>を保持さ せ、ゲージからSubscribe()を呼んでゲージ 更新処理を登録しています。  ゲージにキャラの番号情報が有るので、そ れを元に登録  これでキャラの情報が変わったらゲージ更 新処理が呼ばれます。  ゲージの表示にはスライダーを使用して います  上記で追加したゲージ更新処理で Slider.Valueを設定しています  Valueは0~1なので、現在の値/最大値の答 えを割り当てています
  24. 24.  基本スクリプトでごり押し!  移動はiTweenで実装、色は自前  色の変更をする方法が分からなかったので、 自作のTween処理で行いました  毎回書くのは面倒なので、基本は似たパ ターンを使うようにし、ある程度パラ メーター弄って調整出来る様に実装
  25. 25.  位置やスケールは自動で反映されますが、色 は子オブジェクトに反映されない為、画像と 不一致になります。  解決策としては、アニメーションするオブ ジェクトに描画する子オブジェクトへの参照 を持たせ、それらもアニメーションさせる  ImageやTextはUnityEngine.UI.Graphic継承し ているので、Graphicを探し、保持します
  26. 26. protectedTweener<Color> m_colourTweener; protected UnityEngine.UI.Graphic[] m_childUIElements; private void FindAllChildUI() { m_childUIElements = GetComponentsInChildren<UnityEngine.UI.Graphic>(); } void Update() { if (m_colourTweener.IsActive) { m_colourTweener.Update(Time.deltaTime); UpdateColour(); } } protected override void UpdateChildColour() { int length = m_childUIElements.Length; for (int i = 0; i < length; ++i) { m_childUIElements[i].color = m_colourTweener.CurrentValue; } }
  27. 27.  スクリプト  iTween  UniRx - Reactive Extensions for Unity  エフェクト:  Cartoon FX Pack  Cartoon FX Pack2  BGM:  Game Music Pack – SUITE  Tadashii Kamen noTsukaikata OST  ボイス:  ActionVoice Pack - NamiVol.1  ActionVoice Pack - NadeshicoVol.1

×