スウィンぐるん開発裏話(5)

スウィンぐるんはWindows専用で作っているため、特に最適化や高速化のテクニックは使っていません。最近のPCは速くて助かります。

もちろんUnity的に一般的に推奨されない記述は出来るだけ避けています。
代表的なものとしては

  • Update内でGetComponent系を使用しない
  • Update内でFind系を使用しない
  • Update内で文字列操作を行わない
  • 使用しないMonoBehaviourのコールバック(UpdateやLateUpdate)は宣言しない
  • 空文字列チェックはstring.IsNullOrEmptyを使用する
  • IDやHashでアクセス出来るものはそれを使用する(マテリアルやAnimator)

でしょうか。

まぁこれらは高速化というよりは低速化を防ぐ意味合いの方が強く、高速化はもっと実装アルゴリズム寄りの話(代表的なところではオブジェクトプール等)だと思います。あと高速化はちゃんとプロファイルしてから検討することが大事です。

とりあえずUnityのランタイムで処理が遅いものとメモリ操作(暗黙に行われるものにも注意)だけ気をつければ、少なくともWindowsプラットフォームならそれほどパフォーマンスに影響はないと思います。

高速化に興味がある方はUnite 2016のこの資料を読んでみるといいと思います。

モバイル端末向けのUnityアプリケーションの最適化実践テクニック
ハードウェア性能を引き出して60fpsを実現するプログラミング・テクニック

(続く)

よく使うVisual Studioのショートカット

その昔、UnityVS のおかげでUnityとVisual Studioの連携が格段に良くなり、コード編集もデバッグも快適になりました。Debug出力は重かったけど…

現在はVisual Studio Tools for Unityが提供され、Unity 5.2 からWindows環境においてはVisual Studioが標準エディタになりましが、どうにもVisual Studioは出来ることが多くて使い切れない感があります。

おそらく便利な機能は沢山あるんでしょうが、私がコード編集時によく使っているショートカットはこれぐらいです。
※キーボードのマッピングは Visual C# 2005 です

コメントアウト Ctrl + E, C
コメントアウトの解除 Ctrl + E, U
VS内ファイルの切り替え Ctrl + Tab
Intellisenseの呼び出し Ctrl + Space
戻る(カーソル位置) Ctrl + -(マイナス)
次に進む(カーソル位置) Ctrl + Shift + –
全ての参照を検索 Ctrl + K, R
選択した関数の定義へと飛ぶ F12
名前の変更 F2

この中でも頻繁に使うのはカーソルの戻る・進むと全ての参照の検索です。
コードを行ったり来たりすることが多いので…

ショートカットとは違いますが、コードスニペットを使えばコード入力が楽になります。よく使う定型コードがあるなら独自のコードスニペットとして追加することも出来ます。
例えば私はenumeqcp[TAB][TAB]で以下のようなIEqualityComparerのひな形を作るスニペットを追加しています。まぁ滅多に使わないんですけどw


public enum MyEnum
{
}

private class MyEnumCompare : IEqualityComparer
{
  public bool Equals(MyEnum x, MyEnum y)
  {
    return x == y;
  }

  public int GetHashCode(MyEnum obj)
  {
    return (int)obj;
  }
}

ちなみにコード編集以外にもUnite 2016でVisual StudioをImage EditorやModel Editor、Shader Designerとして使う方法が紹介されました。積極的に使うかどうかは別ですが、とりあえずVisual Studioでこんなことも出来ると覚えておいて損はないと思います。
Visual Studio 2015 & Graphics Design Tool

スウィンぐるん開発裏話(4)

またまた方針の補足の続き。

  • デバッグに時間のかかるゲーム内容は避ける

これはなかなか難しい問題で、デバッグやバランス調整はどうしても時間がかかります。
そしてこれらの時間をかけないようにするには、例えばゲーム内容をシンプルにしたり規模を小さくする必要がありますが、これはデメリットとして内容が薄くなり飽きやすいゲームになる可能性もあります。
また、期間を優先することで本当に作りたいモノが作れるのかという問題もあります。が、逆に作りたいモノを追い続けて完成しないケースもあります。まぁこの辺は作る人次第ですし、それも含めて作品だと思います。

その辺の折り合いをつけながら決まったのが現在のスウィンぐるんになります。
「ゲームルールがシンプル」「ステージの量産が可能(ステージ毎の調整が不要)」、ストレートに言ってしまえば、1面が完成すればゲーム部分はほぼ実装完了になる内容です。

ただ開発が進んでいくとどうしても追加したくなる機能がいくつも出てきますが、今回はじっと我慢していずれ続編を作ることがあるなら入れようという気持ちで完成させました。
それでも明らかに入れないと困る機能は追加しました。例えばアーケードモードのコンティニューが追加されたのはコミケ前日の8/13だったりします。最初は総ステージ数が少なかったのでコンティニューはなくてもいいかなと思っていたんです…

ステージの作成はゲーム内にステージエディタを実装し、協力者の方々に作ってもらいました。
実際のステージエディタはこんな感じです。
160829_ステージエディタ

これで方針については終わりです。
さて、次は何を書こうかな…

(続く)

スウィンぐるん開発裏話(3)

方針の補足の続き。

  • Asset Storeを活用する

積極的に使います!そのための Asset Store!
特に一人で作っている時は強い味方になってくれます!

スウィンぐるんでは

  • Console Pro
  • QHierarchy
  • SRDebugger
  • TextMesh Pro
  • UIWidgets
  • Vectrosity
  • Sci-Fi Arsenal
  • Universal Sound FX
  • SOUND ATELIER

を使っています。
※プロジェクト内にはこれ以外のAssetも入っていたりはするんですが、入れただけで使っていないものも結構あります。

Console Pro・QHierarchy・SRDebuggerは大体どのプロジェクトでも使ってます。
どれも有名Assetだと思うので、改めて説明する必要はありませんね。
SRDebuggerは最新のUNIBOOK6でも紹介されているので、気になった方はそちらを読んで見るのもいいと思います。
UNIBOOK 6 情報【C90 – 3日目西f-21a】 – 日本Androidの会 Unity部

TextMesh Proは当初使うつもりはなかったんですが、開発途中からメニューやメッセージが増え、メッセージごとにテクスチャを作るのが面倒になったので導入しました。
導入後はかなり省力化になりましたし、扱いも簡単なので今後他のプロジェクトでも積極的に使いたいAssetの一つになりました。
導入に際して↓のサイトを参考にさせてもらいました。
UnityのText Mesh Proアセットで日本語を使うときの手順 – Qiita

UIWidgetsはサクッとUIを準備したいときに使っています。開発中のUIで使っているのでスウィンぐるんのゲーム本編ではほとんど出てきません。

Vectrosityは周囲のリングロープを描画しています。
試作版のように部屋の中だったら壁でターンすればよかったんですが、今のような謎空間だと接触するものがないので急遽リングロープ的なものを配置しました。

160828_ロープ

Line RendererやCylinderを細長くして描画しても良かったんですが、ロープでバウンドする処理の都合、スクリプトから簡単に制御・描画できるVectrosityを使いました。

ちなみにバウンド時のロープの描画は、ロープを常に A、X、Bの3点でつなぐように描画し、ルン子が接触していない場合は X=Aとして、ルン子が接触した場合は接触点をXとして描画することでロープを曲げています。
160828_バウンド

Sci-Fi Arsenalはゲーム中のたつまき・シールドのエフェクトとして使っています。
パーティクルは自分で作り始めると時間泥棒になりやすいので、Asset Storeで雰囲気が合うのが見つかると非常に助かります。

Universal Sound FX・SOUND ATELIERは毎度助けられている曲&効果音集です。
DustShootersやPanzerStrikeの効果音にも使わせてもらってます。

ただ、どうしてもイメージと合う音が見つからない場合は自分で作っています。例えば宝石を開いたときの音はグロッケンシュピールをC5→C7と駆け上がっている音だったりします。
※ピアノロールはC7→C9になってますが、実際の音はC5→C7です。

160828_効果音

なお効果音もパーティクル同様に自分で作り始めると時間泥棒になるので要注意だと思いますが、合うものを探す時間もかなりかかるので難しいところです。

最後に使用を断念したAssetとしてEasy Save 2があります。
一部のテスト環境でMoodkieSecurity.dllがノートンで隔離されるケースが発生したためです。

データの保存だけなら特に難しいこともないので、スウィンぐるんではデータをJson+暗号化し、.NETのSystem.IO.File.WriteAllLinesで保存してますが、マルチプラットフォーム運用を考えるなら Easy Save 2 のようなマルチプラットフォームの保存に対応した Asset に任せるのが楽だと思います。
実際、スウィンぐるんの Windows Store アプリ版も検討していますが、セキュリティやランタイムが WinRT と変更になる都合、修正作業が発生してしまいます。

(続く)

スウィンぐるん開発裏話(2)

方針の補足を。

  • Unityを使う

ここ数年はUnityばっかり使っているのでUnityでFAかと。Asset Storeの援護もありますし。
付け加えるなら、今回のように短期間で完成させる場合は、Unityと自分自身の出来る範囲で作りきるのが重要だと思います。

  • リソースはDustShootersのモノを出来るだけ使う

新しいデータを準備+チェックする時間もあまりないので、出来るだけDustShootersのリソースを使います。元々DustShootersのゲーム内ゲームとしての実装も考えていたので、リソースは共通化した方が便利というのもあります。

ただ、実際は開発中にどんどん差し替わり、最終的にほとんどが新規データとなりましたw

 

データの種類 想定 実際
プレイヤー 既存 新規
背景 既存 新規
ステージ部品 新規 新規
エフェクト 新規 新規
既存 既存
UI部品 新規 新規
BGM 既存 新規
効果音 既存+新規 既存+新規

その結果、画面はこのような変貌を遂げました。

160827_画面なお、見た目は大幅に変わってますが、ロジックは試作版で作ったものをほぼそのまま使っています。

(続く)

スウィンぐるん開発裏話(1)

コミケには何か出したい、でもDustShootersは間に合わないということで、急遽作り始めたのが「スウィンぐるん」になります。DustShootersの作業を中断して本格的に作り始めたのが7/24からだったので、3週間でマスターアップというちょっと厳しいスケジュールでした。

コミケまでに間に合わせるための方針として

  • Unityを使う
  • リソースはDustShootersのモノを出来るだけ使う
  • Asset Storeを活用する
  • デバッグに時間のかかるゲーム内容は避ける

を立て、9つぐらいのゲーム案を検討し、最終的に今のスウィンぐるんのゲームルールに落ち着きました。

ちなみに試作段階ではこんな画面でした
まんまアレっぽいですねw
old_CluClu

(続く)

UnityでXboxOneコントローラを使う…前に

UnityでXboxOneのコントローラを使おうと思ったら、Xbox360のコントローラとアサインが違っているのか…
とりあえず以下のような割当てだったのでメモとして書いておきます。

※2016/06/24 スティック押し込みのアサインと軸の増減方向を追加
※2018/07/08 RTとLTの情報を修正

http://support.xbox.com/ja-JP/xbox-one/accessories/xbox-one-wireless-controller の画像を使わせてもらってます
XboxOneController

1 左スティック(X) X axis (左: -1 右: +1)
1 左スティック(Y) Y axis (上: -1 下: +1)
1 左スティック押し込み joystick button 8
2 LB joystick button 4
2 LT 3rd axis (Off: 0 On: +1)
3 ビューボタン joystick button 6
4 USB充電端子
5 Xboxボタン
6 メニューボタン joystick button 7
7 RB joystick button 5
7 RT 3rd axis (Off: 0 On: -1)
8 方向パッド(X) 7th axis (左: -1 右: +1)
8 方向パッド(Y) 8th axis (上: +1 下: -1)
9 拡張端子
10 右スティック(X) 4th axis (左: -1 右: +1)
10 右スティック(Y) 5th axis (上: -1 下: +1)
10 右スティック押し込み joystick button 9
11 3.5mm端子
A Aボタン joystick button 0
B Bボタン joystick button 1
X Xボタン joystick button 2
Y Yボタン joystick button 3

あ、軸の反転は好き好きでー
スティックと方向パッドの上下の向きが違うので注意!

PanzerStrikeの照準について(1)

ちょっとわかりにくいと思われる戦車の照準についての補足になります。

ヘルプ等には以下のように書いてますが、これだけだと「?」って方もいると思います。

help_shoot

今回はこの緑色の円についての説明になります。
(目標の測距については次に書きます)

この緑色の円は戦車の砲身から100mと400m先の場所にあります。
着弾予測位置のような便利なものではなく、あくまで砲身の延長上になります。

上の図を実際のゲーム画面で見るとこんな風です。160520_照準

この時100mと400mの円がズレて表示されますが、これはカメラ位置によるものです。

カメラは常に戦車後方ちょっと上の位置を維持しています。
Unity EditorのSceneで確認するとこのあたりを維持します。160520_カメラ位置(通常)

上から見下ろした結果、手前の100mの円より奥の400mの円の方が上にズレて見えることになります。

参考までにカメラを砲身と同じ位置まで下げてみます。160520_カメラ位置(後方)

すると当然2つの円はズレることなく表示されます。160520_照準(後方)

でも、この視点で遊ぶのはちょっと難しいですね…

まとめると

  • 緑色の円はあくまで砲身から100m・400m先の場所でしかありません
  • 円がズレて見えるのはカメラが戦車の上にあるためです

ということになります。

PanzerStrikeで使っているアセット(4)

作業に使っているノートPCのSSDが突然死…orz
とりあえず予備機で作業する日々…

主に省力化に貢献してくれたアセットになります。

Easy Saveは簡単にゲームデータの保存が出来ます。
セーブ自体は .NET のクラスを使えばなんとでもなるんですが(特にPCプラットフォームなら制限緩いですし)、せっかく買ったアセットなので使った感じです。
とはいえ暗号化やDictionary<>の保存にも対応しているので、平文で保存したくない場合やサクッと保存部分を作るなら便利に使えます。

iTweenやNGUIは今更説明の必要はありませんね。
もっとも今はTween系はDOTWeenやGoTween、UIはuGUIを使ってます。

GUI Generatorはメニューの背景などを簡単に作れるアセットです。
わざわざグラフィックソフトで作るほどでもなく、かといって背景なしとか単色はちょっとなーという時にサクッと作れて便利です。

SpriteStudio 5 Player for UnityはGitHubのではなくAsset Storeの方にあるものです。
初期のモノなのでインポートは煩雑で性能もあまり…
それでも自分でssaxパースして読み込み&表示部分を作る作業は省略できるのでありがたいです。
今ならGitHubのSS5PlayerForUnityを使うかなー、きっと。

これで PanzerStrikeで使っているアセットの紹介は最後になります。

PanzerStrikeで使っているアセット(3)

演出をより良くするために使ったアセットです。

ArcReactorはある敵の攻撃エフェクトで使ってます。
モデルやパーティクル、ポイントライト使いまくりで派手な見た目になります。

LightShaftsは光の筋みたいなアレを再現してくれます。
描画負荷は上がりますが、かなりいい感じになります。
ゲームで使っている箇所はガレージです。

160501_PS_LightShafts

ちなみにLightShaftsはAsset Storeのアセットではありません(すっかり忘れていた…)が、Asset Storeにも同じ機能をもったアセットはあります。

アセットの紹介は次で最後になります~