オブジェクトを移動する方法。位置変更や速度を追加【Unityゲーム制作】

今回は画像(オブジェクト)を移動する方法のメモ。一言で言うと「クリックしたものを動かす」です。とはいえ、移動の仕方や実装方法はいろいろあります。

画像を移動(位置変更)

まずは瞬間移動のような移動方法ですね。左にあった画像をクリックすると右に移る方法です。移動というよりは位置(場所)変更という感じですね。

スクリプト無しで移動

まずはスクリプト無しでイベントトリガーで処理する方法。「元の場所にあったものを消して、移動後の場所を表示させています」

移動前の位置、移動後の位置に画像(オブジェクト)を用意。移動前のオブジェクトだけを有効にして、クリックしたら移動後のオブジェクトを有効にして、移動前のオブジェクトを無効にすると実装できます。

これでも実装できますが、同じものを2つ用意するので微妙な方法ですね。

画像の位置変更をスクリプトで処理

次にスクリプトで実装。新規でスクリプトを作成。

下記のように変更。ローカルポジション(オブジェクト位置)をセットしているだけです。

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

public class MoveScript : MonoBehaviour
{
    public GameObject objSign;

    public void MoveSign()
    {
        objSign.transform.localPosition = new Vector2(500, 0);
    }
}

追加した関数を画像をクリックしたら実行するように設定。これでOK。

スクリプトで実装するのが現実的ですかね。移動後の場所を直接数値で500と入力していますが、実際にはpublic変数にしたりとか変更のしやすさを考えてもいいかもですね。

移動している感を出す移動

次は動いてる感を出す方法です。移動と言えばこちらですかね。

2Dリジッドボディを使う方法

まずはコンポーネントの追加で2Dリジッドボディを追加します。追加したら重力スケールを0に。

次にスクリプトを追加して、下記のようにします。

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

public class MoveScript : MonoBehaviour
{
    public Rigidbody2D rbSign;
    public float Speed;

    public void MoveSign()
    {
        Vector2 v = new Vector2(Speed, 0);
        GetComponent<Rigidbody2D>().velocity = v;
    }
}

velocityは速度ですね。これでクリックしたら変数にセットした速度で動くようになります。

試しに「再生」してみます。上手く動きますが、このままだと動き続けて止まらないので止まるようにします。

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

public class MoveScript : MonoBehaviour
{
    public Rigidbody2D rbSign;
    public float Speed;
    public float MoveTime;

    public void MoveSign()
    {
        Vector2 v = new Vector2(Speed, 0);
        GetComponent<Rigidbody2D>().velocity = v;
        Invoke("Stop",MoveTime);
    }
    private void Stop()
    {
        Vector2 v = new Vector2(0, 0);
        GetComponent<Rigidbody2D>().velocity = v;
    }
}

Invokeは遅延関数って感じですね、指定した時間(秒数)が過ぎてから実行されます。この場合、クリックしたら画像が動き、MoveTimeで指定した秒数が過ぎてたら止まるという感じです。

適当に数値を設定して動作確認。いい感じに動いて止まればOK。

再帰呼び出しを使う方法

次に2Dリジッドボディを使わず、スクリプトで細かく連続で場所を移動して、動いている風にする方法です。スクリプトを下記のようにします。

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

public class MoveScript : MonoBehaviour
{
    public GameObject objSign;
    private float sPos;

    public void MoveSign()
    {
        sPos = objSign.transform.localPosition.x;
        PosMove();
    }

    private void PosMove()
    {
        if(sPos <=500)
        {
            sPos += 0.5f;
            objSign.transform.localPosition = new Vector2(sPos, 0);
            Invoke("PosMove", 0.01f);
        }
    }
}

これは0.01秒ごとに少しづつ位置をずらしています。厳密に言うと移動ではなく、細かく場所を動かして移動している風に見せる方法ですね。動かす関数内でInvoke関数を使って、再度動かす関数を呼び出す、再帰呼び出しをしています。

2Dリジッドボディのコンポーネントを削除して、下記のようにイベントトリガーをセットすれば完了。

他にも動かし方は色々。何をどう動かすかによって当然、実装方法も変わってきますよね。「画像」という観点で見ると位置をずらすのもOKな気も。物体を動かすのなら速度を持たせた方が自然と言えば自然ですかね。

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