前回に引き続き意地でも参加します。
第12回 Unity 1週間ゲームジャムのお題掲載されました〜。
— naichi (@naichilab) June 30, 2019
今回のお題は「あつめる」です!
それでは今週もよろしくお願いします。ゲーム作りを楽しみましょう!https://t.co/2uhr9rdqDr #unity1week
完成したものがこちら
公開されたら下のリンクから行けるはず
https://unityroom.com/games/omato_gather
画面サイズ370*670
今回の目標
毎回一つでも新しいことを習得できればいいという低い目標で参加しているので、ゲームのクオリティはうんこですが気にしない。
そして今回の目標は
・UniRXを使う
・命名とかコードをきれいにする
・働きながら、体調を壊さず、投稿までする
今回、働き始めてから初めてのUnity1weekなのでどうなるかな~~
ゲーム内容
ゲーム内容は昔この本で作ったような、落ちてくるものを集めるやつにしようと思います。
記憶だと、箱を動かして落ちてくるものを取るかと思ってたけど違った・・・
どうしようかな~
トマシープちゃんがいっぱい落ちてきて、食べるパックマンを動かすようにします。
Paint3Dで書いた。
トマト落下
Rigidbody2Dで落ちる。
プレハブ化
・インスタンス化
Instantiate(tomato, pos, Quaternion.identity);
・生成される範囲をランダム指定
Vector2 pos = new Vector2(Random.Range(-3.0f, 3.0f), 4f);
・XX秒ことに
画面外に出たら消す
if (!GetComponent<Renderer>().isVisible) {
Destroy(this.gameObject);
}
インスタンス化されたゲームオブジェクトってどうとればいいんだろう?
GameObject obj;
obj=Instantiate(tomato, pos, Quaternion.identity);
Destroy(obj.gameObject);
でいいのかな?いっぱい生成されたトマト全部に適用されるのかな?
トマト生成と同じスクリプトに書こうと思ったけど、Destroyの処理は別のスクリプトに書いてトマトプレハブに付けておいたほうがいいのかな。。。
ふりがなの本ではどうしてたっけ・・・?プロジェクトが手元にないから確認できないや。
というか!GetComponent<Renderer>().isVisibleって消すオブジェクトのRendererを見てるのか??
結局プレハブにつけた。無事消えた。
パックマン左右キーで画面内移動
player_pos = transform.position; //プレイヤーの位置を取得
player_pos.x = Mathf.Clamp(player_pos.x, -4.8f, 4.8f); //x位置が常に範囲内か監視
transform.position = new Vector2(player_pos.x, player_pos.y);
左右キーで画面内を移動
if (Input.GetKey (KeyCode.LeftArrow)) {
player_pos.x = player_pos.x - moving_distance;
}
if (Input.GetKey (KeyCode.RightArrow)) {
player_pos.x = player_pos.x + moving_distance;
}
moving_distanceが移動量。ちゃんとネーミングしてえらい!
#unity1week
— トマシープ (@tomasheep) 2019年7月3日
進捗
プレハブとの判定方法が分からなかった。
でもプレハブを自力で使ったの初めてでえらい。 pic.twitter.com/JuzrIqxKwh
パックマン食べる
トマトがパックマンに当たったらトマトを消して、点数を追加
当たり判定は当ブログおなじみの距離判定!
private void PackmanEat()
{
float dis = Vector3.Distance(thisPos, tomatoPos);
if (dis < eat_distance) {
///tomato消す
point++;
Debug.Log("食べた");
}
}
この処理パックマン側とトマトプレハブどっちに書けばいいんだ
トマトプレハブに書いた場合、パックマンをスクリプトで取得するのか・・・?
もう距離じゃなくてcollider判定にしたほうがよさげかしら
TriggerEnter2D
Trigger判定にしました。トマトプレハブ側に付けます。
TriggerとかColliderは全人類設定を間違えて詰まることがあると思うのですが、そんなときはこちらの記事で確かめればいいと思います。
私は2Dにしていませんでした。知らなかった。
あとrigidbodyのついていないほうをisTriggerにしても意味がないらしい。
どちらもisTriggerチェックした。
これで無事消えました。
15秒で終わり
終わったら結果画面を出す
UniRXの使いどころ
お勉強したUniRXを使います。自分のプロジェクトで使うのは初めてなのでうまくできるかな。
スタートボタンを押したら、
・トマト生成開始
・カウントダウン開始
パックマンが食べたら(tomatoからGameManagerに
・音ならす
・ポイント追加
天才なので割とすぐできてしまった。
Updateを使うのはあってるのか?
色気
フォントを変えました。
PixelMplusというフォント。再配布可能で感じもあってすごくいい!
背景
背景が淡色だと寂しいのでいい感じのテクスチャないかなと思って、安心信頼のTopeconHeroesさんのサイトを探したら、パターン素材サイトもありました!!神
しかもプチトマトまでありました。マジで神
パターンにするにはImageTypeをTiledにするとできた!
完成
公開されたらここから。2019/7/7の20時から
https://unityroom.com/games/omato_gather
なんかUnityroomだとwebGLの読み込みが終わらない。。。
割り当て領域も変えてみたけどだめだった。
256MBにしたらすぐに読み込まれた。
軽いゲームだと思ってデフォルトの32MB周辺をいじってたけどそういうことじゃないのかな?
最後に
UniRX使わなかったらどうやって実装するんだ?っていうのあった。
ネーミングは気を抜いて若干適当なところがあるけど、当社比とてもがんばってる。
最初spriteじゃなくてCancasのImageでトマトやパックマン作ってて途中で間違いに気づいた。久しぶりに2D触るとそういうこともあるよね。
というかずっと最近uGUIばっかり触ってたからな~~
使ったスクリプト