ファイブボックス一分間Unity講座、主にUnityに初めて触れる方や、初めて間もない方向けのステップアップ講座です。
ファイブボックス公式Youtube「Unityマニア」の「1分間Unity講座」の記事の詳細説明になります。
「1分間Unity講座 座標を更新する方法」では Transformコンポーネントの position プロパティを更新することで、オブジェクトの座標を更新しました。
今回は Transformコンポーネントが持つ Translate() というメソッドを活用して座標を更新する方法ご紹介します。
ローカル空間に対する動き
まずはオブジェクトが持つローカル空間に対する移動です。
Transformコンポーネントの positionプロパティ を更新するのと同じ効果があります。
void FixedUpdate()
{
//上矢印キーが押されたら
if (Input.GetKey(KeyCode.UpArrow))
{
//上方向に 0.1の速さで進む
transform.Translate(transform.up * 0.1f);
}
//下矢印キーが押されたら
if (Input.GetKey(KeyCode.DownArrow))
{
//上方向に -0.01の速さで進む
transform.Translate(-transform.up * 0.1f);
}
//Dキーが押されたら
if (Input.GetKey(KeyCode.D))
{
//右方向に 0.01の速さで進む
transform.Translate(transform.right * 0.1f);
}
//Aキーが押されたら
if (Input.GetKey(KeyCode.A))
{
//右方向に -0.01の速さで進む
transform.Translate(-transform.right * 0.1f);
}
//Wキーが押されたら
if (Input.GetKey(KeyCode.W))
{
//前方向に 0.01の速さで進む
transform.Translate(transform.forword * 0.1f);
}
//Sキーが押されたら
if (Input.GetKey(KeyCode.S))
{
//前方向に -0.01の速さで進む
transform.Translate(-transform.forword * 0.1f);
}
}
Translate()メソッドは、最終引数でワールド空間、またはローカル空間に対する命令なのかを指定することが出来ます。
ローカル空間を指定する場合は Space.Self と指定します。
例えば下の図のように、オブジェクトをZ軸中心に45度傾けた状態で上矢印キーをおすと、45度傾いたオブジェクトの上方向(ワールド空間では斜め上方向)に移動します。
void FixedUpdate()
{
//上矢印キーが押されたら
if (Input.GetKey(KeyCode.UpArrow))
{
//上方向に 0.1の速さで進む
transform.Translate(0, 0.1f, 0, Space.Self);
}
//下矢印キーが押されたら
if (Input.GetKey(KeyCode.DownArrow))
{
//上方向に -0.01の速さで進む
transform.Translate(0, -0.1f, 0, Space.Self);
}
//Dキーが押されたら
if (Input.GetKey(KeyCode.D))
{
//右方向に 0.01の速さで進む
transform.Translate(0.1f, 0, 0, Space.Self);
}
//Aキーが押されたら
if (Input.GetKey(KeyCode.A))
{
//右方向に -0.01の速さで進む
transform.Translate(-0.1f, 0, 0, Space.Self);
}
//Wキーが押されたら
if (Input.GetKey(KeyCode.W))
{
//前方向に 0.01の速さで進む
transform.Translate(0, 0, 0.1f, Space.Self);
}
//Sキーが押されたら
if (Input.GetKey(KeyCode.S))
{
//前方向に -0.01の速さで進む
transform.Translate(0, 0, -0.1f, Space.Self);
}
}
ワールド空間に対する動き
ワールド空間に対する記述方法も同じです。
このケースではキャラクターが傾いていた場合、X,Y,Z軸は常に固定され、ワールド空間に対するX軸方向、Y軸方向、Z軸方向となります。
void FixedUpdate()
{
//上矢印キーが押されたら
if (Input.GetKey(KeyCode.UpArrow))
{
//上方向に 0.1の速さで進む
transform.Translate(Vector3.up * 0.1f);
}
//下矢印キーが押されたら
if (Input.GetKey(KeyCode.DownArrow))
{
//上方向に -0.01の速さで進む
transform.Translate(-Vector3.up * 0.1f);
}
//Dキーが押されたら
if (Input.GetKey(KeyCode.D))
{
//右方向に 0.01の速さで進む
transform.Translate(Vector3.right * 0.1f);
}
//Aキーが押されたら
if (Input.GetKey(KeyCode.A))
{
//右方向に -0.01の速さで進む
transform.Translate(-Vector3.right * 0.1f);
}
//Wキーが押されたら
if (Input.GetKey(KeyCode.W))
{
//前方向に 0.01の速さで進む
transform.Translate(Vector3.forword * 0.1f);
}
//Sキーが押されたら
if (Input.GetKey(KeyCode.S))
{
//前方向に -0.01の速さで進む
transform.Translate(-Vector3.forword * 0.1f);
}
}
ワールド空間の移動を指定する場合は、最終引数に Space.World と指定します。
void FixedUpdate()
{
//上矢印キーが押されたら
if (Input.GetKey(KeyCode.UpArrow))
{
//上方向に 0.1の速さで進む
transform.Translate(0, 0.1f, 0, Space.World);
}
//下矢印キーが押されたら
if (Input.GetKey(KeyCode.DownArrow))
{
//上方向に -0.01の速さで進む
transform.Translate(0, -0.1f, 0, Space.World);
}
//Dキーが押されたら
if (Input.GetKey(KeyCode.D))
{
//右方向に 0.01の速さで進む
transform.Translate(0.1f, 0, 0, Space.World);
}
//Aキーが押されたら
if (Input.GetKey(KeyCode.A))
{
//右方向に -0.01の速さで進む
transform.Translate(-0.1f, 0, 0, Space.World);
}
//Wキーが押されたら
if (Input.GetKey(KeyCode.W))
{
//前方向に 0.01の速さで進む
transform.Translate(0, 0, 0.1f, Space.World);
}
//Sキーが押されたら
if (Input.GetKey(KeyCode.S))
{
//前方向に -0.01の速さで進む
transform.Translate(0, 0, -0.1f, Space.World);
}
}
活用シーンのまとめ
Transformコンポーネントの座標を更新し、移動する方法を2つご紹介しました。
通常の移動では、
transform.position += transform.right 0.01f;
transform.Translate(transform.right 0.01f);
上の2つの動きは同じです。しかし、特定のケースでワールド空間での移動を明示的に行いたい場合は、transform.Translateメソッドが便利です。
ファイブボックスでは、Unityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
Comments