ベルトコンベヤーの動きに合わせてオブジェクトも動かしたい。
さて、どうやったらいいんだろうと悩んでいたら、
Unity助け合い所にヒントが掲載されていたので検証してみました。
※課題は残っていますが、現状を残すということで記事にしました
まずは、ベルトコンベヤーを見立てたCubeを用意。
オブジェクトの名前は「BeltConveyor」にしました。
それから、BeltConveyor を動かすためのスクリプト(BeltConveyor_Controller.js)を用意して
適用しています↓

BeltConveyor_Controller.js
------------------------------------------
function FixedUpdate () {
// x方向に揺れる
transform.localPosition.x = 3 * Mathf.Sin(Time.time);
}
------------------------------------------
次に、ベルトコンベヤーの上に2つのオブジェクトを置きます。
(1)rigidbodyを適用しただけのオブジェクト
→名前は「CylinderOku」

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

スクリプトを適用しない(1)では、ベルトコンベヤーのみが動いてオブジェクトは同じ位置に
静止し続けます。
ということで、(2)でスクリプト(Temae_Controller.js)を使うことでベルトコンベヤーの動きを
オブジェクトに伝えます。
このときに使うのが「transform.Translate()」。
第1引数 = ベルトコンベヤーの移動量
第2引数 = ベルトコンベヤーのtransform情報
Temae_Controller.jstransform.Translate()を使うために、オブジェクト(CylinderTemae)がベルトコンベヤーから
------------------------------------------
#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());
}
------------------------------------------
情報を取得するために「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;
}
------------------------------------------
いざ実行!
手前のオブジェクトが・・・

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

これで解決!
と思いきや、適当にプレイヤーを用意して固定した床からベルトコンベヤーに乗ってみたら、
ベルトコンベヤーと一緒に動きはしたものの、乗った瞬間に瞬間移動してしまいました。
次はこの問題を解決しないとー。
transform.Translate()の使い方に問題があるのか、それ以前に原因があるのか、調べてみます。