Help us understand the problem. What is going on with this article?

objectの移動(PositionとlocalPosition)

More than 3 years have passed since last update.

objectの移動(PositionとlocalPosition)

objectにアクセスするためには、
transform.XXXXを利用するのが簡単
transform リファレンス

様々な変数があるけど今回は、
移動部分について

  • position
  • localPosition

positionとlocalPosition

基本的な考え方は、positionは絶対座標軸上の座標値
localPositionは親オブジェクトとの相対座標値。

簡単な例だと。
unity上で図のように親子関係のオブジェクトを生成して
それぞれ、初期位置のpositionを指定する。

スクリーンショット 2016-08-21 22.27.35.png

親オブジェクト
#pragma strict
function Start () {
   // ピンクobjectの初期化
   transform.position = new Vector3( 0.0, 0.0, 0.0);
}
function Update () {
}
子オブジェクト
#pragma strict

function Start () {
   // 白objectの初期化
   transform.position = new Vector3( 5.0, 0.0, 0.0);
}

function Update () {

}

想定通り、以下の図のように配置されます。
ピンクのobjectの位置が(0.0,0.0,0.0)
白のobjectの位置が(5.0,0.0,0.0)

スクリーンショット 2016-08-21 22.29.43.png

ここで親オブジェクトの位置を変更します。
この時子オブジェクトの位置をupdateで更新するようにします。

そうしないと、おそらく初期化の順番が子オブジェクトから始まっているので、
親オブジェクトの更新に引っ張られて、想定通りに動いてくれません。。

親オブジェクト
#pragma strict
function Start () {
   // ピンクobjectの初期化
   transform.position = new Vector3( 0.0, 3.0, 0.0);
}
function Update () {
}
子オブジェクト
#pragma strict

function Start () {
}
function Update () {
 // 白objectの初期化
   transform.position = new Vector3( 5.0, 0.0, 0.0);
}

すると親オブジェクトだけがずれます。

スクリーンショット 2016-08-21 22.38.13.png

ここで、子オブジェクトを
positionからlocalPositionに変更してみます。

子オブジェクト
#pragma strict

function Start () {
}
function Update () {
 // 白objectの初期化
   transform.localPosition = new Vector3( 5.0, 0.0, 0.0);
}

子オブジェクトの位置が親オブジェクトからの相対座標の指定になったため、
親と同じように上にずれて表示される。

スクリーンショット 2016-08-21 22.39.56.png


まとめ

絶対座標軸上で移動させたい場合は、position
親オブジェクトに追従しながた移動させたい場合は localPosition

親オブジェクト
#pragma strict

function Start () {
   // ピンクobjectの初期化
   transform.position = new Vector3(0.0,3,0);

   Invoke("DelayMethod", 1.3f);
}

var x:boolean = true;
function Update () {


  if(x){
    transform.position = transform.position + new Vector3(0.1,0.0,0.0);
  }else{
    transform.position = transform.position + new Vector3(-0.1,0.0,0.0);
  }
}


function DelayMethod(){
  if(x){
    x = false;
  }else{
    x = true;
  }   
  Invoke("DelayMethod", 1.3f);
}
子オブジェクト
#pragma strict

function Start () {
   Invoke("DelayMethod", 1.0f);
}
var x:boolean = true;
function Update () {

  if(x){
    transform.localPosition = new Vector3(5.0,0,0);
  }else{
    transform.localPosition = new Vector3(-5.0,0,0);
  }
}

function DelayMethod(){
  if(x){
    x = false;
  }else{
    x = true;
  }   
  Invoke("DelayMethod", 1.0f);
}

子オブジェクトがlocalPositionで動くので、
親に追従しつつ親オブジェクトの左右に移動します。

player.gif

localPositionからPositionに変更すると。
親オブジェクトに関係なく、-5.0と5.0をウロウロするようになりる。

player.gif

_Nanagin
某一般業務系受託会社に勤めるサラリーマン よく忘れてしまうことをメモ代わりに書きなぐり [今の流行り] unityが面白いと言う噂を聞きつけ 地道に自己学習中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした