【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
▶
【Unity】3Dアクションゲームを作ろう!#8 ステージの作成(スイッチ・扉)
▶
【Unity】3Dアクションゲームを作ろう!#9 プレイヤーのHP管理
▶
【初心者Unity】JsonUtilityクラスでJSONを扱う方法
▶
【初心者Unity】スクリプトからコンポーネントを追加する方法
はじめに
本連載は以下の目次ページにまとまっています。
前回の記事はこちら↓
【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
前回までに引き続きステージの作成を行います。
今回は扉とそれを開くためのスイッチを作成します。
1.通路を作成
扉とスイッチを作成する前に、以下のような通路を作成します。また、再利用しやすいようにプレハブ化まで行います。
① 空のオブジェクトを作成
Create Empty で空のオブジェクトを作成して、名前は Bridge とします。
以下の様に、床の縁とくっつけて配置します。
② 子要素として床と壁を配置
Bridge の子要素として、第6回の記事(↓の記事)で作成した箱のプレハブを配置し、名前を「Floor」とします。
【Unity】3Dアクションゲームを作ろう!#6 ステージの作成(床・壁)
Position と Scale は以下の通りにしました。
同様に左右の壁(RightWall, LeftWall)も作成しましょう。
・RightWall
・LeftWall
2.扉を作成
先ほどの通路を塞ぐように扉を作成します。
① 扉用のオブジェクトを配置
Bridge を右クリックして、3D Object > Cube を追加し、名前は「Door」とします。通路を塞ぐように、Position, Scale を調整しましょう。
② マテリアルを作成・適用
Project ビューで、Materials フォルダに新規マテリアルを作成します。
名前は「DoorMaterial」とします。
マテリアルの設定はお好みで調整してください。
マテリアルが作成できたら、Door に適用しましょう。
3.扉が開く仕組みを作成
新規スクリプトを作成し、名前を「DoorScript」とします。
以下の内容を記述しましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DoorScript : MonoBehaviour { float defaultY; // 扉の初期のY座標 float openY = 5f; // 扉のオープン時のY座標 float speed = 1f; // 扉の開閉のスピード public bool isOpen; // 扉を開けるか閉めるかのフラグ void Start() { defaultY = transform.position.y; } void Update() { if(isOpen && transform.position.y < openY) { transform.position += Vector3.up * speed * Time.deltaTime; } else if(!isOpen && transform.position.y > defaultY) { transform.position -= Vector3.up * speed * Time.deltaTime; } } }
各変数は以下の通りです。
・defaultY:閉じたときの位置
・openY:開いた時の位置
・speed:開閉スピード
・isOpen:値が true の時は扉が開く、false の時は扉が閉じる
スクリプトを作成したら、“Door”にアタッチします。
ゲームをプレイ中に“Is Open”のチェックを切り替えて扉の動作を確認しましょう。
※Time.deltaTime をかける理由
Update は1フレームごとに実行される処理ですが、1フレームの長さはゲームをプレイするPCの性能によって変わります。性能の良いPCの方がより短い間隔で Update が実行されるため、たとえば今回の扉を開閉するような処理では、PCによって速さが異なることが起こります。
そこでその対策として、22行目、26行目では speed に Time.deltaTime をかけています。
Time.deltaTime をかけると、どんな性能のPCでも、1秒間に speed だけ開閉する仕組みとなります。
詳しくは以下の記事にありますので、ご覧ください。
【初心者Unity】Time.deltaTimeの基本的な使い方
4.通路をプレハブ化
ここまでで通路と扉の仕組みは完成となるのでプレハブ化をしておきましょう。
5.スイッチオブジェクトを作成
ここからはスイッチの作成に移ります。まずはスイッチの見た目を決めていきます。
① 大きさと配置
3D Object > Cylinder をシーンに配置し名前を「Switch」とします。
合わせて、Position と Scale も調整しましょう。
② マテリアルを作成・適用
Project ビューで、Materials フォルダに新規マテリアルを作成し、名前は「SwitchMaterial」とします。
お好みの設定にして、“Switch”に適用してください。
6.スイッチのコライダーの設定
Cylinder で作成したオブジェクトには、デフォルトで Capsule Collider が設定されています。
実際の見た目よりも上下に膨らむ形となっており、プレイヤーがスイッチに乗ると宙に浮く見た目となってしまいます。ですので、適した形状のコライダーを設定しましょう。
まずは、Capsule Collider を削除します。
次に、BoxCollider を追加します。角があり、スイッチの形状とは少し異なりますが、大きな問題はないコライダーとなります。
さらに追加で、プレイヤーがスイッチを踏んだことを判定するために、Trigger 型のコライダーを追加します。配置や大きさに注意しましょう。
Is Trigger にチェックを入れておくことも忘れずに行ってください。
7.スイッチを押す処理を作成
プレイヤーがスイッチに乗ると、スイッチが押下されるようにします。
新規スクリプトを作成し、名前を「SwitchScript」とします。
以下を記述しましょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SwitchScript : MonoBehaviour { float bottomY = -0.1f; float speed = 0.5f; bool active; void Update() { if(active && transform.position.y > bottomY) { transform.position -= Vector3.up * speed * Time.deltaTime; } } private void OnTriggerEnter(Collider other) { if(!active && other.CompareTag("Player")) { active = true; } } }
実装は DoorScript と似ています。異なるのは OnTriggerEnter を使って active の切り替えを行っている点です。
Switch にアタッチしたらテストプレイをしましょう。
プレイヤーが乗ってスイッチが沈めば成功です。
8.扉とスイッチの連携
ここまでで作成した扉とスイッチを連携させ、スイッチを押下したときに扉が開く仕組みにします。
① SwitchScript を変更
SwitchScript を変更していきます。
以下の変数を追加しましょう。
次に、Update に処理を追加します。
y座標が bottomY よりも下になったら、door の isOpen を true にしています。これにより3.で確認した通り扉が開きます。
enabled = false とすることで、Update がそれ以上繰り返されないようにしています。これは、何度も isOpen = true にする処理が実行されないための対策です。
② Inspecterビューで Door を設定
Switch を選択し、SwitchScript の Door に、Bridge > Door を設定します。
テストプレイで、スイッチを押下して扉が開くか確認してみましょう。
9.スイッチのプレハブ化
スイッチも忘れずにプレハブ化しておきましょう。
ぜひ、ここまでの連載で作成したプレハブを使って、ステージを広げてみましょう!
おわりに
今回は少し長くなりましたが、スイッチで開く扉のギミックを作成しました。ギミック作成における全体の流れや、各スクリプトの内容は把握しておくといいと思います。また、オブジェクトは、作成したらプレハブ化しておくと、ステージを広げる際に使いまわしができるので、忘れずに行いましょう。
次回はプレイヤーのHP管理の仕組みを作成します。