スポンサーリンク
スポンサーリンク
UnityUnityメモ

Unity他のオブジェクトに触れたらプレーヤー操作を無効にする方法

Unity

はじめに

ユニティーでオブジェクトにぶつかったときにプレーヤー操作が無効になるスクリプトの作り方を解説します。このシンプルなチュートリアルでは、往復しているCubeにSphere(プレーヤー)が触れたときに、プレーヤーの操作が無効になる方法を説明します。

ステップ1:オブジェクトの準備

まずはUnityエディタで、プレーヤーになるSphereオブジェクトと、障害物になるCubeオブジェクトを作成しましょう。

  1. Cubeの配置
    • ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」を選びます。
    • Cubeを往復するようにアニメーションやスクリプトを設定します(ここでは省略します)。
  2. Sphereの配置
    • ヒエラルキーウィンドウで右クリックし、「3D Object」→「Sphere」を選びます。
    • インスペクター画面のAddComponentから「Rigidbody」コンポーネントを検索して追加します。
    • SphereColiderのistriggerにチェックを入れます。
    • Sphereがプレーヤーとなります。

ステップ2:スクリプトの作成

次に、Cubeがシーン内を往復するスクリプトと Sphereを操作をするスクリプトを作成します。

  1. スクリプトの作成
    • プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選び、2つのスクリプトを作成ます。
    • スクリプトの名前を「CubeMove」と「SphereMove」にします。
  2. スクリプトの編集
    • 以下のコードをスクリプトに追加します:

Cubeにアタッチするスクリプト

スクリプトの動作説明

  1. カウンターと移動量の初期化
    • int counter = 0;
    • float move = 0.05f;
    • counterはオブジェクトが移動するフレーム数を数えます。
    • moveはオブジェクトが毎フレーム移動する距離です。
  2. Updateメソッド
    • 毎フレーム実行されるメソッドです。
    • Vector3 p = new Vector3(0, 0, move); で新しいベクトルを作成し、オブジェクトをZ方向にmove分だけ移動させます。
    • transform.Translate(p); で作成したベクトル分だけオブジェクトを移動させます。
    • counter++ でカウンターを1増やします。
  3. カウンターのチェック
    • if (counter == 100) でカウンターが100に達したら以下の処理を行います。
      • counter = 0; でカウンターをリセットします。
      • move *= -1; で移動方向を反転させます。
using UnityEngine;

public class CubeMove : MonoBehaviour
{
    int counter = 0;
    float move = 0.05f;

    void Update()
    {
        Vector3 p = new Vector3(0, 0, move);
        transform.Translate(p);
        counter++;

        if (counter == 100)
        {
            counter = 0;
            move *= -1;
        }
    }
}

Sphereにアタッチするスクリプト

スクリプトの動作説明

  1. 変数の宣言
    • public bool isTouch;
    • スフィアが他のオブジェクトに触れたかどうかを判定するためのフラグです。
  2. Startメソッド
    • スクリプトが初めて実行された時に呼ばれます。
    • isTouch = false;
    • 初期状態では他のオブジェクトに触れていないため、isTouchfalseに設定します。
  3. Updateメソッド
    • 毎フレーム実行されるメソッドです。
    • if (!isTouch) で、他のオブジェクトに触れていない場合に以下の処理を行います。
      • float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
      • float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;
      • 矢印キーの入力を取得し、時間経過に応じた移動量を計算します。
      • transform.position = new Vector3(transform.position.x + dx, 0, transform.position.z + dz);
      • 計算した移動量を使ってスフィアの位置を更新します。
  4. OnTriggerEnterメソッド
    • 他のオブジェクトに触れた時に呼ばれるメソッドです。
    • if (other.gameObject.name == "Cube")
    • 触れたオブジェクトが「Cube」の場合、isTouchtrueに設定します。
using UnityEngine;

public class SphereMove : MonoBehaviour
{
    public bool isTouch;

    void Start()
    {
        isTouch = false;
    }

    void Update()
    {
        if (!isTouch)
        {
            float dx = Input.GetAxis("Horizontal") * Time.deltaTime * 3;
            float dz = Input.GetAxis("Vertical") * Time.deltaTime * 3;
            transform.position = new Vector3(transform.position.x + dx, 0, transform.position.z + dz);
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "Cube")
        {
            isTouch = true;
       Debug.Log("操作不可になりました");   
        }
    }
}

ステップ3:スクリプトをアタッチ

作成したスクリプトをSphereとCubeにアタッチします。

  1. スクリプトのアタッチ
    • ヒエラルキーウィンドウでオブジェクトを選択します。
    • プロジェクトウィンドウからスクリプトをドラッグし、インスペクターウィンドウにドロップします。

テストプレイ

これで、往復するCubeにSphereが触れた際に操作が無効になる設定が完成です。シーンで実行して確認してみてください!

おすすめのアセット

60 Games Bundleは、パズル、カジュアル、レトロ、サバイバル、プラットフォーマー、アドベンチャーなど、様々なジャンルのゲームを収録した豪華なアセットパックです。ゲーム開発初心者から経験者まで、誰でも利用できる内容となっています。

このバンドルの特徴は、60種類ものゲームが含まれており、それぞれがすぐにプレイ可能な完全なプロジェクトファイルとなっていることです。各ゲームにはカスタマイズ可能なスクリプトとアートアセットが付属しており、自分だけのゲームを作り上げることができます。また、Unityの最新バージョンにも対応しており、簡単にインポートして利用可能です。

スポンサーリンク
C-BA memo
タイトルとURLをコピーしました