GameObjectを円運動させたいケースがあります。円運動としては、数学的に sin, cos の三角関数を使うか、あるいは角度として0 -> 360°の変化から実現する方法があります。
円運動
円柱、Cylinder の周りを球体、Sphere が回転運動をするように作成してみますので、それぞれオブジェクトを作ります。
Rigidbody.MovePosition
MovePosition(Vector3 position) を使ってオブジェクトを移動させます。その移動位置と時間Time.timeで変化させて sin, cos を使い円運動をさせます。
Circle1.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Circle1 : MonoBehaviour { public Rigidbody rbody; private float speed; private float radius; private float yPosition; // Use this for initialization void Start () { speed = 1.0f; radius = 2.0f; yPosition = 0.5f; } // Update is called once per frame void Update () { rbody.MovePosition( new Vector3( radius * Mathf.Sin(Time.time * speed), yPosition, radius * Mathf.Cos(Time.time * speed) ) ); } } |
スクリプトをSphereにドラッグ&ドロップ
SphereのComponentのRigidbodyを設定します
SphereのinspectorにScriptとRigidbodyが追加されました。
Rigidbody の interpolation (補間)設定するとよりスムーズな描画となります。
Use Gravityのチェックは外しておきます。
ScriptのRbodyはSphereをドラッグして設定します。
これでGameでrunさせると球体が円柱を回りだします。
Transform.position
ワールド空間の Transform の位置を設定します。
位置を時間で変化させsin,cosで円運動させるところはMovePositionと同じです。
Circle2.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Circle2 : MonoBehaviour { private float speed; private float radius; private float yPosition; float x; float y; float z; // Use this for initialization void Start () { speed = 1.0f; radius = 2.0f; yPosition = 0.5f; } // Update is called once per frame void Update () { x = radius * Mathf.Sin (Time.time * speed); y = yPosition; z = radius * Mathf.Cos (Time.time * speed); transform.position = new Vector3 (x, y, z); } } |
このスクリプトをSphereに入れます。
前のCircle1のスクリプトのチェックを外して実行させると円運動が始まります。
Transform.RotateAround
ワールド座標の point を中心とした軸( axis )で angle 度回転させます。つまりCylinderを軸に回転させるわけです。
Circle3.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Circle3 : MonoBehaviour { public GameObject gObject; private float speed; // Use this for initialization void Start () { speed = 2.0f; } // Update is called once per frame void Update () { transform.RotateAround (gObject.transform.position, Vector3.up, speed); } } |
このスクリプトをSphereに入れて、今までの2つのスクリプトのチェックを外し、軸とするCylinderをGameObject gObject(G Objet) に設定すればSphereをCylinderの周りを回るようにできます。
References:
Unity – Scripting API: Rigidbody.MovePosition
Unity – Scripting API: Transform.position – Unity – Manual
Unity – Scripting API: Transform.RotateAround