Unity PropHunt(物体かくれんぼ)の作り方

Unity

UnityでPropHuntを作ってみたいと思った方がいると思いますが仕組みが難しいと思ったはずです。

ですが今回は多少他の人のパクリと言える部分があるかもしれませんがほぼ私が考えたスクリプトを紹介したいと思います。

是非参考にしてもらえたら幸いです。

動作確認

まずこちらの白いカプセルが自分です。

次にこの白い柱がトリガーでこれに近づいてEキーを押すと

このように黄色の物体になることが出来ます。

ちなみに白い柱と見た目が違うのは分かりやすくするためでどんな見た目でも可能です。

説明

まずはUnity側の設定から見ていきたいと思います。

ヒエラルキー

まず①空のGameObjectを作りその中に②カメラと③操作したいオブジェクトと④Eキー押したときに変更したいオブジェクトを入れておきます。

そして変更したいオブジェクトはActiveをオフにしておきましょう。

スクリプト

次にスクリプトですがまずは移動系スクリプトから紹介します。

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

public class PlayerMove : MonoBehaviour
{
    //Rigidbodyの変数をrbと定義
    private Rigidbody rb;

    public LayerMask layerMask;
    public bool isGrounded;

    //移動速度を6
    public float moveSpeed = 6f;

    public float jumpForce = 10f;

    // Start is called before the first frame update
    void Start()
    {
        //rbにRigidbodyを取得
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {
        //左・右 * 移動スピード
        float x = Input.GetAxisRaw("Horizontal") * moveSpeed;
        //上・下 * 移動スピード
        float y = Input.GetAxisRaw("Vertical") * moveSpeed;

        isGrounded = Physics.CheckSphere(new Vector3(transform.position.x, transform.position.y - 1, transform.position.z), 0.4f, layerMask);

        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
        }

        Vector3 movePos = transform.right * x + transform.forward * y;
        Vector3 newMovePos = new Vector3(movePos.x, rb.velocity.y, movePos.z);

        rb.velocity = newMovePos;
    }
}

こちらが移動系スクリプトの全貌です。

ちなみにジャンプ機能としてisGroundedがオンならジャンプできると書いてありますが誤作動が多いので消してもらっても大丈夫です。

    public LayerMask layerMask;
    public bool isGrounded;
        isGrounded = Physics.CheckSphere(new Vector3(transform.position.x, transform.position.y - 1, transform.position.z), 0.4f, layerMask);

        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.velocity = new Vector3(rb.velocity.x, jumpForce, rb.velocity.z);
        }
    }
}

こちらのプログラムを消してもらえばジャンプ機能を消せます。

次に視点操作のスクリプトです。

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

public class PlayerLook : MonoBehaviour
{
    //プレイヤーの変数
    public Transform player;

    //マウス感度 Default 10f
    public float MouseSensitivity = 10f;

    //
    public float x = -0f;
    public float y = 0f;

    // Start is called before the first frame update
    void Start()
    {
        //マウスカーソルを中心に置き非表示にして動かなくする
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {
        //マウス感度 xは縦感度 yは横感度 x -=の"-"は視点操作を反転させるために付けている Time.deltaTimeをかける事によって時間を止めた時に視点も止めれる
        x -= Input.GetAxis("Mouse Y") * MouseSensitivity * Time.deltaTime;
        y += Input.GetAxis("Mouse X") * MouseSensitivity * Time.deltaTime;


        //縦感度を上下90度までにする
        x = Mathf.Clamp(x, -90f, 90f);

        //カメラの回転
        transform.localRotation = Quaternion.Euler(x, 0f, -0f);
        player.transform.localRotation = Quaternion.Euler(0f, y, 0f);


    }
}

こちらは簡単で特に凝ってません。強いて言えばClampを使いx軸を90度までしか回せなくしたりしただけです。

最後にPropHunt本体のスクリプトです。

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

public class PropHunt : MonoBehaviour
{
    public GameObject Tofu;
    public GameObject Test;
    // Start is called before the first frame update
    void Start()
    {
        //ここにセットしたPropに入れ替わる
        Test.SetActive(false);
        Tofu.SetActive(true);
    }

    void OnTriggerStay(Collider coll)
    {
        //接触しているオブジェクトのタグがTofuの時
        if (coll.gameObject.tag == "Tofu")
        {
            Debug.Log("1");
            //Eキーで入れ替わり
            if (Input.GetKeyDown(KeyCode.E))
            {
                Debug.Log("2");
                Tofu.SetActive(true);
                Test.SetActive(false);
            }
        }

        if (coll.gameObject.tag == "Test")
        {
            Debug.Log("3");
            if (Input.GetKeyDown(KeyCode.E))
            {
                Debug.Log("4");
                Tofu.SetActive(false);
                Test.SetActive(true);
            }
        }
    }

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

意外と短いです。Debug.Logは動作してるか確認してるだけなので消してもらっても問題ないです。

GameObjectがTofuと設定されてますがこれは豆腐のモデルを使いたかったのでTofuという名前に設定してます。

スクリプトアタッチ

それではスクリプトをアタッチしたいと思います。

まず空のGameObjectに移動系スクリプト(PlayerMove.cs)とPropHuntスクリプト(PropHunt.cs)をアタッチしてください。

そしてPropHuntスクリプトのTofuに一番最初に動かしたいオブジェクトをアタッチしてテストにEキーを押したときに変更したいオブジェクトをあたっちしましょう。

次にカメラには視点移動スクリプト(PlayerLook.cs)をアタッチしてください。感度はお好みで設定してください。

ボックスコライダー

トリガーを発動させるにはボックスコライダーが必要なので取り付けたいと思います。

まずはGameObjectにトリガーをオンにしたボックスコライダーを付けてください。

このボックスコライダーは自身の正面につけてこのボックスコライダーにTestというTagが付いてたオブジェクトが触れるとEキーが押せるようになりTestオブジェクトに入れ替わることが出来ます。

変更したいオブジェクト

こちらではクリック先のオブジェクトを作りたいと思います。

まず変更したいオブジェクトにタグをつけましょう。今回はTestというタグを付けます。

付けたら今回は書いてあるのでいいのですが別のタグを付けたい時は

if (coll.gameObject.tag == "Test") // ここのTestを付けたいタグ名に変更する
{
    Debug.Log("3");
    if (Input.GetKeyDown(KeyCode.E))
    {
       Debug.Log("4");
       Tofu.SetActive(false);
       Test.SetActive(true);       //ここのTest.SetActiveは(false)にして新しく付けたいタグ.SetActive(true)と設定する
    }
}

このように新しくif文を追加する必要があります。

まとめ

ちょっと文章では説明が難しく分かりずらいと思います。

一応質問などは時間があれば受け付けているのでTwitter@Makise29831までDM送ってもらえば返答したいと思います。気軽に送ってもらっても全然大丈夫です。

タイトルとURLをコピーしました