素人がUnityでブロック崩し作ってみた - ⑨
進捗やいかに・・・
こんにちは。siroです。
前回、ゲームシステムがクソじゃね!?と記事を書いてやってみたんですが、いまだにまだクソなままです。笑
※前回の記事は下記
ルールの追加
まずは、ルールを追加するために必要な作業?を洗い出してみました。
- ゲーム開始時ルールを表示し、ゲーム画面でも確認できるようにする
- ブロックが当たった数、壊した数を保存してゲーム画面に表示する
- 1と2の数を常に監視し、クリア判定をする処理を追加
大まかに言うとここまでの作業が一旦必要。
なので、ルールをテキトーに二つ作り、一旦実現しようとやってみたんですが・・・
Unityデフォルトのフォントがださすぎる
まず、ゲーム開始時にルールをだすのでそのUIをつくってたんですが・・・
Unityのフォント1つしかなくて、ださかったのでフリーフォントを適用しました。
適用後の画面はこんな感じ。背景黒が良いのかよくわからないけど一旦こんな感じ。
※ここで以外にも結構時間かかった・・・
ゲーム中もルールをわかるようにして、実際に当たった数・壊した数もわかるように
ゲーム中に、「あれ?ルールなんだっけ?」とならないように、ちっちゃいウィンドウでルールがわかるようにしました。
実際のスコアもわかるようにしておき、ユーザーにはこれを見てもらい
あと何回当てなきゃ!とか、あと2つブロック壊さなきゃ!!
とか思ってもらう想定です。
昨日はここまでしかすすみませんでした。
UIって作り出すと結構時間かかるのよね・・・笑
- ブロックが当たった数、壊した数が左のスコア枠として更新される処理追加
- ルールとスコアが一致した後に、クリアとなる音?などを表示
さて、始めます。
と、ここまで記事書いて始めたんですが、何とか形になりました。笑
完成版動画
ステージ固定かつ、ボールが反射する角度が必ず45度なのがあれだけど、
なんかかなりゲームっぽくなってきた。
そろそろゲームアップしようかなーと思ってWebGLに変換してみたんだけど、
なぜかビルドできず。笑
こんな感じにめちゃ怒られました。
うーん、なんだろ?
インストール時に色々チェック外して入れたからかな?WebGLにかかわる部分のチェック忘れた可能性もあるなー笑
とりあえず、明日以降に少し調べてみようと思います。
では、そんなところでーノシ
素人がUnityでブロック崩し作ってみた - ⑧
ゲームシステムがくそじゃね?
こんにちは、siroです。
前回までで、一応タイトルからゲーム画面に行って、ゲーム画面からゲームオーバかつ、ゲームオーバからのリトライができるようになりました。
音とかも追加して少しだけゲームらしさが見えてきた・・・と思っていたんだけど、、、ゲーム自体がクソじゃね!!!!?という結論に至ったので、
少し追加要素加えてみようと思います。
※前回までの進捗は以下に書いてます
ブロック崩し + @を考えてみた
そもそもブロック崩しの要素ってなんだろう?
「下のバーを操作してボールを跳ね返してブロックを壊していくゲーム」
のはず。
これに追加要素を加えてみようと思います。
ルールを加えてみよう
ゲームとして成り立つためには、何か特定のルール?のような制限があり、
それを上手くかいくぐってクリアしたりした時に達成感などがあるはず。
縛りプレイとかまさにそうだよね。
これをブロック崩しに当てはめてみようと思う。
「ゲーム開始時にブロックに当てる回数や、壊すブロックの数などを表示して、
指定のルールでブロックにボールを当てるゲーム」
にしてみるのはどうだろう?
ブロックに5回当てろ!
赤ブロックに4回当てろ!
緑ブロックに2回当てろ!
※色指定ありにするかは要検討
ブロックを壊すことが目的ではなく、当てる回数を上手くコントロールするゲーム
って感じですな。
そうなると、ブロックがなくなる回数はすべて1にしても良いかもなぁ。
それと、スタートするタイミングはユーザ任意で開始できるようにしないときつい気がする。開始ボタン?みたいなものを用意してもらう感じかなー。
毎回ブロックの位置が同じだとつまらないので、ブロックの位置や数などは毎回ランダム(もしくは固定のステージ10個からランダム?など)にして、お題(指定された当たる回数)のクリアごとに下のバーが短くなっていくとかいいかも。
ボールのスピードは今まで通りブロックに当たる事に上がっていく仕様にすれば、プレイ中もハラハラして、お題クリアごとに難しくなっていくからいいかもしれない。
クリアごとにペナルティを どう設定するかはゲームを少し作り上げてみてから最終決定しようと思うけど大方こんな感じで作ってみようと思います。
さーて、やったったんぞー
素人がUnityでブロック崩し作ってみた_-_⑦
ゲーム内容以外はよいかんじになってきたな。笑
ひとつ前の記事で、ここまでやるぜ!と意気込んでみたけど、また何とかたどり着けた。
小規模な目標でやっていくとモチベ維持できていい感じ。
※前回の記事はこちら
今日の目標
今日掲げた目標はこちら
- ゲームオーバー後のリトライ、タイトルに戻るボタン&遷移追加
- ゲーム画面中の一時停止、タイトルに戻るボタンの追加
- タイトルからゲーム画面遷移後の暗くなる件の解決
- なんか音出してゲーム感をだしたい
何とか形になりました。
完成形がこちら。
①ゲームオーバ後のリトライ、タイトルに戻るボタン&画面遷移実装
これはタイトル画面からゲーム画面に遷移するのと同じ仕組みを利用したので、すぐ解決。
復習だけど、シーン遷移はこれで可能。
SceneManager.LoadScene("GameScene");
※「GameScene」がシーン名
オブジェクトをクリックしたときの判定にはRaycastを利用する
※ここらへんでRayについてはまとめられています
②ゲーム画面中の一時停止、タイトルに戻るボタンの追加
以下参考に、実装
UIのPanelとButtonを配置し、Clickイベントにオブジェクトを表示/非表示にする処理を記述
gameObject.SetActive (false);
※falseが非表示でtrueが表示
gameObjectはpublicにしてUnity側から指定するか、Find("オブジェクト名")とかでとってきて変数化しておけばよいです。
③タイトルからゲーム画面遷移後の暗くなる件の解決
シーン移動を行った時に暗くなって欲しく無いシーンを開いて、Window>Lighting>Settingsをまず開く。
そのあと、Settings画面で、下の方にある「Auto Generate」のチェックを外し、横の「Generate Lighting」をクリックする。
クリック後にロードがあるため、それを待ってシーンを保存すればOKとのこと。
やってみたら、Unityで見えている状態とゲーム実行時の状態が同じに!!!!!
※以下参考にしてます。白うさぎのIT学習帳さんありがとうございます
④なんか音出してゲーム感をだしたい
UIコンポーネントのAudio Sourceを使っています。
配置して、音をオブジェクトにドラッグアンドドロップでひもづけるだけで、ゲーム中に流れる音楽は簡単に流せる。シーン起動時に音を出すかどうかの設定を
「Play On Awake」でチェックぼっくして設定できるからここいじるだけ。
当たった瞬間にまたは、ボタン押したときに音を出すソースはこんな感じ
//public変数で効果音をUnityから設定
public AudioClip audioClip1;
// 当たったときの処理内に以下を追記
audioSource.PlayOneShot(audioClip1);
フリー音楽で有名な、魔王さんからいくつか拝借
※Unityで音を鳴らす場合には以下参考にしてやりました
http://qiita.com/amano-kiyoyuki/items/43fa92cce1a44a8030b5
今日も何とか形になってよかった。
あとはブロック崩し自体のゲームシステムに少し手を加えて、
もう少しゲームっぽくしたら一旦完了かなー
出来上がり次第でどう思うかだけど。笑
一旦今日はここまでー
また明日以降やりますーノシ
素人がUnityでブロック崩し作ってみた - ⑥
作ったアプリをもう一度見てみたら
こんにちわ、siroです。
前回なんやかんやで3時間ぐらい格闘して、一応動くようにはなったと思う
寝て起きて朝もう一度見てみたら
そして寝て起きてもう一回動画みてみたんだけど、、、
なんかメイン画面からゲーム画面に遷移したところから少し暗くなっている?し、
ゲームオーバーになったらそこからリトライとかタイトル戻る手段ないし、ゲーム始まったらゲームオーバーになるまでやめられないし、、、
なんというか、エガちゃん駅停車の電車の片道切符状態ですな。
ということで
再び追加要素を加えて、ゲームらしさに近づけていきたいと思う
さて、追加要素列挙しまーす
- ゲームオーバー後のリトライ、タイトルに戻るボタン&遷移追加
- ゲーム画面中の一時停止、タイトルに戻るボタンの追加
- タイトルからゲーム画面遷移後の暗くなる件の解決
- なんか音出してゲーム感をだしたい
一旦ここまでやってみようと思います。
では、始めますーノシ
素人がUnityでブロック崩し作ってみた - ⑤
色々妥協しているけどなんとかできた
3時間ほど前に、ブロック崩しに追加要素加えるよ!と目標立ててやってみたけど
なんとか形になった。笑
ひとつ前の記事で追加要素としてあげたもの
追加要素は以下の通り
- ブロックの色によって当たったときに消える回数を変える
- 段々とボールが早くなる
- とにもかくにもスコア表示
- ゲームオーバー画面ぐらい作ろう
- ついでにスタート画面も用意してみる?
出来上がったアプリがこちら
以下で作ったときの詳細説明していくよ。
1.ブロックの当たった回数制御追加
これに関しては、オブジェクトにEnemyLifeを追加した。
いわゆる、ライフですね。体力。
で、そのEnemyLifeがボールに当たるたびに減って、0になったときだけオブジェクト消そうね。
とソースを書き換えた。
こんな感じ。
画面
ソースコード
public class TitleEnemyBlockScript : MonoBehaviour {
public int enemyLife; //消滅するまでの回数
void OnCollisionEnter(Collision obj)
{
if (obj.gameObject.name == "Ball")
{
// 衝突時にブロックのライフを減らす
enemyLife--;
if (enemyLife == 0)
{
GameObject.Destroy(this.gameObject);
}
}
}
}
2. ブロックに当たるたびにボールの速度をランダムに早くする
これに関しては、あたり判定のイベントOnCollisionEnter内で、Speedを変更するソース書いただけ
speed = speed + Random.Range(0.1f,0.5f);
3. スコア表示
3D オブジェクトの3D Textを追加して、値を表示する処理をソースに書いた。
■ボールがブロックに当たったとき
- 当たったブロックのライフを表示
- ボールのスピードを表示
■ブロックが消えたとき
- トータルスコアを表示
といった具合に書いてます。
トータルスコアには、Unity標準で備わっているセーブ機能のPlayerPrefsというものを使ってみた。
PlayerPrefs.SetInt("intTotalScore", 0); // intTotalScoreに0を入れる
int x = PlayerPrefs.GetInt("intTotalScore", 0); // intTotalScoreの値をxに格納
こんな感じで、GetとSetで使えるからセーブにはみんな最初これを使うはず。
4. ゲームオーバ画面を作ろう
これは、Sceneを別の名前で保存して、ゲーム画面に表示したいようにオブジェクトを変えてみた。笑
息抜きに笑いに走り、気づいたらエガちゃんが背景にいた。一瞬の出来事で少し戸惑ったけど、勝手に使ってすんません。そのうち変えます。
5.スタート画面用意してみた
これも別の名前でSceneを保存して中身を変えて作ってみた。
オブジェクトを触ったときに、処理を行う部分が少し厄介で、
マウスクリック時にRaycastと言われるもの(見えない)を飛ばして、当たったオブジェクトの名前がStartBtnだったら画面遷移
といったプログラムを書いた。
以下を参考にした