2012年09月15日

[Unity] ベルトコンベヤー上のオブジェクトの動きについて検証してみた

動くベルトコンベヤーの上にオブジェクトがあるとき、
ベルトコンベヤーの動きに合わせてオブジェクトも動かしたい。

さて、どうやったらいいんだろうと悩んでいたら、
Unity助け合い所にヒントが掲載されていたので検証してみました。

※課題は残っていますが、現状を残すということで記事にしました

まずは、ベルトコンベヤーを見立てたCubeを用意。
オブジェクトの名前は「BeltConveyor」にしました。
それから、BeltConveyor を動かすためのスクリプト(BeltConveyor_Controller.js)を用意して
適用しています↓

20120914beltconveyor001.png
BeltConveyor_Controller.js
------------------------------------------
function FixedUpdate () {
// x方向に揺れる
transform.localPosition.x = 3 * Mathf.Sin(Time.time);
}
------------------------------------------

次に、ベルトコンベヤーの上に2つのオブジェクトを置きます。

(1)rigidbodyを適用しただけのオブジェクト
 →名前は「CylinderOku」

20120914beltconveyor002.png

(2)rigidbodyとスクリプトを適用したオブジェクト
 →名前は「CylinderTemae」
 →移動させたときに倒れてしまわないように、Constraintsで回転に制限を加えました

20120914beltconveyor003.png

スクリプトを適用しない(1)では、ベルトコンベヤーのみが動いてオブジェクトは同じ位置に
静止し続けます。

ということで、(2)でスクリプト(Temae_Controller.js)を使うことでベルトコンベヤーの動きを
オブジェクトに伝えます。
このときに使うのが「transform.Translate()」。
第1引数 = ベルトコンベヤーの移動量
第2引数 = ベルトコンベヤーのtransform情報
Temae_Controller.js
------------------------------------------
#pragma strict

private var beltConveyor_Controller : BeltConveyor_Controller;

function Start() {
beltConveyor_Controller = GameObject.Find("BeltConveyor").GetComponent(BeltConveyor_Controller);
}

function FixedUpdate () {
// コンベヤーの移動量に合わせて移動させる
transform.Translate(beltConveyor_Controller.GetPositionDelta(),
beltConveyor_Controller.GetTransform());
}
------------------------------------------
transform.Translate()を使うために、オブジェクト(CylinderTemae)がベルトコンベヤーから
情報を取得するために「BeltConveyor_Controller」コンポーネントを使っています。

上記の第1引数、第2引数の情報を渡すために、BeltConveyor_Controller.js に手を加えます↓
BeltConveyor_Controller.js
------------------------------------------
private var prePosition : Vector3;

function Start() {
prePosition = transform.localPosition;
}

function FixedUpdate () {
// x方向に揺れる
transform.localPosition.x = 3 * Mathf.Sin(Time.time);
}

// コンベヤーのtransformを返す
function GetTransform() : Transform {
return transform;
}

// コンベヤーの移動量を返す
function GetPositionDelta() : Vector3 {
var answer : Vector3 = transform.localPosition - prePosition;
prePosition = transform.localPosition;
return answer;
}
------------------------------------------
これで準備完了です。
いざ実行!

手前のオブジェクトが・・・
20120914beltconveyor004.png

ベルトコンベヤーに合わせて動いた!
20120914beltconveyor005.png

これで解決!
と思いきや、適当にプレイヤーを用意して固定した床からベルトコンベヤーに乗ってみたら、
ベルトコンベヤーと一緒に動きはしたものの、乗った瞬間に瞬間移動してしまいました。

次はこの問題を解決しないとー。
transform.Translate()の使い方に問題があるのか、それ以前に原因があるのか、調べてみます。
posted by be-style at 03:42| Comment(0) | Unity
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]