【ゲーム作るマン】Unity公式2D縦シューを改造してみた(+覚え書き)
お疲れ様です。
先日作成した2D縦シューを更に修正しました。
Unity縦シュー改良版 v2.1
・操作表示の不具合対応(矢印記号が表示されてなかった)
・ゲームオーバー時に敵全滅させて、正常に初期化
・ボスHPゲージ実装
・難易度を下げたhttps://t.co/VtvAT7xsdi— もやし@sgmusic (@sgm_mysh) 2017年8月7日
ついでに公式チュートリアルから弄った部分と、そのうち実装に手間取った部分をまとめておきます。
主に自分があとで確認する用。
元のゲームプロジェクトはここから。
公式で素材配ってるのありがたい。
https://unity3d.com/jp/learn/tutorials/projects/2d-shooting-game-jp
操作方法の表示
UIを左下に追加しただけ
ゲームスタート時、タイトル非表示処理と一緒に消してやる
方向キーは英語でArrowKeysですって
オートショットをボタンショットに変更
while(true)
{
ショット処理
n秒待つ
}
というショット処理部分を
while(true)
{
if(GetButton”~~”){ショット処理}
n秒待つ
}
に変えた。
最初はWhileの条件をGetButton~にしようとしたが、ショット出来なくなった。
今気づいたが、大本の関数自体がループするものじゃないと、falseで通過した後に再びショット処理に返ってこないって話なのだと思う。
今回割り当てた”Fire1″とか、GetButton系はキーコンフィグを作ればユーザー側で好きに変更出来るらしい。
ゲームスタート時に1stWaveに初期化
Emitter側にWaveInitialize処理追加
currentWaveを0にするだけ
Manager側でゲームスタート処理時にWaveInitializeを呼び出す形
ゲームオーバー時に敵消去(wave初期化のため)
enemyタグが付いているオブジェクトを配列enemies[]として呼び出し
waveのChildCount iが0になるまでenemies[i]を削除
最初はwaveの子要素拾ってくればいいかと思ったが、作成されたオブジェクトを拾ってくる方法がタグ以外で見つからなかった。
waveは全て名前が違うし、別の関数内で生成されているのでどうやって拾ってくるかなー・・・と思ってタグから拾う方法にしたのだけど、waveを格納するオブジェクトを関数の外で宣言すればいい話なのでは。
で、定義は関数内で書くと。
今気づいて、試したらいけた。何を悩んでたのか。
参照:http://l-s-d.sakura.ne.jp/2016/04/destroy_specify_child_objects/
難易度調整
弾生成オブジェクトを減らした。
俺がクリア出来ない。
自機破壊アニメーション後にタイトル呼び出し(出来ず)
そもそもの仕組みがPlayerからGameOver処理を呼び出し、同時に自オブジェクトを頃してるので、自機破壊アニメーション中(=自機オブジェクト破壊後)にはIEnumeratorが停止してしまう。
(親オブジェクトの非アクティブ化による停止、というらしい。この場合自オブジェクトな訳だけど)
実装するならタイトル移行処理かプレイヤー消滅処理かを完全に組み替える必要がありそう。
もしくは自機を透過→爆発エフェクト→タイトル呼び出し→自オブジェクト破壊、という処理に変えるか。
ボスゲージの実装
プレイヤー側でボリュームとか弄る用のSliderを流用、元はiTunesのポリュームバーみたいだったが、色変えで結構それっぽくなった。
Handlerを削除、SliderのInteractableをオフでプレイヤーからは動かせない。
参照:http://qiita.com/2dgames_jp/items/31435fcef08dcd04c499
ボス出現時以外非表示にしたかったが、元々非アクティブなオブジェクトは動かせないらしい(ここで原因が分からずクソ悩んだ)
アクティブでセット、ゲームスタート時に非アクティブ化、ボス生成時にアクティブ化、ボス破壊時に非アクティブ化(ゲームオーバー時にも効く)で解決
この辺の処理は全部Manager内で進めた。
参照:http://marunouchi-tech.i-studio.co.jp/2290/
汎用的に使える仕組みにしたかったので、Sliderの上限は1のまま、Hp/MaxHpで残HP割合をSlider.Valueに当てたかったが、何故か攻撃を1発当てるとゲージが0に。
色んな所でデバックログ吐かせて、どうやらHp/MaxHp算出の時に小数点切られてるっぽいことが判明。
1回float型の変数に入れてもダメ。
調べるとintの計算をfloatとして吐き出すには
(float)1.0 * Hp / MaxHp
のようにしなければいけないらしい。(float)を抜くとdoubleになる。
~~ = (float) Hp / MaxHp
とか
~~ = Hp / (float) MaxHp
でもいいっぽい。
で、実装完了。
floatに気付くまでに1回折れてSliderのMaxValueを手付けで設定しようとしてた。
量産する時に設定項目が増えるのでこういう処理は避けたい。(量産する気は無いけど)
完走した感想ですが(n番煎じ)
・思ったより大変でした(小並感)
・エラー原因が分からなかったら変数をデバッグログで吐かせろ
・エラーログが出てる時はちゃんと読みましょう(うっかりクリアやめて)
こういうソフト使ってると英単語の勉強にもなりますね・・・。
エラーで何言われてるのか分かんねえんだもん・・・。
floatの辺りとかは普通に知っとかないとやべえレベルな気がするので、今回で分かってラッキー。
次は何作りましょうかねえ。
本日のBGM
Night Walker/the band apart
KIDSのPV無いかなーと探して発見。
何故カラオケ風なんだ・・・。
ディスカッション
コメント一覧
まだ、コメントがありません