親と子
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 24/67。
Hierarchyでは、オブジェクトを別のオブジェクトにドラッグすると、そのオブジェクトの子になり、親の下にインデントして表示されます。子は親と一緒に移動、回転、拡大縮小します。親を動かすと、子もすべて一緒についてきます。子にコードを書く必要はありません。
Unityは、子の位置を親からの相対位置として保持します。transform.localPositionは親から測ったそのオフセットで、transform.positionはワールド座標での位置です。このRiderはHorseの子で、スクリプトによって、Horseがどこにいても、その中心から1単位上、半単位後ろに配置されます。
void Start()
{
transform.localPosition = new Vector3(0, 1, -0.5f);
}Horseが(4, 0.5, 2)にいるとき、Riderのpositionは(4, 1.5, 1.5)になりますが、localPositionは(0, 1, -0.5)のままです。Horseが歩いて進むと、positionは変化しますが、localPositionは変化しません。オフセットは親自身の軸に沿って測定されるため、親が回転したり拡大縮小されたりすると、オフセットも一緒に回転し、拡大縮小されます。親を持たないオブジェクトでは、localPositionとpositionは同じです。
チャレンジ
中級Flag は Ship の子オブジェクトで、ship はワールドの中心にありません。flag の Start() は、ship を基準に右へ 0.6、上へ 1 の位置にあるマストの根元に置くことを意味しますが、これらの数値を position に書き込むため、flag は ship から離れた位置に配置されます。
- flag がマストの根元から始まるように
Start()を修正します。 - 上矢印を押している間、flag を巻き上げます。ship を基準にした高さがマストの頂上である 4 に達するまで、毎秒
climb単位で上昇し、そこで止まります。
Play を押し、上矢印を押したままにしてから、Check を押します。
自分で試してみよう
using UnityEngine;
public class Hoist : MonoBehaviour
{
public float climb = 1f;
void Start()
{
// マストの根元:Shipを基準に右へ0.6、上へ1
transform.position = new Vector3(0.6f, 1, 0);
}
void Update()
{
// 上矢印キーが押されている間、Shipからの高さが4になるまで上昇する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。