unity1week制作記事です。
前回ドライブデートの準備をしました。
今回は街を走らせたり、細々とした機能を付け加えます。ちなみにまだゲーム性はほとんどありません。やりたいこと詰め込んで迷走しています。
- cubeを押したら音が流れる
- 街を入れる
- 車を走らせる
- Mapを写す
- 現在位置を示す
- ランキングに渡す部分
- とりあえずアップロード
- 最初のunityロゴの表示設定
- ゲームクリア・スタートシーン
- とりあえず完成
cubeを押したら音が流れる
車の中のボタンを押したら音楽が流れるというのを実装しました。
上の二つを組み合わせました。
ボタンが押下判定はevent triggerというコンポーネントを使いました。UIに使うボタンクリックなどのシステムをゲームオブジェクトにも使えるというものです。
こんなのあったんだ!rayより簡単だし確実。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class audiostart : MonoBehaviour {
private AudioSource bgm;
// Use this for initialization
void Start () {
bgm = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update () {
}
public void OnMouseDown(){
if (!bgm.isPlaying) {
this.bgm.Play();
// 再生中であれば停止
} else {
this.bgm.Pause ();
}
}
}
再生・停止の切り替えはこちらを参考にやりました。
追記:あるゲームオブジェクトの子オブジェクトにしたら、クリックに反応しなくなりました。
街を入れる
ZENRINが出している福岡の街アセットを入れました。
車を走らせる
スクリプトを使ったり、Navimesh使ったりと色々迷走していたのですが、最終的に車のアセットの中に走らせるモードが入っているのに気づきました。
昨日入れたこの車、unityのstandardasstに入っているものと同じでした!
昨日は純粋なモデルを入れていたのですが、prefabの中にCartoon-SportCar_Unity_setupという名前のものがあり、これを入れると矢印キーで動いたり、ブレーキもついていて、あとエンジン音とかも入っていました。神。
このままだと重力で落ちてしまうので、床にMesh Colliderをセットします。
私が入れている街のアセットはA~Iまでの地区に分かれておりその中にroadオブジェクトがそれぞれあるので全部にMesh Colliderをつけました。
これでピュンピュン走ります。カメラを車の後ろや中に設置して車のこオブジェクトにすると操作しやすいです。
Mapを写す
全体マップがあったほうがいいと思うので、新しくカメラを作って街を上から見下ろします。
そのカメラに新しく作ったrendertextureをセットします。
新しくマテリアルを作ってシェーダーをUnlit>Textureにします。
それにrendertextureをセットします。
そのマテリアルを新しく作ったUI>imageのmaterialにセットします。
Canvasをこんな感じに設定します。
imageの位置や大きさを動かして・・・できた!
現在位置を示す
マップが小さくて現在位置がわかりにくいので、マップカメラにだけ表示されるでっかい目印を作りました。
車の子オブジェクトにでっかいキューブを設置して、キューブのレイヤーを自分で作った何かにします。そしてメインカメラのclippingmaskから自分で作ったレイヤーを除きます。
綴り間違ってるの知ってる。
完成はこんな感じ。
本当はキューブじゃなくてスプライトイラストとかの方がいいよな〜
ということでスプライトにしました。
このクエリちゃんのロゴってこういう使い方していいのかな?
不安なのであとで別のに変えるかも。
ランキングに渡す部分
ランキング動作確認のために何か数値を渡したい。
最初はTypeをTimeにして時間を送ろうとしたけど、やり方がよくわからなかったので、Time.deltaTimeを足していったものをintにした数値を数値データ(Number)として渡すことにしました。
車が地面から落ちてy座標が0以下になったら、その時までの数値を渡します。
・・・と思ったけど実装したらrankingシーンがずっと動き続けて数値が渡されないし、色々やったけどうまく行かないのでランキングは諦めます。
それか渡す数値の種類を変えるか?
とりあえずアップロード
完全に詰まったので、一旦現時点のものをunityroomにアップロードしました。webglのエラーがあるかもしれないし。
と思ったら本当にエラーが出て動かない!
Maximum call stack size exceededと出ています。
Javascript consoleもみてみたらランキング実装あたりで何か言われている?
よくわからないけど、今回はランキングは実装しないのでその部分を消して、アップロードしたら今度はちゃんと動いた。
というかbuild and runにしたらローカルで動作確認できるんだった。いつも忘れる。
最初のunityロゴの表示設定
ゲームが始まる前に表示されるunityロゴの表示を設定できるみたいなのでいじっていました。webGLのplayer settingのsplash Screenでいじれます。
背景の色を変えたり、自分の画像を使ったりできる!勝手にぼかしをかけてくれます。Previewボタンで確認
あとresolutionでスクリーンのサイズを設定するのも必要っぽい。
unityroomのデフォルトが960*540なのでそれに合わせた。
ゲームクリア・スタートシーン
前回・前々回とゲームクリア画面はシーン遷移を使って別のシーンに移動して表示していたのですが、他の方のゲームを遊んでいると、ゲームクリアしたら同じシーンの上「もう一度遊ぶ」ボタンを表示して、押すとリセットされる、という形式が多かったです。
あれってどうやるんだろうと思って調べたら、自分自身のシーンをシーン遷移で読み込めばリセットされるのか
そのほかにもApplication.LoadLevel("scene");という関数もあるらしい。
こちらの記事のボタンの表示・非表示と組み合わせて、ゲームクリアしたらクリア画像を上に表示して、ボタンを押したら最初のシーンにリセットするようにしてみました。
画像はイラレで作りました。半透明の背景にしても、pngでスプライトに変換したらちゃんと適用されるんだ。
あとボタン画像もunityで色を変えることができる。
とりあえず完成
こちらから遊べます。
街から落ちたらゲームクリアです。
もうゲーム性なんてあってないようなもの。
他の人のを遊んで何か思いついたら実装します。
次完成編