強火で進め

このブログではプログラム関連の記事を中心に書いてます。

「第13回Unity開発技術勉強会」に参加して来ました

第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種類の弾が使える
  • 制限時間内に撃ち落とした数を競う
手抜きポイント
  • 一切モデリングしない
  • テクスチャも描かない
  • ペイントソフトのフィルタ機能を使う
  • 今回はGimpを使用
  • 下塗り用のフィルタで適当に塗り潰す
  • シェーダは Self-Illumin/Diffuse を使用
演出も手を抜く

オブジェクトの演出は基本的に以下の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 を利用
  • 色とパラメータのみ調整し利用
BGMは雅楽
  • 古典音楽は基本的に著作権フリー
  • メインのBGMは「越天楽(えてんらく)」という曲を利用
  • SE音源なども著作権フリーの音源を利用
植物生成アルゴリズム

基本的には L-System を簡易的に利用

  • 「L-system(エルシステム、Lindenmayer system)は形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズムである。」

L-system - Wikipedia
http://ja.wikipedia.org/wiki/L-system

具体的な作り方
  • モデルデータはTrailで表現する
    • メッシュデータの無いゲームオブジェクトに Trail を貼り付け、オブジェクトを移動させることで幹や枝を表現
    • この方法ではメッシュを Trail Renderer 側で自動生成してくれるので楽
  • 前日のアルゴリズム&Prefabのパラメータ(下記のもの)を変更することで指定
    • 最大の枝分かれ回数
    • 伸びる方向の傾向(どれだけ天を目指すか)
    • 成長速度
    • 枝分かれする確率
    • 成長度合いの減衰率

…など

QA

Q : モバイルで Image effect は重くは無かったですか?
A : 今回ターゲットにした iPhone 4S/iPhone 5/iPad mini では処理落ちせずに動作した

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
  • Assetヒープ側のGC。レベルをロードする時には自動的に呼ばれる
  • 今までは保守的なGC(Boehm GC)。重い、メモリが解放されない
  • 全面的にGCを刷新。 GC.Collect は使わなくなった
  • Angry Botsで3倍
  • 大規模なプロジェクトでは4倍、5倍高速になった事例も
  • 動作時の負荷も改善されたので今まで音が途切れていたなんて事も改善
AirPlayに対応
  • iPhone/iPadからのケーブル経由の外部出力も可能
  • Wii Uのプロトタイプ作成にも使えるかも?
Mecanim Replay
  • Mecanimのアニメーションをリプレーする
  • StartRecording/StopRecordingで録画、再生。
  • playbackTimeで再生位置を移動
Custom Shader Inspector
  • Shader 内に Custom Editor "(適用するスクリプトのファイル名)" という記述で指定
  • Shader だとfloat値を渡したい時に X/Z/Y/W の値として渡す必要が有り、直感的で無かった
  • その様な値をスクリプトで変換し、スライダーで値を設定可能にする事が可能に→デザイナーにも扱いやすくなる
Console Filter
  • Info/Warning/Error の表示/非表示を個別にON/OFF可能


transform.hasChanged
  • transform に変更が加えられたかを返す
Substance on mobile platforms
  • 今まではモバイル向けビルドの場合にはビルド時に生成されていたが、デスクトップと同様に実行時に生成可能に
QA

Q : 今回行わなかった「Unity 4.0の最適化」についての話は他の勉強会で聴けたりしますか?
A : 4月に開催される Unite で講演する予定


Q : Unity 4.1 はいつ頃出ますか?
A : 明確な日付は言えないがもう近いうちに出る予定


Q : Mecanim Replayのデモでは逆再生を行っていたが再生速度をマイナスで指定する様な事が可能?
A : 先程のデモはシークを使って再生位置を徐々に前に戻しながら再生していた