素人が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だったら画面遷移
といったプログラムを書いた。
以下を参考にした
素人がUnityでブロック崩し作ってみた - ④
ここからどうしよう
さて、前回までで一応ブロック崩しっぽいところまでいきました
ただ、単純に当たったら消えるだけでスコアもでないし、ボールが下に行ったらボール消えるだけで何もできない状態とか何なの状態なので、続きを作ることにしました。
※以下が前回まで
追加要素の案
追加要素を考えてみた。一旦箇条書きで書いてみる。
- ブロックの色によって当たったときに消える回数を変える
- 段々とボールが早くなる
- とにもかくにもスコア表示
- ゲームオーバー画面ぐらい作ろう
- ついでにスタート画面も用意してみる?
こんなところですかね。
思いついた順で書いてみました。
一応ここまでやれば、それなりにゲームっぽくなるような気がします。
今日は一旦1と2ぐらいまでできればいいなーという緩い感じでやってみたいと思います。
3hぐらいでどこまでいけるかなー笑
記事更新もしたいからどこまでいけるかだなー
次回の記事にこうご期待!笑
ではではノシ
素人がUnityでブロック崩し作ってみた - ③
一応できた
あれからまた少し触ったり調べたところ衝撃の事実が判明。
ひとつ前の記事で、三角関数入れたりして大変だった。説いた内容を書いたんだけど、
そもそもUnityの基本機能で跳ねたり、跳ね返ったりが可能でした。笑
Rigidbodyを設定して、Physic Materialで以下のように設定
・Dynamic Friction = 0 ※ 移動しているときにかかる摩擦(動摩擦)
・Static Friction = 0 ※ 静止しているときにかかる摩擦(静止摩擦)
・Bounciness = 1 ※ 弾力
・Friction CombineをMinimumに。※ 摩擦のを組合方法 = 2つのオブジェクトの係数の小さい方を選択
・Bounce CombineをMaximumに。 ※ バウンドの組合方法 = 2つのオブジェクトの係数の大きい方を選択
これで、抵抗や摩擦が限りなく低い状態でバウンドする設定に可能。
ただし、これでも速度はだんだん落ちてくるので、速度を維持するためのソースのみ、
BallのScriptにかく。
※以下はべた書きした場合のソースコードです
Vector3 V = transform.GetComponent<Rigidbody>().velocity; // 速度を取得.
if (V.x < 0.0f)
{
V.x = -1 * speed;
}
else{
V.x = speed;
}
if (V.y < 0.0f)
{
V.y = -1 * speed;
}
else{
V.y = speed;
}
こうすることで、跳ね返るようになります。
あとは、ステージをかこっている下のオブジェクトにボールが当たった場合のみボールを消すスクリプトを書きます。
if (obj.gameObject.name == "BottomWall")
{
GameObject.Destroy(this.gameObject);
}
そんなこんなでこうなりました
ちょっと無理やりガーっと作った感じがあるので、
追加要素加えるときに少しソース直したりしてみたいとおもいます。
ブロックに当たるとバーがみじかくなったり、ボールが早くなったり、色によって壊れる回数が異なるようにブロックを変えてみたり。
素材そのものを変えてみたりとかいろいろいじくってみようと思います。
ではではノシ
素人がUnityでブロック崩し作ってみた - ②
とりあえずステージっぽいの作ってみた
とにもかくにもオブジェクト配置が先かなーと思い、オブジェクトをばこすこ置いて、
色付けたりして作ってみた。
四角はCube、まるはSpereをGameObjectからCreate選択して配置。
なんとなくいい感じ。まだ何も動いてないけど。笑
必要な機能を考えてみた
ブロック崩しに必要な機能ってなんだろう?と思ったので考えてみた
- スライドバーがキーボードの矢印キーで移動する
- スライドバーに当たったらボールが反射する
- ブロックにボールが当たったらブロックが消える
大まかに分けて上の三つだと思う。
1 スライドバーがキーボードの矢印キーで移動する
1に関しては、矢印キーの操作が以下で取得、移動できた。
// 横移動の値を格納
float inputMoveNum = Input.GetAxis("Horizontal");
// 矢印キーの移動量に応じて横移動
transform.Translate(inputMoveNum * 0.02f, 0, 0);
2 スライドバーに当たったらボールが反射する
これね、ちょっと一筋縄でいかない。笑
ボールが指定した角度でちゃんと移動する仕組みを構築して、
どんな時にどのぐらいの角度で反射するか決める仕組みも用意する必要あり。
ボールの角度は、みんなだいすき三角関数を使って考える必要があるようで。
※三角関数とかおぼえてないよーww
以下を参考に、作ってみた
結果的には以下ソースで動いた。
int r = 2; //斜辺の長さ
int angle = 120;// 角度
float x = r * Mathf.Cos(Mathf.Deg2Rad * angle); //移動量X
float y = r * Mathf.Sin(Mathf.Deg2Rad * angle); //移動量Y
// x軸、y軸に対して移動する処理
transform.Translate(x * 0.01f, y * 0.01f, 0);
画面はこんな感じ
三角関数思い出すために久しぶりにノート触った。笑
とりあえず動いたのでいったん良しとします。
明日以降は、スライドバーの動きに合わせて角度を指定して動かす
といったところをやろうと思います。
ではではノシ