Developer

【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)
2022.10.31
Lv2

【Unity】3Dアクションゲームを作ろう!#7 ステージの作成(Skybox・落下判定)


はじめに

本連載は以下の目次ページにまとまっています。

実践Unityゲームプログラミング 連載目次

前回の記事はこちら↓

【Unity】3Dアクションゲームを作ろう!#6 ステージの作成(床・壁)

 

前回に引き続きステージの作成を行います。

今回はゲームの世界観の表現が行える Skybox の設定と、ステージ外へ落下した際、無限に落ちていくことを回避するため、DeadZone を作成します。

1.Skybox の設定

Skybox とはゲーム世界での背景のようなものです。Skybox を工夫することで、様々な世界観が表現できます。

詳しくはこちらの記事で紹介していますので是非ご覧ください。

【初心者Unity】Skyboxの使い方

① アセットのインポート

Unity のアセットストアでは様々なアセットが提供されています。その中には無料で使うことのできるものも多くあります。今回はこちらから使用します。

使用するアセットはお好みで構いませんが本記事では下記のものを使用します。

Fantasy Skybox FREE

アセットをダウンロード、インポートする手順は以下の通りです。

・Add to My Assets をクリック(初回ダウンロード時のみ)

・Open in Unity をクリック

・Package Manager ウィンドウで import をクリック

Unity で Package Manager ウィンドウが起動します。

ウィンドウ右下 import をクリックしましょう。(初回は Download と表示されます。)

・import ウィンドウからインポートする

import ウィンドウが起動し、アセットの選択ができます。必要なアセットのみチェックを入れておくと容量の節約ができます。

チェックを入れたら右下の import をクリックしましょう。

下図のように Project ビューにアセットが追加されていれば成功です。

② Lighting ビューで設定する

続いて、インポートしたアセットを Skybox として設定していきます。

Lighting ビューで設定を行うのですが、表示されていない場合は

Window > Rendering > Lighting を選択すると表示されます。

Lighting ビュー > Environment > Skybox Material にお好みの Skybox アセットを設定します。

ここでは、Fantasy Skybox FREE > Cubemaps > Classic > FS000_Day_01 を設定しました。

以上で Skybox の設定は完了です。以下のような見た目となりました。

 

2.落下した際のデッドゾーンを作成

続いて、プレイヤーがステージ外へ落下した際、初期位置に戻る仕組みを作成します。現状は、落下すると無限に落下を続ける仕様になっています。合わせて、プレイヤー以外がステージ外へ落下した場合は消滅する仕様とします。

① 空オブジェクトを作成

Create Empty で空のオブジェクトを作成し、名前をDeadZoneとします。

また、下記のパラメータを入力します。

・Position(0, -50, 0)

・Rotation(0, 0, 0)

・Scale(1000, 1, 1000)

② 当たり判定(Trigger)を設定

・DeadZone オブジェクトに BoxCollider コンポーネントを追加します。

・Is Trigger にチェックを入れます。

これで接触判定用のオブジェクトが作成できました。

③ プレイヤーが初期位置に戻る仕組みを作成

PlayerScript にプレイヤーが初期位置に戻る仕組みを追加します。

初期位置については、既に変数(startPos)が用意されています。

startPos に強制的に移動する命令(関数)を追加で記述します。

※ここでは、CharacterController を無効にした状態で強制的に移動させる必要があります。

PlayerScriptには、以下の関数を追加しましょう。

 // 指定地点に強制移動する
    public void MoveStartPos()
    {
        con.enabled = false;

        moveDirection = Vector3.zero;
        transform.position = startPos + Vector3.up * 10f;
        transform.rotation = Quaternion.identity;

        con.enabled = true;
    }

4行目と10行目が、CharacterControllerの有効・無効を切り替える処理です。

6行目は移動情報をリセットしています。

7行目はプレイヤーの位置を初期位置の上側(y軸方向にプラスの位置)に変更しています。

8行目はプレイヤーの向きを(0, 0, 0)に変更しています。

④ DeadZoneのスクリプトを作成

最後に、プレイヤーが落下して DeadZone に触れた時の処理を作成します。

新規スクリプトを作成し、名前は DeadZoneScript として、下記を記述します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeadZoneScript : MonoBehaviour
{
   private void OnTriggerEnter(Collider other)
   {

        // プレイヤーは初期位置にワープさせる
        // それ以外のオブジェクトは破壊する
        if(other.CompareTag("Player"))
        {
            PlayerScript player = other.gameObject.GetComponent<PlayerScript>();
            player.MoveStartPos(); 
        }
        else
        {
            Destroy(other.gameObject);
        }
   }
}

OnTriggerEnter なので、Trigger型のコライダーに何かが接触した時に処理が実行されます。if文を使って、タグがPlayerである場合には PlayerScript の MoveStartPos を呼び出し、Player以外の場合には、オブジェクトを破棄します。

このスクリプトを、DeadZone にアタッチしましょう。

⑤ Player にタグを設定

Projectビューで、Prefabs > Player を選択し、Tag を “Player” に設定します。

以上でステージ外に落下した際の処理、DeadZone の設定は完了です。

おわりに

今回はステージの作成(Skybox・落下判定)を行いました。

Skybox は比較的容易に設定することができるので、アセットストア等でゲームのイメージに合ったものを探してみるといいと思います。

また、DeadZone の作成で使用した“Trigger型のコライダー”はギミック作成の際によく使います。今後も使用しますので使い方に慣れていきましょう。

引き続き次回もステージの作成をしていきます。

次回はスイッチを押すと開く扉の作成を行います。


Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次