今回はスクリプトでオブジェクトの動きを制御する際のコードの書き方で分からなかった内容をメモしておきたいと思います。
オブジェクトを指定した座標に移動させたい場合のスクリプトの書き方のとして公式マニュアルの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 の後で実行されます。スクリプトリファレンス に次のように書かれています。
それでは、例えばY座標だけ連動させたい場合はどうしたらよいのか?
LateUpdate 処理の部分をちょっと改造してみましたが…
transform.position.y = target.position.position.y;
次のようにエラーがでてしまいます。
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