Unity C#でドラッグしたオブジェクトを離すと所定の位置、枠にピッタリ収まるようにする方法

incense IT

脱出ゲームとかでアイテムを動かしたりする時に役立ちそうな「ドラッグアンドドロップしたものがぴったり所定の位置に収まる」スクリプトです。UI廻りの実装なので、シミュレーションやアドベンチャーなどでも色々応用がきくかと思います。

スポンサーリンク

作りたいもの

drag set1
ドラッグで動かしたオブジェクトを、
drag set unity 1
枠の上でドロップすると、枠の中の決まった場所にぴったり収まる、というものを作ります。

枠の作成

drag set unity 2
まずは枠を好きな位置に置き、最初からコライダー⁺リジッドボディを持つオブジェクトと接触しないようしておきます。
drag set unity 3
枠にBoxコライダーを追加し、トリガーをONにします。
レイヤーの順序は乗っけるオブジェクトより下にしておきます。

スクリプトの作成

drag set unity 6
オブジェクトのほうではフラグをひとつ追加し、OnMouseUpで「マウスを離した時」の挙動を追加します。
//Unity C#
//クラス名.変数を他のクラスから参照する点に注意
public class CatDrag: MonoBehaviour
{
  //ボックスの中にオブジェクトを吸い込んでいい時はFalse
    public static bool boxFlag;

    void OnMouseDrag()
    {
    //ドラッグ中は吸い込んではだめ
        boxFlag = true;
        //以下四行はドラッグした時にオブジェクトを動かすコード
        Vector3 thisPosition = Input.mousePosition;
        Vector3 worldPosition = Camera.main.ScreenToWorldPoint(thisPosition);
        worldPosition.z = 0f;
        this.transform.position = worldPosition;
    }

    void OnMouseUp()
    {
    //ドラッグ終了、吸い込んでよし
        boxFlag = false;
    }

}
drag set unity 2
ボックスのほうでもスクリプトをアタッチし、OnTriggerStay2Dでトリガーに他のオブジェクトが接した時の処理を実装します。
//Unity C#

  //トリガーに他のオブジェクトが接している間は処理を繰り返し実行
    void OnTriggerStay2D(Collider2D other)
    {
    //ドラッグしてない時は
        if (CatDrag.boxFlag == false)
        {
      //吸い込む(位置を合わせる)
            other.transform.position = this.transform.position;
      //吸い込み終わったらフラグ解放
            CatDrag.boxFlag = true;
        }
    }
drag setc
実行すると、狙った通りの挙動をすることが確認できます。

おまけ

drag setc2
枠のトリガーをOFFにすると、ドラッグをやめたとたんに枠から追い出されるスクリプトになります。これはこれで結構面白い動きだと思います。
やりたいことから逆引きするUNITYの使い方まとめ
Unityをやりたいことから学習していけるよう、機能・用途別にまとめたページです。C#の命令別の逆引きは現時点で作っていません。2019の時期に書き始めているので、それより前のバージョンについては言及しません。

コメント