Unityで一方通行の壁を(ゴリ押しで)作る
はじめに
この記事は2024team411アドベントカレンダーの6日目です。
昨日はあかあくさんの「【インフラ好き必見】人類Tailscaleを使おう」でした。外にいながら自宅のサーバーやパソコンに接続できるのは画期的ですね!!これは使うしかない!開発や課題がサクサク進みそうです。
さて、今日の記事は今までとはちょっと毛色が違います。今までは技術についてでしたが、今回はUnityという開発環境で一方通行の壁についての記事です。(赤い帽子がトレードマークの某配管工が乗れるくもの床みたいなものです。)
Unityとは
簡単に言うとパソコン一つで開発ができるツールです。プロも実際に使用することがある高性能でありながら、初心者や子どもでも扱いやすくなっている便利なツールです。スマートフォンなどのモバイルゲームではUnityで制作されたゲームがたくさんあります。しかも、無料で利用できるんです!!すごくないですか!?無条件ではないですが、使用条件はほぼないようなものです。
公式サイトによると、無料利用の条件は個人使用なら、ゲームによる収入が年間10万ドルを超えないこと。
参考
Visual Studioとは
マイクロソフト社が提供しているWindowsOSでのみ使えるIDEです。C#の開発をサポートしてくれる機能がたくさんあるので今回はこちらを使います。Macの人はVisual Studio Codeやeclipseなどがオススメです
準備
Unityやテキストエディタ(Visual studioとか)の準備はできていますね?できている前提で進めます。
最初は新規プロジェクトの作成をしましょう。青の新規作成ボタンを押し、以下の画面で3Dを選んでください。プロジェクト名と保存先はお好きなところに~。準備ができたら作成!
プロジェクト作成画面
開いたときに、右上のlayoutで自分の作成しやすいように変更するのをオススメします。(筆者は2by3で慣れているので以降の画面はすべて2by3です。)
製作(Unity)
まずは壁にしたいオブジェクトを生成します。色付きがいいならcube
を。透明な一方通行の壁を作りたいときは空のオブジェクトCreate Empty
にしましょう。当たり判定さえあれば何でもいい。
作り方はHierarchy > 3D Object > Cube
壁生成
名前やサイズは自分の好きなやつに!(以後は一方通行の壁をOne_Way_Wall
とし、サイズは5×5×1)
One_Way_Wall
にAdd CompornentでRigitbodyを追加しましょう。ついでにUse Gravityのチェックを外して重力で落ちていかないようにします。
Compornentの調整
これで壁はできました。
次に一方通行の壁を作る際に肝となる部分、Sensor
を作ります。とはいっても、先ほどのCube
と同じようにしてCreate Empty
を作るだけです(サイズと位置はお好みで。大きいとガバガバな壁になります)。このままだと何の役にも立たないので、さっきと同じようにAdd CompornentからBox ColliderとRightbodyを付与してあげましょう。この時、Is TriggerのチェックとUse Gravityのオフを忘れずに!
チェックボックスのオンオフ
最後に一方通行の壁を使うplayerを用意します。今回は適当にSphere
にしました。早速Rigidbodyをつけておきましょう。
playerの作成
画像は変更前なのですが、名前の下のTagの部分をUntaggedからPlayerに変更しておいてください。
C#の作業に移行するために今作ったOne_Way_Wall
、Sensor
とplayer
にAdd CompornentからNew scriptでそれぞれC#のファイルをオブジェクトにつけといてください。
||![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を書き込めるようになります。
Edit ScriptでCodeの書き込み
まずは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というメッセージを送るようにします。
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にチェックを入れて当たり判定を無くして通れるようにします。その後、再度チェックを外して当たり判定を付けることで通れなくします。
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)ってなっているところがありますね??欄の右に丸いマークがあると思います。
丸い印
押すと下のようなObject一覧が出てくるのでOne_Way_Wallを選択してください。
Object一覧
後は各自好きなように調整してみてください。
これで君も某配管工のあのステージがUnityで再現できるようになったね!!(ジャンプとかは簡単に実装できますよ~。作りたくなったら調べてみてください。要望あれば記事書くかもしれない。)
応用
今回は一方通行の壁だったけど、向きを変えることで落とし穴や吊り天井(落とし穴の上に物体を置いておくだけ)とかもできたり。WallがSensorに収まる形にすると秘密の通路が作れたり…発想次第でいろんなものが作れますね!
おわり
以上、Unityで一方通行の壁を作ろうという話でした。記事が汚いのはゆるして……初投稿なので…。
明日の記事はかずたつさんの「factorioのブループリント解析して自由に書いてみた」です!あの面白いゲームfactrioを解析するとは…とても楽しみですね!!明日の記事もぜひご覧ください。
Discussion