第13回Unity開発技術勉強会 週末プログラミングで作るカジュアルゲーム 〜シューティング編〜/Unity 4 の最適化とか
http://atnd.org/events/36077
週末プログラミングで作るカジュアルゲーム 〜シューティング編〜 - 饒平名(のひな)さん
- 2つ制作。それぞれ開発期間は2週間程度。
- デザイナーから素材データが上がってくるまで待ち時間が発生したのでその時間を利用して制作を開始
1つ目の作品「Shooting Star Shooter」
iTunes App Store
https://itunes.apple.com/jp/app/shooting-star-shooter/id584324918?mt=8
- 画面に現れるキューブをタップして行くゲーム
- タップとフリックで2種類の弾が使える
- 制限時間内に撃ち落とした数を競う
手抜きポイント
演出も手を抜く
オブジェクトの演出は基本的に以下の2つ
- Trail Renderer
- Glow image effect
- MainColorをテキトーにいじる
- TrailはUnityデフォルトのものよりも unity tool studio の Curve Triail($50)を利用した方が綺麗になる
- デフォルトのものだと移動速度が速い場合にカクつく
Curve Trail by unity tool studio -- Unity Asset Store
http://u3d.as/content/unity-tool-studio/curve-trail/2Ta
- 爆発のエフェクトの個人的な定番は Unity Technologies の Detonator Explosion Framework
Detonator Explosion Framework by Unity Technologies -- Unity Asset Store
http://u3d.as/content/unity-technologies/detonator-explosion-framework/1qK
- 爆発の表現はだいたいこれを使ってればOK
- 色を変更するなと多少の修正をして利用
GUIは全てフォント
- gau+さんのOver Driveというフォントを使用
gau+のフリーフォント「Over Drive」|FREEフォントケンサク
http://cute-freefont.flop.jp/overdrive.html
- フレーム等のアトラスはNGUIにデフォルトで入っている SciFi Atlas を利用
エレメントの移動の仕方
基本パターンはこちら
- 動かない
- 直線的
- Sin曲線で揺れながら
- ターゲットに近づく
- ターゲットから離れる
- ターゲットの周りを周回
これらのパターンに移動速度や回転速度のパラメータを付随&パターンの組み合わせて作成
弾の挙動
- プレイヤーがタップした位置に有るエレメントをターゲットとする
- フリックかタップかで弾の種類を出し分け
タップ時の当たり判定
- まず考えられる方法
Vector2 tapPosition = Input.GetTouch(0).position; Ray ray = Camera.mainCamera.ScreenPointToRay(topPoistion); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { return hit.collider.gameObject;
- この方法では厳密にチェックされてしまうので1ピクセルでもズレるとタップ失敗になる
- 近くのモノをタップする場合は良いが遠くの場合は失敗しやすい
別のアイディア:ある程度誤差も認めて判定
foreach(GameObject target in GameObject.FindGameObjectWithTag("Element")) { Vector2 screenPoisiton = Camera.mainCamera.WorldToScreenPoint(target.transform.position); if (tapPosition - screenPosition).magnitude <= 50f) { return target; }
- この方法だと処理が重いので前の方法をやってタップ失敗と判定された時のみこちらの処理を実行
どの弾を放つか
- タップかフリックかの判定
if (Input.GetTouch(0).phase == TouchPhase.Begin) { type = BULLET_TYPE.TAP; } else if (Input.GetTouch(0).phase == TouchPhase.Moved) { type = BULLET_TYPE.FLICK; }
入力フェーズがBegin(触り始め)かMoved(移動中)かで処理を分ける
もう一つの作品「Bonsai Shooting」
iTunes App Store
https://itunes.apple.com/us/app/bonsai-shooting/id590215722?mt=8
- 盆栽をひっぱたいて枝の伸びる方向を決めるゲーム
- ゲームのルール
- ゲームを始めると植物が成長を始める
- タップしたら枝はさらに成長する
- ゲーム終了時点での植物の成長度合いがゲームのスコアに
手抜きポイント
- こちらの作品でもテクスチャは描かない
- モデルデータは全て自動生成
- 背景に流れているテクスチャは先ほどの作品で利用したものを再利用
- MADFINGER さんが提供している ShadowGun のサンプルレベルに同封されている "MADFINGER/Environment/Scroll 2 Layers Multiplicative - Skybox" というシェーダを Skybox のマテリアルに利用
- GUIもすべてフォント
- 和風にしたかったので衡山毛筆(こうざんもうひつ)フォントと行書体フォントがロイヤリティフリーだったのでそれらを利用
- 植物の葉・花弁はパーティクル
タップ後の演出も手を抜く
- こちらも Detonator Explosion Framework を利用
- 色とパラメータのみ調整し利用
植物生成アルゴリズム
基本的には L-System を簡易的に利用
- 「L-system(エルシステム、Lindenmayer system)は形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズムである。」
L-system - Wikipedia
http://ja.wikipedia.org/wiki/L-system
- 自動生成系のアルゴリズムでは定番
具体的な作り方
- モデルデータはTrailで表現する
- メッシュデータの無いゲームオブジェクトに Trail を貼り付け、オブジェクトを移動させることで幹や枝を表現
- この方法ではメッシュを Trail Renderer 側で自動生成してくれるので楽
- 前日のアルゴリズム&Prefabのパラメータ(下記のもの)を変更することで指定
- 最大の枝分かれ回数
- 伸びる方向の傾向(どれだけ天を目指すか)
- 成長速度
- 枝分かれする確率
- 成長度合いの減衰率
…など
Unity 4 の最適化とか - ユニティテクノロジーズジャパン 高橋さん
※筆者注:高橋さんの講演はそろそろUnityのバージョン4.1が出そうなので予定を変更して「Unity 4.1 新機能 大紹介」という内容の講演でした。
- 4.xからは開発のスケジュールに変更がされ、2〜3ヶ月毎に4.xのxの部分が増分していく予定
Memory Porfile
いままでのプロファイルだとこれくらいの粒度でしか情報が取れませんでした。
「Take Sample」ボタンを押すとその瞬間のメモリ情報が記録される。この処理は重い処理で有るためその瞬間の情報を取る事しか出来ない(今までのプロファイルの様に常に最新の情報を表示するという表示方法は無い)。
- (※これは4.0からの機能)WebPlayerのデバッグ版への切り替え。右クリックで Development にチェックを付けた状態にする。MonoDevelopからアタッチしてデバックも可能
UnloadUnuserdAssets
Mecanim Replay
- Mecanimのアニメーションをリプレーする
- StartRecording/StopRecordingで録画、再生。
- playbackTimeで再生位置を移動
Custom Shader Inspector
transform.hasChanged
- transform に変更が加えられたかを返す
Substance on mobile platforms
- 今まではモバイル向けビルドの場合にはビルド時に生成されていたが、デスクトップと同様に実行時に生成可能に
QA
Q : 今回行わなかった「Unity 4.0の最適化」についての話は他の勉強会で聴けたりしますか?
A : 4月に開催される Unite で講演する予定
Q : Unity 4.1 はいつ頃出ますか?
A : 明確な日付は言えないがもう近いうちに出る予定
Q : Mecanim Replayのデモでは逆再生を行っていたが再生速度をマイナスで指定する様な事が可能?
A : 先程のデモはシークを使って再生位置を徐々に前に戻しながら再生していた