Unityでオブジェクトを移動させる最も基本的な方法は、transform.positionプロパティを使用することです。このプロパティを変更することで、オブジェクトの位置を直接指定できます。
例えば、以下のコードでオブジェクトを(5, 0, 0)の位置に移動させることができます:
transform.position = new Vector3(5, 0, 0)
また、現在の位置から相対的に移動させたい場合は、以下のように記述できます:
transform.position += new Vector3(1, 0, 0) // X軸方向に1単位移動
transform.positionを使用する際の注意点として、物理演算を無視した座標の変更になるため、Rigidbodyコンポーネントを持つオブジェクトの場合は不自然な動きになる可能性があります。
transform.positionの詳細な使用方法については、以下のUnity公式ドキュメントを参照してください。
Unity公式ドキュメント - Transform.position
Unityでオブジェクトを移動させる際、ワールド座標とローカル座標の違いを理解することが重要です。
• ワールド座標:シーン全体の原点(0, 0, 0)を基準とした絶対的な座標系
• ローカル座標:親オブジェクトの位置を基準とした相対的な座標系
例えば、親オブジェクトが(10, 0, 0)の位置にあり、子オブジェクトのローカル座標が(5, 0, 0)の場合、子オブジェクトのワールド座標は(15, 0, 0)になります。
ワールド座標とローカル座標の変換には、以下のメソッドが使用できます:
• TransformPoint:ローカル座標をワールド座標に変換
• InverseTransformPoint:ワールド座標をローカル座標に変換
これらの座標系の違いを理解することで、複雑な階層構造を持つオブジェクトの移動をより正確に制御できます。
ワールド座標とローカル座標の詳細な説明については、以下の記事が参考になります。
【Unity】ワールド座標(グローバル座標)・ローカル座標とは
Transform.Translate関数は、オブジェクトを現在の位置から相対的に移動させるのに適しています。この関数を使用すると、オブジェクトの向きに応じた移動が可能になります。
基本的な使用方法は以下の通りです:
transform.Translate(Vector3.forward * Time.deltaTime)
この例では、オブジェクトが前方に毎秒1単位の速度で移動します。Time.deltaTimeを乗算することで、フレームレートに依存しない一定の速度を維持できます。
Translate関数の特徴的な使用方法として、ローカル空間とワールド空間を指定できる点があります:
transform.Translate(Vector3.up, Space.World)
この例では、オブジェクトの回転に関係なく、ワールド空間の上方向に移動します。
また、あまり知られていない技として、Translate関数を使用して曲線的な動きを作成することも可能です:
float t = Time.time
Vector3 offset = new Vector3(Mathf.Sin(t), Mathf.Cos(t), 0) * radius
transform.Translate(offset * Time.deltaTime)
この例では、オブジェクトが円を描くように移動します。
Translate関数の詳細な使用方法については、以下のUnity公式ドキュメントを参照してください。
Unity公式ドキュメント - Transform.Translate
Rigidbodyコンポーネントを持つオブジェクトを移動させる場合、物理演算を考慮する必要があります。transform.positionを直接変更するのではなく、Rigidbodyの関数を使用することが推奨されます。
主な移動方法は以下の通りです:
• AddForce:オブジェクトに力を加えて移動させる
• MovePosition:物理演算を考慮しつつ、指定した位置に移動させる
• velocity:オブジェクトの速度を直接設定する
例えば、AddForceを使用してオブジェクトを移動させる場合:
Rigidbody rb = GetComponentrb.AddForce(Vector3.forward * 10)
この例では、オブジェクトに前方向の力を加えています。
ovePositionを使用する場合:
Vector3 newPosition = transform.position + Vector3.forward * Time.deltaTime
rb.MovePosition(newPosition)
この方法では、物理演算を考慮しつつ、スムーズな移動が可能です。
velocityを直接設定する場合:
rb.velocity = Vector3.forward * 5
この方法は即座に速度を変更できますが、非現実的な動きになる可能性があるため、慎重に使用する必要があります。
Rigidbodyを使用したオブジェクトの移動については、以下の記事が詳しく解説しています。
【Unity入門】Rigidbodyで自在に移動!velocityの活用方法!
Unityでは、オブジェクト間の親子関係を利用して、相対的な移動を実現することができます。この方法は、複雑な階層構造を持つオブジェクトの移動に特に有効です。
親子関係を利用した移動の特徴:
• 子オブジェクトは親オブジェクトの動きに追従する
• 子オブジェクトのローカル座標は親オブジェクトを基準とする
• 親オブジェクトを回転させると、子オブジェクトも一緒に回転する
例えば、プレイヤーキャラクターが持つ武器を移動させる場合:
public class WeaponController : MonoBehaviour
{
public Transform parentTransform
void Update()
{
transform.localPosition = Vector3.up * 0.5f // 親オブジェクトの0.5単位上に配置
}
}
この例では、武器オブジェクトがプレイヤーキャラクターの上方0.5単位の位置に常に配置されます。
親子関係を動的に変更することで、オブジェクトの相対的な位置を柔軟に制御することも可能です:
public void AttachToParent(Transform newParent)
{
transform.SetParent(newParent)
transform.localPosition = Vector3.zero
transform.localRotation = Quaternion.identity
}
この関数を使用することで、オブジェクトを新しい親オブジェクトにアタッチし、その親を基準とした位置にリセットすることができます。
親子関係を利用したオブジェクトの移動について、より詳細な情報は以下の記事で確認できます。
VRChat初心者に贈る、Unityの親子関係・階層について
以上、Unityでのオブジェクト移動方法について、基本的な手法から応用テクニックまで幅広く解説しました。これらの方法を適切に組み合わせることで、より自然で柔軟なオブジェクトの動きを実現することができます。ゲームの要件や対象オブジェクトの特性に応じて、最適な移動方法を選択することが重要です。
マンガでわかる Unityゲーム開発入門
↑
実は、こちらの本はamazonのkindleアンリミテッドでタダで読めます。
でもそれ以外の分厚いUnity本は、アンリミテッドの対象外。良いのはわかるけど、高い!
そこで、2,550円引きでほしいUnity本をゲットする方法です。
この方法だと、完全に0円でゲットできます。
定価2,520円の本に2,550円割引が効く=0円です。
やり方
↓
DMMブックスのクーポンと特典を併用します。
実は、DMMブックスは利用者を増やすために初回90%オフ(最大2,000円引き)のクーポンを配ってます。初回利用なら、誰でも使えます。
さらに、DMMプレミアムという動画サブスクを無料お試しすると、こちらも特典として550ポイント(550円相当)もらえるんですね。
クーポンと特典合わせて2,550円引きでUnity本が買えるというわけ。
詳しくはこちらの記事にまとめました。