Unityで一方通行の壁を(ゴリ押しで)作る

2024/12/06に公開

はじめに

この記事は2024team411アドベントカレンダーの6日目です。

昨日はあかあくさんの「【インフラ好き必見】人類Tailscaleを使おう」でした。外にいながら自宅のサーバーやパソコンに接続できるのは画期的ですね!!これは使うしかない!開発や課題がサクサク進みそうです。

さて、今日の記事は今までとはちょっと毛色が違います。今までは技術についてでしたが、今回はUnityという開発環境で一方通行の壁についての記事です。(赤い帽子がトレードマークの某配管工が乗れるくもの床みたいなものです。)

Unityとは

簡単に言うとパソコン一つで開発ができるツールです。プロも実際に使用することがある高性能でありながら、初心者や子どもでも扱いやすくなっている便利なツールです。スマートフォンなどのモバイルゲームではUnityで制作されたゲームがたくさんあります。しかも、無料で利用できるんです!!すごくないですか!?無条件ではないですが、使用条件はほぼないようなものです。
公式サイトによると、無料利用の条件は個人使用なら、ゲームによる収入が年間10万ドルを超えないこと。
参考
https://unity.com/ja/products#plans-individual

Visual Studioとは

マイクロソフト社が提供しているWindowsOSでのみ使えるIDEです。C#の開発をサポートしてくれる機能がたくさんあるので今回はこちらを使います。Macの人はVisual Studio Codeeclipseなどがオススメです

https://visualstudio.microsoft.com/ja/vs/
https://www.eclipse.org/
https://code.visualstudio.com/

準備

Unityやテキストエディタ(Visual studioとか)の準備はできていますね?できている前提で進めます。

最初は新規プロジェクトの作成をしましょう。青の新規作成ボタンを押し、以下の画面で3Dを選んでください。プロジェクト名と保存先はお好きなところに~。準備ができたら作成!

Altテキスト
プロジェクト作成画面

開いたときに、右上のlayoutで自分の作成しやすいように変更するのをオススメします。(筆者は2by3で慣れているので以降の画面はすべて2by3です。)

製作(Unity)

まずは壁にしたいオブジェクトを生成します。色付きがいいならcubeを。透明な一方通行の壁を作りたいときは空のオブジェクトCreate Emptyにしましょう。当たり判定さえあれば何でもいい。
作り方はHierarchy > 3D Object > Cube

Altテキスト
壁生成

名前やサイズは自分の好きなやつに!(以後は一方通行の壁をOne_Way_Wallとし、サイズは5×5×1)

One_Way_WallにAdd CompornentでRigitbodyを追加しましょう。ついでにUse Gravityのチェックを外して重力で落ちていかないようにします。

Altテキスト
Compornentの調整

これで壁はできました。

次に一方通行の壁を作る際に肝となる部分、Sensorを作ります。とはいっても、先ほどのCubeと同じようにしてCreate Emptyを作るだけです(サイズと位置はお好みで。大きいとガバガバな壁になります)。このままだと何の役にも立たないので、さっきと同じようにAdd CompornentからBox ColliderとRightbodyを付与してあげましょう。この時、Is TriggerのチェックとUse Gravityのオフを忘れずに!

Altテキスト
チェックボックスのオンオフ

最後に一方通行の壁を使うplayerを用意します。今回は適当にSphereにしました。早速Rigidbodyをつけておきましょう。

Altテキスト
playerの作成

画像は変更前なのですが、名前の下のTagの部分をUntaggedからPlayerに変更しておいてください。

C#の作業に移行するために今作ったOne_Way_WallSensorplayerにAdd CompornentからNew scriptでそれぞれC#のファイルをオブジェクトにつけといてください。

|Altテキスト|![Altテキスト](https://storage.googleapis.com/zenn-user-upload/68a5debce845-20241205.png = 250x)|
New scriptでC#のファイルを作成

(今回筆者が作成したC#のファイル。One_Way_Wall, Sensor, player)

これで一旦Unity側の作業は終わりです。次はCodeを書くよ!

製作(C#)

C#を書きます! そんなに難しくはない。先ほどオブジェクトにくっつけたScriptの右上にある縦に並んだ三つの点 > Edit ScriptでCodeを書き込めるようになります。

Altテキスト
Edit ScriptでCodeの書き込み

まずはplayerの移動を作ります。

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

public class player : MonoBehaviour
{
    Rigidbody rb;
    float speed = 2.0f;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.W))//wキーが押されたら
        {
            rb.velocity = transform.forward * speed;
        }
        if (Input.GetKey(KeyCode.S))//sキーが押されたら
        {
            rb.velocity = - transform.forward * speed;
        }

    }
}

次にSensorを作りましょう。playerというtag(名札のようなもの)を持っているオブジェクトがSensorにぶつかったらOne_Way_WallにOpenというメッセージを送るようにします。

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

public class Sensor : MonoBehaviour
{
    public GameObject One_Way_Wall;
    private void OnTriggerEnter(Collider col)//何かがぶつかったら
    {
        if (col.gameObject.tag == "Player")//Playerというタグを持っていたら
        {
            One_Way_Wall.gameObject.SendMessage("Open");
        }
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

最後にOne_Way_Wallを作ります。SensorからOpenというメッセージを受け取ったら、Is Triggerにチェックを入れて当たり判定を無くして通れるようにします。その後、再度チェックを外して当たり判定を付けることで通れなくします。

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

public class One_Way_Wall : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {

    }
    public void Open()
    {
        StartCoroutine("OpenWall");
    }

    private IEnumerator OpenWall()
    {
        BoxCollider col = GetComponent<BoxCollider>();
        col.isTrigger = true;
        yield return new WaitForSeconds(3.5f);
        col.isTrigger = false;
    }
}

これでC#の部分は終わりです!!

ちなみに……

yield return new WaitForSeconds(TIMEf)

TIMEのところの数字が壁が通行可能な時間です。

保存は忘れずに行いましょう! Ctrl + S!

製作(融合)

ラスト!!ここまで来たら完成までもう少しです。
SensorにくっつけたSensor scriptを見てください。None(Game Object)ってなっているところがありますね??欄の右に丸いマークがあると思います。

Altテキスト
丸い印

押すと下のようなObject一覧が出てくるのでOne_Way_Wallを選択してください。

Altテキスト
Object一覧

後は各自好きなように調整してみてください。

これで君も某配管工のあのステージがUnityで再現できるようになったね!!(ジャンプとかは簡単に実装できますよ~。作りたくなったら調べてみてください。要望あれば記事書くかもしれない。)

応用

今回は一方通行の壁だったけど、向きを変えることで落とし穴や吊り天井(落とし穴の上に物体を置いておくだけ)とかもできたり。WallがSensorに収まる形にすると秘密の通路が作れたり…発想次第でいろんなものが作れますね!

おわり

以上、Unityで一方通行の壁を作ろうという話でした。記事が汚いのはゆるして……初投稿なので…

明日の記事はかずたつさんの「factorioのブループリント解析して自由に書いてみた」です!あの面白いゲームfactrioを解析するとは…とても楽しみですね!!明日の記事もぜひご覧ください。

Discussion