Unity:オブジェクトを別オブジェクトの特定の座標軸だけに連動させる

今回はスクリプトでオブジェクトの動きを制御する際のコードの書き方で分からなかった内容をメモしておきたいと思います。

公式マニュアルに書かれているTransform.positionの例

オブジェクトを指定した座標に移動させたい場合のスクリプトの書き方のとして公式マニュアルのTransform.position – Unity スクリプトリファレンス では例としてこのようなコードが掲載されています。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Example() {
        transform.position = new Vector3(0, 0, 0);
        print(transform.position.x);
    }
}

オブジェクトを別オブジェクトの座標を参照して連動させる方法を考える

AとBの2つのオブジェクトがあった場合、動きを連動させる一番簡単な方法は[Hierarchy]ウィンドウで親子関係にすればOKですね。

これをスクリプトで制御する場合どのようにしたら良いのか?調べていたら、実はスタンダードアセットの中にスクリプトが用意されていました。
メニュー:Assets > Import Package > Utility を選択。
ファイルのインポートが終わったら、[Project]ウィンドウ > Standard Assets > Utility > FollowTarget を確認します。

このスクリプトを追従させたいオブジェクトに割り当てます。[Inspector]ウィンドウで見るとこのように参照するオブジェクトとXYZ軸別々にオフセット値を設定できるようになっています。

スクリプトコードのは次のようになっています。

using System;
using UnityEngine;

namespace UnityStandardAssets.Utility
{
    public class FollowTarget : MonoBehaviour
    {
        public Transform target;
        public Vector3 offset = new Vector3(0f, 7.5f, 0f);

        private void LateUpdate()
        {
            transform.position = target.position + offset;
        }
    }
}

スクリプトの中で使用されている LateUpdate は 通常の Update の後で実行されます。スクリプトリファレンス に次のように書かれています。

LateUpdate: LateUpdate は Update 終了後に、各フレームにつき一度呼び出されます。Update で実行される計算は、LateUpdate が始まる前に完了します。

オブジェクトを別オブジェクトの特定の軸方向にだけ連動させる場合

それでは、例えばY座標だけ連動させたい場合はどうしたらよいのか?
LateUpdate 処理の部分をちょっと改造してみましたが…

transform.position.y = target.position.position.y;

次のようにエラーがでてしまいます。

Cannot modify a value type return value of `UnityEngine.Transform.position’. Consider storing the value in a temporary variable

UnityEngine.Transform.position の値型の戻り値を変更することはできません。 値を一時変数に格納することを検討してください。

というわけで、エラーメッセージに従って一時的に変数に格納。最終的にコードはこのようになりました。

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

public class Script_20180414 : MonoBehaviour
{
    // ターゲットオブジェクトの Transform を格納する変数
    public Transform target;
    // ターゲットオブジェクトの座標からオフセットする値
    public float offset;

    // ゲーム実行中の処理(Update処理後)
    private void LateUpdate()
    {
        // オブジェクトの座標を変数 pos に格納
        Vector3 pos = transform.position;
        // ターゲットオブジェクトのY座標に変数 offset のオフセット値を加えて
        // 変数 posのY座標に代入
        pos.y = target.position.y + offset;
        // 変数 pos の値をオブジェクト座標に格納
        transform.position = pos;
    }
}

このように特定の座標値のみを変更するにはいったん仮の変数を使って値を受渡しするようです。

参考サイト

今回はこちらの記事を参考させていただきました。
[Unity]オブジェクトの座標の取得と変更 – Qiita

座標取得しようとしたら、うまくいかなかったのでその方法をメモ#環境・Unity 5.4.0f3#コードGameObject.Find("hogehoge").transform.positi…
スポンサーリンク
スポンサーリンク

スポンサーリンク

フォローする