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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

参考サイト

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