conf t

インフラエンジニアのメモ

Unityのシューティングゲーム チュートリアルをやって見た

インフラエンジニアだけどスマホゲームを自作してみたいと思ったので、(?)
ゴールデンウィークも暇だしUnityのシューティングゲームチュートリアルをやってみた。

Unity - Tutorial - 2D Shooting Game

で、まずはスマホじゃなくブラウザ用にビルドしました。
出来たのかこちらです!
ShootingGame
f:id:monaski:20150502191803p:plain

Chrom 42 の方はブラウザにchrome://flags/#enable-npapiと入力し、NPAPIを有効にしないとUnityWebPlayerが起動しません。
(私の環境だと上記をやってもエラーで起動できなかったので素直にIEでやるほうがいいかも。てかバランス調整なしのクソゲーなので別にやらなくても。。。)
「Google Chrome 42」でNPAPIが無効化。Unity Web Player/Silverlight/Lyncなどに影響 - 窓の杜

製作期間

・休日2日
・平日夜2日ぐらい

で2.5日くらいでしょうか。

UnityのGUI操作方法や概念はまだまだ勉強不足といった感じですが、
たった2日ちょっとでとりあえず動くものが出来ました。Unityすごい!

今回最新のUnity5で作成したんですが、チュートリアルがちょっと前に作成されたものだったので、 いくつか条件が変わっていました。

それを簡単に書いていきます。

第一回

スプライト / スプライトアニメーションの作成
sliceしてもProjectViewに分割された画像が表示されない時がある。
applyもしてるのに...。

apply=プレハブの更新=プレハブからシーンに出したゲームオブジェクトへの設定変更を、
元のプレハブにも反映すること。

具体的にはシーン中のゲームオブジェクトを選択し、inspectorのapplyを押す。
f:id:monaski:20150502114246p:plain

と思ってたら原因判明

再生マークみたいなのをクリックすると
f:id:monaski:20150429185003p:plain

この通り
f:id:monaski:20150429184728p:plain

この手の感覚的なUIは大体の人は気づくように出来てるとは思うんだけど、気づけないと悲惨だ。
「こんなのわかるでしょ」みたいな感じで説明書に書いてくれていないから。

↓実際載ってはいない
Unity - マニュアル: スプライトエディター

第二回

プレイヤーの移動

rigidbody2D.velocityはもう使えないらしく、以下の通りGetComponent()を利用する必要がある。

// 移動する向きとスピードを代入する
        GetComponent<Rigidbody2D>().velocity = direction * speed;

http://answers.unity3d.com/questions/927523/unity-standard-assets-is-recieveing-error.html

第四回

敵を作成しよう
動いたけど、敵のスピードがやけに速い
speedの値を0.01とか極端に小さくしてもスピードが変わらない・・・。
スクリプトのどこかに数値埋め込んでしまってるのか?
とか考えていたが、実際にはGravityScaleが1のままだった。
GameObjectとかPrefabの作成が多くなってきて、基本であるGravityScaleを0にするを忘れていた模様。

第十回

AnimationでAddCurveはなくなってるので、AddPropertyを選択する。 colorの追加ですが、文字をクリックするのではなく、右端のプラスマークをクリックする。 (私の環境では見切れており、スクロールしないと見えませんでした。
クリックしても追加されない!?と数分悩んでました)
f:id:monaski:20150502122358p:plain

AnimationEvent has no function name specified

というエラーが出ました。

Animationにて矢印の個所を削除すれば消えました。
f:id:monaski:20150502111358p:plain

開発メモ 「エラー処理」 - シヴァのブログ

次のエラーがこれ

NullReferenceException: Object reference not set to an instance of an object
Manager.IsPlaying () (at Assets/Scripts/Manager.cs:41)
Emitter+<Start>c__Iterator0.MoveNext () (at Assets/Scripts/Emitter.cs:27)

Manager.csでタイトルオブジェクトが取得されないうちに Emitter.csがManagerのタイトルオブジェクトを参照していえるため、見つからない となっているらしい。

エラーが出ていてもゲームは再生できるが、Waveの敵が出てこない状態。

ExecuteOrderで順番を決めると解決した。

f:id:monaski:20150502113545p:plain

f:id:monaski:20150502113058p:plain

エラーは全部解決したが、なぜか自機が常に赤い。Animatorに問題がある模様
f:id:monaski:20150502114638p:plain

まだよくわかってないけど、ゲームオブジェクトごとにstateの設定があるのか?
Enemyに作成したDummyがPlayerプレハブにはなかったので、Dummyを作成したところ常時赤状態は解消した。
f:id:monaski:20150502120415p:plain

ということで以上です。
一応ハイスコア等は記録していますが自分のしか記録しないので、
次はハイスコア記録用のサーバとか作ってみたいですね。