Unityでベルトコンベアを作りました。
動く足場と違い、ベルトコンベアだとプレイヤー等は子要素にしていません。
接触したプレイヤー等を把握して、位置情報を直接書き換える形で実装しています。
簡単な方法は、OnCollisionStay2D辺りでtransform.positionを変更する事だと思います。
Rigidbodyを使っている場合はtransform.positionではなくrigidbody.positionを更新したほうが良いようです。
また、Rigidbodyの更新タイミングよりOnCollision周りが遅いので、OnCollisionEnter辺りで保持してFixedUpdateで更新した方が良いのかもしれません。
動画で動いているベルトコンベアのコードは大体こんな感じ。
木箱にはRigidbody2Dが必要です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BeltConveyorManager : MonoBehaviour
{
public float speed = 3.0f;
float diffX = 0.0f;
readonly List<GameObject> gameObjects = new();
void Start()
{
diffX = speed * Time.fixedDeltaTime;
}
private void FixedUpdate()
{
foreach(GameObject gameObject in gameObjects)
{
Vector2 speed = new Vector3(diffX, 0);
Vector2 newPos = gameObject.GetComponent<Rigidbody2D>().position + speed;
gameObject.GetComponent<Rigidbody2D>().position = newPos;
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.GetComponent<Rigidbody2D>() != null)
{
gameObjects.Add(collision.gameObject);
}
}
private void OnCollisionExit2D(Collision2D collision)
{
if (gameObjects.Contains(collision.gameObject))
{
gameObjects.Remove(collision.gameObject);
}
}
}