本日は MRTK の小ネタ枠です。
MRTKのObjectManipulatorでオブジェクトを時計の針のように回転させる方法を記事にします。
前提条件
以下の前回記事の続きです。
bluebirdofoz.hatenablog.com
時計回りに回転するオブジェクトの作成
ObjectManipulator の移動を円状に固定する制約はないので、ObjectManipulator を追って回転するオブジェクトを作成します。
LookAt を使って常に指定オブジェクトの方向を向くスクリプトを作成しました。
・LookAtObject.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LookAtObject : MonoBehaviour { [SerializeField, Tooltip("LookAt対象トランスフォーム")] private Transform p_LookAtTransform; // Start is called before the first frame update void Start() { } void Update() { if(p_LookAtTransform != null) { // 常に対象トランスフォームの方向を向く this.transform.LookAt(p_LookAtTransform); } } }
前回のプロジェクトに新たに時計の針オブジェクトを作成します。
軸オブジェクトにスクリプトをアタッチします。
LookAt の向き先に ObjectManipulator のオブジェクトを指定します。
動作確認
シーンを再生して動作を確認します。
ObjectManipulator のオブジェクトの動きに合わせて時計の針が回転するように動きます。
ObjectManipulatorの見た目と当たり判定を別にする
より時計の針を掴んで動かしている見た目にする場合は、ObjectManipulator のオブジェクトの見た目と掴み判定を別々にします。
以下の通り、見た目の掴み位置を時計の針オブジェクトの子オブジェクトにして先端部分に重ねました。
ObjectManipulator のオブジェクトは実際には自由に動いてしまうので、手を離したときに見た目の位置に戻るようリセット用スクリプトを作成します。
・ResetTransform.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResetTransform : MonoBehaviour { public void ResetTransformPositionAndRotate(Transform p_TargetTransform) { this.transform.position = p_TargetTransform.position; } }
作成したスクリプトを ObjectManipulator のオブジェクトに設定し、手を離したときに位置を戻すイベントを登録します。
動作確認
シーンを再生して動作を確認します。
時計の針の先のオブジェクトを掴んで動かしているような見た目で、オブジェクトを回転させることができました。