ぼくの息抜き

ぼくの息抜き

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

CSS MenuMaker

unityゲームプログラミング とにかくワラワラしたゲームを作るPart1 -プロトのプロトを作る-

前回までRainGameというものを作っていた。行き当たりばったりで作っていたため、ある程度完成したら、どう終わらせていいか全然イメージが湧かなくなった。

もやもやするが、

www.bokunoikinuki.com

 

f:id:bokunoikinuki:20180710135401p:plain

いろいろ考え、プロトのプロトを作ることにした。

これだけシンプルなことでも、作り始めてみると、詳細どうしようか悩まされる。

f:id:bokunoikinuki:20180710135637p:plain

こんな感じで内枠を作り、丸を一つ配置した。

次に何をするか。

10タップすることで菌が完成形となり、動き出すようにしたい。

今思いつく、決める仕様。

  • どこをタップすることで反応とするか。
    ⇨全画面?
  • 菌が成長中はどのような動き、見た目にするか。

成長中のアニメーションなどは今回は省こう。極力シンプルに今回プロトのプロトで何が作りたいか、再度考える。

プロトのプロトで何が作りたいのか

メインは

  • 規定数のタップで菌生成
  • 生成されたら動く
  • ぶつかったら消える

めちゃくちゃシンプルにすると今回作りたい部分はこれだ。

であればまずは生成だ。

規定数のタップで菌生成

どこをタップするとタップしたことになるか。

今まで使ってきたもので、思いつくのは

  • Input.GetMouseButtonDown(0)

だ。これをUpdate()の中に入れて中に処理を書けば、反応させられるな。

よし、まずはこれを使って全画面どこでもタップで菌が成長するようにしよう。

Prefabで管理するなら、いつ未成長前の菌を生成するのか。タップとは別の反応するのか?

いやー、作り始めてみると壁だらけだなぁー。全然想像できてないな。

ただまぁ、大枠さえ決まって入れば、遠回り道しても確実にゴールには近づく。

なんか焦っている気がする。

焦る必要はない。一つ一つ壁を乗り越えることに楽しさを感じよう。

できた。

public class BacteriaManager : MonoBehaviour {

	int growthCount = 0;
	bool isGrown = false;
	float speed = 10.0f;

	// Use this for initialization
	void Start () {

		this.transform.localScale = new Vector3 (0.1f, 0.1f, 1);

	}
	
	// Update is called once per frame
	void Update () {

		if (Input.GetMouseButtonDown(0)) {

			if (growthCount > 9) {
				return;
			}
			growthCount ++;
			this.transform.localScale = new Vector3 (growthCount * 0.1f, growthCount * 0.1f, 1);
			if (growthCount >= 10) {
				isGrown = true;
			}
		}
		Debug.Log (growthCount);

		if (isGrown == true) {
			this.transform.position += new Vector3 (0, Time.deltaTime * speed, 0);
		}
	}
}

とりあえず。最初から菌がいて、10回画面をタップすると上に動き始めるようにできた。

次は敵を作り、敵との接触判定を作る。

敵との接触判定

なんだかんだ。接触判定は作っていない?RainGameで作ったか?

あれは

  • OnParticleCollision

だ。Particle SystemとCollisionとの接触時の関数だ。

参考記事:衝突判定のあれこれ

調べたらいいのが出てきた。

  • void OnTriggerEnter (Collider other)

で接触判定を行えるっぽい。試してみよう。

うーん。なんだかうまくいかない。

trigger追加したが反応なし。

 

OnCollisionEnterも使ってみたが、どうも無反応だった。

色々調べてみると2DのColliderはOnCollisionEnterは使えない。

OnCollisionEnter2Dを使わないといけなかったようだ。

接触したらどっちも消えるようにする。

できた。

	void OnCollisionEnter2D (Collision2D collision) {
		Destroy (this.gameObject);
	}

これを敵、自分どっちのスクリプトにも入れれば同時に消える。

ちなみにOnCollisionEnter2D (Collision2D collision)

引数の2Dを忘れるとエラーは出ないが、接触判定が起きない。覚えておこう。

HPを持たせる、消えたら再度復活できるように

HPを持たせるのは簡単。終わった。

消えたら再度復活させるようにするのはどうしようか。

今は味方一体しかいないが、最大数は1のみじゃなく増やせるようにするつもり。

リストで管理か?

リストで管理するならリストのカウントがMax生成数より低ければ増やせるようにする。

どのタイミングで増やすかなんだよな。

基本未成長の菌は一体のみとしたい。

最大菌数の管理はリスト

ユニークナンバーを作って、複製時リストにユニークナンバーと紐付けてAddして管理。菌が消滅するときはリストからユニークナンバーの数字を削除。

ユニークナンバーなくてもリストのカウントの数値だけあれば、最大生成かどうかはわかるな。

そもそもリストのカウントのみなら、int型で十分だ。めっちゃシンプルだった。

生成のタイミングはいつだ?
  1. 未成長の菌が完全に成長したとき
  2. 初期起動時
  3. 菌数がMAXの時に菌が減った時

未成長の菌がいるかいないかのフラグを作って、未成長の菌がいなくて、菌数がMAX以下ならすぐに未成長の菌を生成。

これで1~3全て解決できるな。

仲間との接触で消えないように

おそらく、同時に菌が複製されず、やられたり、成長済みで新しい菌が生成されるようになったが、仲間同士の菌で消えてしまっている。

先ほどOnCollisionEnter2Dで参考にさせてもらった派生記事に書いてあった。

参考記事

Unityの2Dゲームで「当たり判定」の基本を30分で理解するコツ!(後編) - Unity不定期便

tagを使い、当たり判定時の動きを変える。

	void OnCollisionEnter2D (Collision2D collision) {
		if (collision.gameObject.tag == "タグの名前") {
			// ここに記述
		}
	}

これでいける。

ただ、バグで、成長中か判定しているpublic static boolで菌が進むか否かの判定を行なっていたので、新しく成長中の菌が複製されたタイミングで成長済みの菌が進まなくなってしまった。

public staticとは別にpraivate boolを作って直した。

まとめ

とりあえずはプロトのプロトが完成した。

実はこのゲームを作り始める前に随分と完成形の形を考えていた。

ただ、unityでのゲーム作成スキルが完成形に追いついていない。

考えれば考えるほど

いやー、考えれば考えるほど、まだまだ自分のスキル、知識が少なすぎる。

やりたいことがすっとできないもどかしさ。悔しい。

まだ、面白いゲームを作る段階ではなく、できそうなスキルから面白そうなゲームを作るという決まった枠の中から頑張る段階かもしれない。

難しいなぁ。どっちが自分はノリノリで継続できるのだろうか。