トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

【unity1week】パクパクマンがトマトをあつめるゲーム【お題:あつめる】

前回に引き続き意地でも参加します。

bibinbaleo.hatenablog.com

完成したものがこちら

youtu.be

公開されたら下のリンクから行けるはず

https://unityroom.com/games/omato_gather

画面サイズ370*670

今回の目標

毎回一つでも新しいことを習得できればいいという低い目標で参加しているので、ゲームのクオリティはうんこですが気にしない。

そして今回の目標は

・UniRXを使う

命名とかコードをきれいにする

・働きながら、体調を壊さず、投稿までする

今回、働き始めてから初めてのUnity1weekなのでどうなるかな~~ 

ゲーム内容

ゲーム内容は昔この本で作ったような、落ちてくるものを集めるやつにしようと思います。

bibinbaleo.hatenablog.com

f:id:bibinbaleo:20190212195600g:plain

記憶だと、箱を動かして落ちてくるものを取るかと思ってたけど違った・・・

どうしようかな~


 トマシープちゃんがいっぱい落ちてきて、食べるパックマンを動かすようにします。

f:id:bibinbaleo:20190705084953p:plain

Paint3Dで書いた。

トマト落下

Rigidbody2Dで落ちる。

プレハブ化

f:id:bibinbaleo:20190703203618p:plain

インスタンス

Instantiate(tomato, pos, Quaternion.identity);

・生成される範囲をランダム指定

Vector2 pos = new Vector2(Random.Range(-3.0f, 3.0f), 4f);

・XX秒ことに

画面外に出たら消す

if (!GetComponent<Renderer>().isVisible) {
Destroy(this.gameObject);
}

qiita.com

インスタンス化されたゲームオブジェクトってどうとればいいんだろう?

GameObject obj;

obj=Instantiate(tomato, pos, Quaternion.identity);

Destroy(obj.gameObject);

でいいのかな?いっぱい生成されたトマト全部に適用されるのかな?

gametukurikata.com

トマト生成と同じスクリプトに書こうと思ったけど、Destroyの処理は別のスクリプトに書いてトマトプレハブに付けておいたほうがいいのかな。。。

 ふりがなの本ではどうしてたっけ・・・?プロジェクトが手元にないから確認できないや。

というか!GetComponent<Renderer>().isVisibleって消すオブジェクトのRendererを見てるのか??

結局プレハブにつけた。無事消えた。

パックマン左右キーで画面内移動

qiita.com

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が移動量。ちゃんとネーミングしてえらい!

パックマン食べる

トマトがパックマンに当たったらトマトを消して、点数を追加

当たり判定は当ブログおなじみの距離判定!

private void PackmanEat()
{
float dis = Vector3.Distance(thisPos, tomatoPos);
if (dis < eat_distance) {
///tomato消す
point++;
Debug.Log("食べた");
}
}

この処理パックマン側とトマトプレハブどっちに書けばいいんだ

トマトプレハブに書いた場合、パックマンスクリプトで取得するのか・・・?

もう距離じゃなくてcollider判定にしたほうがよさげかしら

TriggerEnter2D

Trigger判定にしました。トマトプレハブ側に付けます。

    void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Player")
        {
            Destroy(this.gameObject);
        }
    }

TriggerとかColliderは全人類設定を間違えて詰まることがあると思うのですが、そんなときはこちらの記事で確かめればいいと思います。

indie-du.com

私は2Dにしていませんでした。知らなかった。

あとrigidbodyのついていないほうをisTriggerにしても意味がないらしい。

どちらもisTriggerチェックした。

これで無事消えました。

 

15秒で終わり

freesworder.net

    public Text timeText;
    public int nowTime=15;
    public float totalTime=15.0f;

    private void Timer()
    {
        if (nowTime > -1)
        {
            totalTime -= Time.deltaTime;
            nowTime = (int)totalTime;
            timeText.text = nowTime.ToString();
        }
    }

終わったら結果画面を出す

UniRXの使いどころ

 お勉強したUniRXを使います。自分のプロジェクトで使うのは初めてなのでうまくできるかな。

bibinbaleo.hatenablog.com

スタートボタンを押したら、

・トマト生成開始

・カウントダウン開始

    void Start()
    {
        startButton.onClick.AsObservable().Subscribe((_) => isGameStart=true);
    }
  void Update()
    {
        if (isGameStart) {
            TomatoMake();
            Timer();
        }
    }

パックマンが食べたら(tomatoからGameManagerに

・音ならす

・ポイント追加

    void Start()
    {
        tomatoDestroy.OnEat.Subscribe(_ => { Eat(); }).AddTo(this);
    }
    private void Eat()
    {
        eatSound.Play();
        point++;
        pointText.text = point + "点";

    }

天才なので割とすぐできてしまった。

Updateを使うのはあってるのか?

色気

フォントを変えました。

f:id:bibinbaleo:20190705083820p:plainf:id:bibinbaleo:20190705083818p:plain

PixelMplusというフォント。再配布可能で感じもあってすごくいい!

itouhiro.hatenablog.com

背景

背景が淡色だと寂しいのでいい感じのテクスチャないかなと思って、安心信頼のTopeconHeroesさんのサイトを探したら、パターン素材サイトもありました!!神

bg-patterns.com

しかもプチトマトまでありました。マジで神

f:id:bibinbaleo:20190705085025p:plain

bg-patterns.com

f:id:bibinbaleo:20190705084911p:plainf:id:bibinbaleo:20190705084440p:plain

パターンにするにはImageTypeをTiledにするとできた!

f:id:bibinbaleo:20190705115445p:plain

完成

f:id:bibinbaleo:20190705194800p:plain

公開されたらここから。2019/7/7の20時から

https://unityroom.com/games/omato_gather

なんかUnityroomだとwebGLの読み込みが終わらない。。。

f:id:bibinbaleo:20190705201957p:plain

割り当て領域も変えてみたけどだめだった。

256MBにしたらすぐに読み込まれた。

軽いゲームだと思ってデフォルトの32MB周辺をいじってたけどそういうことじゃないのかな?

最後に

UniRX使わなかったらどうやって実装するんだ?っていうのあった。

ネーミングは気を抜いて若干適当なところがあるけど、当社比とてもがんばってる。

最初spriteじゃなくてCancasのImageでトマトやパックマン作ってて途中で間違いに気づいた。久しぶりに2D触るとそういうこともあるよね。

というかずっと最近uGUIばっかり触ってたからな~~

 

使ったスクリプト

gist.github.com