前回までのおさらい
前回までで
- 地面が敷き詰められたエリア
- 背景だけで地面のないエリア
- 一つおきに穴のあるエリア
- 空間的に地面が配置されているエリア
ができ,Prefab化されました. 今回は,
- 上下に移動する地面があるエリア
- ダメージ床があるエリア
- 上下に移動するダメージ床があるエリア
を作成したいと思います.
上下に運動する床を作る
まず,上下に移動する床を作るために,最初にカメラが映しているところに配置してあるエリアを削除しましょう.どうせ今まで作ったエリアは全部Prefab化してあるのでこれは直ぐに戻せる操作ですね.
次に背景だけで地面のないエリアをPrefabから選択し,Hierarchyビューにドロップします. すると現在カメラが映し出しているSceneの中央に背景が配置されます:
次にこのエリアにアセットのTooCubeForestの中のimagesフォルダから"Forest_terrain_wood02_128px Import Settings"の中から"Forest_terrain_wood02_128px_0"を選択して,このエリアにドロップしてください.ただし,三角のマークをクリックして展開するのを忘れないでください.それからこのGameObjectの名前を"UpDownwood"にリネームしてからBox Collider 2Dをアタッチしてください.
次に"UpDownwood"にアタッチするスクリプトをMyScripts内に"UpDownwoodScript"という名前で作成します.ダブルクリックして編集し,次のコードを記述してください:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UpDownwoodScript : MonoBehaviour { public float A; public float arg; public float w; float X; float Y; float Z; float t; // Start is called before the first frame update void Start() { X = transform.position.x; Y = transform.position.y; Z = transform.position.z; } // Update is called once per frame void Update() { t += Time.deltaTime; transform.position = new Vector3(X, A * Mathf.Sin(w * t + arg) + Y, Z); } }
このコードは詳しく説明するまでもないですが,まず振幅A,初期角arg,角速度wをInspectorから設定できるようにpublicで宣言し,変数X,Y,ZにSceneビューで"UpDownwood"を配置した位置に設定しそこを中心として振幅A,角速度w,初期角argでsin関数で上下するようにしてあります.なお,実際にはtに毎フレームごとにdeltaTimeを加えて角度が進むようにしてあります.これをHierarchyビューの"UpDownwood"にアタッチし,InspectorビューでA = 2,Arg = 0,W = 1を代入して,"Wizard Variant"をその上に乗せてPlayボタンを押すと次のようになります:
これで上下に動く床ができたのでPrefab化しましょう. ただし,簡易的に行ったカメラの設定のせいで,上下のカメラ移動が大きすぎて操作が大変そうです.そこでx軸方向の移動だけ追従するカメラを作りましょう.
x軸方向だけ追従するカメラ
MyScriptsフォルダ内に"CameraScripts"という名前でC#スクリプトを作り, 以下の内容を記述してください:
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(Camera))] public class CameraScript : MonoBehaviour { GameObject player; Transform playerTransform; // Start is called before the first frame update void Start() { player = GameObject.FindGameObjectWithTag("Player"); playerTransform = player.transform; } // Update is called once per frame void Update() { MoveCamera(); } void MoveCamera() { transform.position = new Vector3(playerTransform.position.x, transform.position.y, transform.position.z); } }
Ctrl +Sで保存したら,"Wizard Variant"の子にしてあったMain Cameraをトップの階層に持っていきこのCameraScriptをアタッチしてください.次に"Wizard Variant"のTagの中から"Player"を選択してください.この状態でPlayボタンを押すと次のようになります:
プレイヤーが上下に動いても,カメラが追従していないことが分かります.
上下に運動する床のエリアを作る
さて,カメラの設定が終わったので上下に運動する床のあるエリアを作りましょう. これには背景だけのエリアにPrefab化した"UpDownwood"を配置してゆけば良かったですね. ただし,全てのargを同じ値にすると全部一緒に上下してしまい面白みに欠けるので, 所々でargを90にしたUpDownwoodを配置しましょう.また振幅Aも必要に応じて調整してみましょう.全部配置すると例えばこんな感じのエリアができます:
ここで実際にはバランスを考えWizard VariantのMove Powerを15,Jump Powerを25に修正しました.今後も必要に応じ微調整してゆきましょう.
上下に運動する床のエリアができたのでこれを空のGameObject ”Area_UpDownFloor"の子にし,Prefab化してください.
ダメージ床のあるエリア
これは簡単です.Prefabにあるダメージ床を配置するだけで良いですね. バランスのため,空中に地面も配置しましょう. 出来上がるとこんな感じです:
これを"Area_woodenThorns"などとして保存しPrefab化しましょう.
上下に運動するダメージ床のエリア
これはダメージ床と上下に運動する床の組み合わせですね. ダメージ床も上下に運動する床もそれぞれスクリプトをアタッチすればできますから, この二つのスクリプトを同時にアタッチすればうまくいきそうですね.試してみましょう. 既にできている"woodenThorns"のPrefabをSceneに配置し,Hierarchtビューから"Unpack Prefab"を実行して,Prefabから切り離します.混乱を避けるため,この"woodenThorns"を"UpDownwoodenThorns"にリネームしましょう. "UpDownwoodenThorns"には既に"woodenThornsScript"というダメージ床用のスクリプトがアタッチされてますから,あとは"UpDownwoodScript"をアタッチすればよいことになります.アタッチした後振幅Aを2,角速度Wを1にしてPlayボタンを押してください. 上下に運動するダメージ床ができました.
これをPrefab化し,適当にAやArgやWを調整してその他のPrefabの素材と組み合わせると次のようなAreaが作れます:
これで最も基本的なエリアは大体できましたので次回はこれらのエリアを並べてステージを作ってゆきましょう.