ウイルス性胃腸炎で寝込みました。病気は怖いですね。有給が飛んでいく…
家庭の事情で週末実家帰省をすることになったので、ガミガミ言われないために?見た目を整えます。(一般人は厳しい)
- レベルにテクスチャを設定する
- ゴールを焚き火にする
- 棒をマッチにする
- 壁に当たったらやり直しにする
3月20日
スクリーンショットを撮ってなかったので結果から行くと、こうなります。
レベルにテクスチャを設定する
いつまでもプリミティブではしょうがないので、テクスチャを設定します。Asset Store でちょうどよさそうなのを探し、以下を採用。レベルをコンクリート調にします。そのままできれいなのですが、DK2 や Gear VR 程度の解像度では模様がつぶれちゃって格好が悪いので、Tiling を 0.5 にして見える程度に拡大します。パターンが見えてダサくなっちゃうけどね…難しい。
laster Materials – Photoscanned
これを Prefab にしておきます。今後見栄えの調整がしたくなった時も一括でできるようになります。
ゴールを焚き火にする
ゴールも変えます。またまた Asset Store でちょうどいいのを見繕います。
そのままだと Gear VR (S6) で 50fps しか出なくなってしまうので、Heat なんちゃらというパーティクルシステムを削除します。これでとりあえず 60fps 出ます。
ゴールとして認識されるように、Finish タグをつけておきます。
使いまわせるように Prefab にしておきます。
棒をマッチにする
棒をマッチにします。棒に MDF っぽいテクスチャを張り、先端に赤いカプセルを被せます。
棒とカプセルを空のゲームオブジェクトの子にしてプレハブ化します。ところが、これだと棒とカプセルが一緒に動かないので、BarController.cs、Collider、Rigidbody を棒から親オブジェクトに移します。ついでにコライダーの位置とサイズがおかしいので調整します。
続いて、MainCamera にアタッチしてある PlayerController.cs にて、BarController.cs の参照を修正します。スクリプトを移動したので、スクリプトをアタッチしてある親オブジェクトを指定できるようになっています。
これで大体思った通りに動くはずです。なんか忘れてないかな…不安
壁に当たったらやり直しにする
壁に当たって、マッチの色が変わるだけでは楽しくありません。壁に当たったら色が変わる処理は無くして、レベルをやり直しというルールを実装します。
- Renderer インスタンスの宣言を削除
- Start() 関数で Renderer を取得し、操作可能にしていた部分を削除
- OnColliderExit() をまるまる削除
- 壁に当たったらレベルのリロードを行う
これだけで済みます。追加部分は OnCollisionEnter() の最後の else の中に
1 |
SceneManager.LoadScene (SceneNumber); |
これを追加するだけで現在のシーンを再読み込みします。
まとめ
BarController.cs 全文はこちら。若干短縮。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class BarController : MonoBehaviour { //シーン番号を管理 static int SceneNumber; // 衝突時の挙動 public Camera MainCamera; public Color ChangeColorTo; public bool DK2Mode; float XSensitivity = 7f; float YSensitivity = 5f; void Start () { if (DK2Mode == true) { XSensitivity = XSensitivity * -1; } else { YSensitivity = YSensitivity * -1; } enabled = false; //自分を最初に無効化する。カメラの PlayerController から有効化することで操作可能にする。 } void OnCollisionEnter (Collision collision) { if (collision.gameObject.CompareTag ("Finish")) { //ゴールに到着した際の挙動 ++SceneNumber; if (SceneNumber == SceneManager.sceneCountInBuildSettings) { SceneNumber = 0; } SceneManager.LoadScene (SceneNumber); } else if (collision.gameObject.CompareTag ("CheckPoint")) { //チェックポイントでの挙動 Destroy (collision.gameObject); MainCamera.GetComponent<PlayerController> ().enabled = true; enabled = false; } else { SceneManager.LoadScene (SceneNumber); //壁にぶつかった際にシーン再読み込み } } // 頭の動きを棒に反映させる Vector3 pos; Quaternion cameraRotation; void Update () { pos = transform.position; cameraRotation = MainCamera.transform.rotation; pos.x = cameraRotation.y * XSensitivity; pos.y = cameraRotation.x * YSensitivity; transform.position = pos; } } |
次はやり直しやレベル遷移がスムーズにできるようにしたい。けどレベルをジャンジャカ増やしてみたくもあるなあ。
“Avoid The Walls 開発日記 5” への2件のフィードバック