前回に引き続き意地でも参加します。
bibinbaleo.hatenablog.com
完成したものがこちら
VIDEO youtu.be
公開されたら下のリンクから行けるはず
https://unityroom.com/games/omato_gather
画面サイズ370*670
今回の目標
毎回一つでも新しいことを習得できればいいという低い目標で参加しているので、ゲームのクオリティはうんこですが気にしない。
そして今回の目標は
・UniRXを使う
・命名 とかコードをきれいにする
・働きながら、体調を壊さず、投稿までする
今回、働き始めてから初めてのUnity1weekなのでどうなるかな~~
ゲーム内容
ゲーム内容は昔この本で作ったような、落ちてくるものを集めるやつにしようと思います。
bibinbaleo.hatenablog.com
記憶だと、箱を動かして落ちてくるものを取るかと思ってたけど違った・・・
どうしようかな~
トマシープちゃんがいっぱい落ちてきて、食べるパックマン を動かすようにします。
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); }
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を使うのはあってるのか?
色気
フォントを変えました。
PixelMplusというフォント。再配布可能で感じもあってすごくいい!
itouhiro.hatenablog.com
背景
背景が淡色だと寂しいのでいい感じのテクスチャないかなと思って、安心信頼のTopeconHeroesさんのサイトを探したら、パターン素材サイトもありました!!神
bg-patterns.com
しかもプチトマトまでありました。マジで神
bg-patterns.com
パターンにするにはImageTypeをTiledにするとできた!
完成
公開されたらここから。2019/7/7の20時から
https://unityroom.com/games/omato_gather
なんかUnityroomだとwebGL の読み込みが終わらない。。。
割り当て領域も変えてみたけどだめだった。
256MBにしたらすぐに読み込まれた。
軽いゲームだと思ってデフォルトの32MB周辺をいじってたけどそういうことじゃないのかな?
最後に
UniRX使わなかったらどうやって実装するんだ?っていうのあった。
ネーミングは気を抜いて若干適当なところがあるけど、当社比とてもがんばってる。
最初spriteじゃなくてCancasのImageでトマトやパックマン 作ってて途中で間違いに気づいた。久しぶりに2D触るとそういうこともあるよね。
というかずっと最近uGUIばっかり触ってたからな~~
使ったスクリプト
gist.github.com