ぼくの息抜き

ぼくの息抜き

気ままな二人が記事を書くことで息抜きしていくブログ

CSS MenuMaker

unityゲームプログラミング 雨を降らすゲームを作るPart13 -まずは完成させる-

f:id:bokunoikinuki:20180621201305p:plain

前回の記事で少しゲーム作成の進捗が遅くなった理由を考えた。

面白いってなんだろうという今の自分にとっては高度すぎる思考のためにRainGameを作る手が止まっていた。

RainGameを作って新しく学んだことは当初の想定よりも多い。

面白いゲームを作るのはもう少しスキルを手に入れてからにしようと思うので、まずはこのRainGameをゲームとして遊べるレベルにして完成させる。

完成させよう!

まずは何からやるか

前回ちょっとだけ洗い出した完成までにやることはこんな感じ。

  • 放置復帰を滑らかに
  • 音楽
  • 転生時の得られるポイント表示
  • アップグレード要素追加
    ⇨とりあえず10個作る
  • ゲームバランス調整
    ⇨リセットによりもらえるポイント
    ⇨RPのインフレ
    ⇨アップグレードの必要ポイントインフレ
  • アップグレードのデザイン
    ⇨ポイント確定いらない?
    ⇨ポイントリセット動画入れる?
     ⇨今回はやめる?

優先度つけようかと思ったが、今はやる気があるので、目についたものから作っていくとしよう。

転生時の得られるポイント表示できるように

転生でのポイントは整数にしたい。がrainPontに応じて得られる数を調整したい。

例えば10000RP / 1000 = 10転生ポイント。これは割り切れるがいいが、9990RPの時はfloat型にしないといけなくなる。

テキストとしての表示はToStringで四捨五入させることはできる。

ToStringで整数化させられるのか?
まぁ、できないstringに変えるって言ってるしな笑。

float型に計算結果突っ込んで

int 得られるアップグレードポイント = (int)float 計算結果;

とやるのでよかった。この場合小数点以下全て切り捨ての計算だった。

 アップグレードの項目追加

Particle System(PS)を変えるだけでゲームの要素を手軽にたくさん増やせる。なんといい機能なのだろうか。

今は二つある。

  • main.startSize
  • main.lifetime

main.gravityModifierをいじろうとしたらMinMaxCurveというものでstartSizeやlifetimeとは違い少しややこしかった。

f:id:bokunoikinuki:20180706195515p:plain

gravityModifierは上記画像のrandom Between Two constantsを使っていた。このMax値をスクリプトから変えるには

main.gravityModifier.constantMax

に数字を入れればいい。MinはMaxをMinに変えればいいだけだ。

と思ってやって見たらできなかった。Debug.Logで数値で見られたからそのまま突っ込めると思ったが、無理だった。

main.gravityModifier.constantMaxを変えたかったら

main.gravityModifier = new Particle.System.MinMaxCurve (float Min, float Max);

とやらないといけなかった。

参考記事:MinMaxCurve - Unity スクリプトリファレンス

 

あとはCollisionを変えようか。

追加で

  • collision.bounce
  • collision.lifetimeLoss

をアップグレードできるように追加した。

f:id:bokunoikinuki:20180706195435p:plain

なんだかやっつけ仕事な感じがするが、一旦これで満足ということにしておこう。

あとはポイントリセットボタンで全てのポイントを戻せるようにしよう。

アップグレードのボタンを使えるように

今、

  • ポイント確定
  • ポイントリセット

がハリボテとなってしまっている。ポイント確定はゲームスタートと同じにしてポイントリセットだけ使えるようにするでもいいが、デザインのバランス的に一つにしたくないので、左にも機能をつけた。

f:id:bokunoikinuki:20180706200704p:plain

アップグレードキャンセルは確定前のポイントを戻す。書いてて思ったが、それって今回降ったアップグレードの数を把握してないといけないのか。

アップグレードのPrefabごとにNoがあるから、その番号をリストに入れてってやればいいけど、追加だけならまだしも、減らした時にも…

いやPrefabごとに何回数値をあげたかという変数を持たせていた。

その分減らすpublic関数を入れて全てのPrefab分回せばいいのか。

できそうだな。

アップグレードのボタンを使えるように -UpgradeCancel-

まずは確定されていないアップグレードキャンセルをキャンセルするものを作る。

foreach (transform child in gameObject.transform) {処理}

foreachすげー。これで処理を書けば一気に一階層下のchildを順々に読み込んでくれる。

今のスクリプト以外の親の子達をいじりたいときは普通にgameObjectをそのいじりたい親に書き換えればいい。

今回だと子オブジェクトに紐づいているスクリプトの関数を呼び出したいので、このように書けばいい。

GameObject hoge = GameObject.Find ("Hoge");

foreach (transform child in hoge.transform) {
	FugaManager manager = child.GetComponent<FugaManager> ();
	manager.Fuga();
}

これで"Hoge"の子オブジェクトそれぞれFuga()関数を呼び出すことができる。

素晴らしい。

GetComponentでそれぞれ取得すればなんでも呼び出せる。if でnullだったらスキップすれば、多種多様のオブジェクトが混ざっていてもなんとかなる。

すごいなー。これがサクッと使えるようになった自分もすごいなー。笑

まぁ、基礎中の基礎だが、これでまた一つ成長した。

アップグレードのボタンを使えるように -AllUpgradeCancel-

確定したものはきちんと戻らない仕様だ。

UpgradeCancelができてしまえば、あとは全てLevel1に戻すのは容易い。

全てLevelを1に戻すまで処理をすればいいだけだ。

whileを使ってLevelが1まで戻るようにできた。

foreachが使えれば特になんの問題もなかった。

最初に洗い出した残りのタスクを振り返ると

  • 放置復帰を滑らかに
  • 音楽
  • 転生時の得られるポイント表示
  • アップグレード要素追加
    ⇨とりあえず10個作る
  • ゲームバランス調整
    ⇨リセットによりもらえるポイント
    ⇨RPのインフレ
    ⇨アップグレードの必要ポイントインフレ
  • アップグレードのデザイン
    ⇨ポイント確定いらない?
    ⇨ポイントリセット動画入れる?
     ⇨今回はやめる?

とりあえず残りは音楽、ゲームバランス、あとは演出の部分か。

ゲームバランスが難しいなー。次の記事ゲームバランスについて考える。

他の部分はサクッと入れよう。