【第29回】精密品用バッファコンベアを実装|速度差でワーク間隔を作る仕組みに苦戦した

機械設計×ゲーム

前回、第28回では、4種類のワークを実装しました。

  • 標準品:○
  • 未加工品:□
  • 精密品:◇
  • 短納期品:△

さらに、

形=ワーク種類
色=加工回数

というルールも決定。

ここからは、それぞれのワークに本当の意味で「違うライン設計」を要求していきます。

まず手を付けることにしたのが、精密品です。

精密品には、

  • ワーク同士の接触NG
  • ストッパへの接触もNG

というルールがあります。

普通のワークのようにストッパで止めて間隔を整えることができません。

では、止めずにどうやってワーク間隔を作るのか?

そこで今回、新しく実装したのが、
バッファコンベアです。

そしてこの設備、結果的に今まで作った設備の中でもかなり苦労する実装になりました。


精密品にはストッパが使えない

これまでワーク間隔を整える設備といえば、ストッパでした。

ワークを一度止める。
↓
一定周期で1個ずつ流す。
↓
加工機へ安定して供給する。

非常に分かりやすい設備です。

ただ、精密品では、ストッパへ接触した時点でNG。
なので、この方法が使えません。

そこで考えたのが、コンベア速度の違いだけでワーク間隔を作る方法です。

これは実際の搬送設備でも使われる考え方なので、
今回の工場パズルともかなり相性が良さそうでした。


バッファコンベアは「1×3」にする

まず設備サイズは、1×3マスにしました。

横向きなら3マス分。
回転させれば縦方向にも使えるイメージです。

通常コンベアよりかなり場所を使います。

でも、これはむしろメリットだと思っています。
精密品を安定して流せる代わりに、工場スペースを消費する。

つまり、バッファを入れれば安全。
でも土地を使う。という新しいトレードオフが生まれます。

第25回で土地拡張を追加した意味も、
こういう設備が増えてくるとさらに大きくなってきます。


最初は「自動で間隔を整える設備」も考えた

当初ChatGPTからは、前方ワークとの距離を見ながら自動で減速する、
賢いバッファコンベアの案も出ました。

ワークが近づけば減速。
間隔があればそのまま搬送。
確かに便利そうです。

ただ、自分としては少しイメージが違いました。

もっと機械的に、速度差によって自然に間隔が変わる設備にしたかった。

そこでChatGPTへ、

はじめ
はじめ

「バッファに入ると超低速でワーク間隔が接触ギリギリまで詰まって、
その後通常コンベアへ乗り移るときに間隔が広がるイメージにしたい」

と相談しました。

この方向で仕様を変更することにしました。


「遅くして詰める → 速くして離す」

今回のバッファコンベアの基本原理はかなりシンプルです。

通常コンベアから、超低速のバッファコンベアへワークが入る。
すると後続ワークが追いついてきて、バッファ内ではワーク間隔が小さくなります。

その後、バッファコンベアから通常速度のコンベアへ移る。

先頭ワークは一気に速くなる。
後続ワークはまだ低速。

その速度差によって、出口側では再びワーク間隔が広がるという考え方です。

つまり、

バッファで詰める。
↓
出口の速度差で間隔を作る。

という仕組みです。

ストッパのように完全停止させないので、精密品にも使いやすい設備になります。


バッファ能力も「個/s」で考える

【第19回】Unity工場パズルのストッパ能力を「個/s」に統一|ボトルネックと余裕率を考える

これまで、

投入機
ストッパ
加工機
出荷場

の能力は、できるだけ『 個/s 』で統一してきました。
今回のバッファコンベアも同じ考え方にします。

例えば、

投入機が0.45個/s。
加工機が0.55個/s。

その間に入れるバッファがどの程度の流量を処理できるのか。

これを同じ「個/s」で確認できれば、
ライン全体の能力バランスがかなり見やすくなります。

単純に、「このコンベアは遅い」ではなく、
この設定で何個/s程度を流せるのか?を見る設備にしたいわけです。


ところが、精密品がバッファ内で接触しまくる

ここから問題が起きました。

超低速にしてワーク間隔を詰める。
考え方としては狙いどおりです。

ただ、精密品には、ワーク同士の接触NGがあります。
つまり、間隔を詰めすぎると、その瞬間にNGになります。

実際に動かしてみると、
Precision Contact NG (精密品接触エラー)
がかなり頻繁に発生しました。

「精密品のために作った設備なのに、精密品を流すとNGになる」という状態です。

これは困りました。


速度を上げれば今度はバッファの意味がなくなる

では、バッファ速度を少し上げればいい。と思いました。
確かに速度を上げると、バッファ内での接触はなくなります。

ただ今度は、ワーク同士があまり接近しません。
すると通常コンベアへ乗り移ったときも、出口側で十分な間隔を作れない。

つまり、

速度を下げる。
→ 接触NGが増える。

速度を上げる。
→ 間隔を作れない。

という状態になりました。

これでは、精密品用バッファコンベアという設備自体が成立しません。


「一定速なのに中盤で接触するのはなぜ?」

さらに実装中には、少し気になる挙動もありました。

バッファ内は基本的に一定速度で流しているはずなのに、
入口では接触していなかった精密品が、
バッファ中盤で接触NGになることがありました。

自分としては、

はじめ
はじめ

「同じ速度で走っているなら、途中で距離が縮むのはおかしくない?」

と思ったので、またChatGPTへ相談。

すると、

ChatGPT
ChatGPT

「両方のワークが完全にBuffer内部へ入り、同じ一定速度で走っているなら、
中盤で距離が縮むことは基本的にありません。」

とのこと。

原因候補として、

  • 先行ワークだけが何らかの理由で減速している
  • 後続ワークが入口Transition中で一時的に速い
  • 1×3設備内部でセルごとの搬送処理が切り替わっている
  • Precision判定側で誤検知している

などが考えられることが分かりました。

ここから、接触判定とバッファ挙動の調整
をかなり繰り返すことになります。


一度「賢いバッファ」も考えたけどやめた

接触問題を解決するため、バッファ内部でワークを自動整列させる。
最低ピッチを強制する。前方距離を見て速度を変える。
など、いろいろな案も考えました。

ただ、やればやるほどバッファコンベアの処理が複雑になっていきます。
そこで一度、「やはり最初の超低速コンベアに戻そう」と決めました。

バッファコンベアは、賢く自動制御する設備ではない。

ただ一定の超低速で流す。
その速度差をプレイヤーが利用する。

こちらの方が、ゲームとしても理解しやすいです。


最終的に「バッファ内部だけ接触判定を無効」にした

そして最終的に採用したのが、
バッファコンベア内部では、精密品の接触NG判定を無効にするというルールです。

最初は、「精密品なのに接触していいの?」とも思いました。
ただ、ゲームとして考えると、この方が成立します。

重要なのは、どこでも接触OKにするわけではないことです。

ルールとしては、バッファコンベアの内部搬送中だけ、
精密品の接触判定を無効。とします。

  • バッファ入口。
  • バッファ出口。
  • 通常コンベア。
  • ストッパ。
  • その他の設備。

では、これまで通り接触NGです。


だから「バッファを置けば全部解決」ではない

この例外ルールを入れても、ゲーム性は残ります。

例えば投入機から、0.75個/sで精密品が流れてくる。
でもバッファコンベアを極端に遅く設定する。

すると、バッファ内部へ入るより速く後続ワークが到着します。

結果、バッファ入口の手前で精密品が詰まる。
そこはバッファ内部ではありません。

当然、接触NGになります。
つまり、とりあえずバッファを置いて最低速度にすればOKではありません。

  • 上流の供給能力。
  • バッファ能力。
  • 下流コンベア速度。

これらのバランスを考える必要があります。


実際に3パターンを試してみる

バッファコンベアの仕組みだけ説明しても、正直少し分かりにくいです。
そこで実際に、精密品を加工機まで流す3つのパターンを比較してみました。

試すのは、

  1. 投入機 → 加工機
  2. 投入機 → ストッパ → 加工機
  3. 投入機 → バッファコンベア → 加工機

の3パターンです。

同じ精密品でも、途中に置く設備によって結果がかなり変わりました。


パターン① 投入機からそのまま加工機へ流す

まずは一番シンプルに、
投入機から精密品をそのまま加工機へ流すラインです。

設備構成としては最も簡単。

余計な設備も使わないので、一見これで問題なさそうです。
ただし、投入機には投入タイミングのばらつきがあります。

そのため、あるワークは少し遅れて出てくる。
次のワークは少し早く出てくる。ということが起きます。

結果として、加工機がまだ処理中なのに次の精密品が到着してしまい、
加工機投入間隔エラーが発生しました。

動画:投入機 → 加工機

投入機のばらつきによってワーク間隔が一定にならず、
加工機が処理中のタイミングで次の精密品が到着。

投入間隔エラーが発生します。

つまり、平均的な投入能力が加工機能力以下でも、
瞬間的な投入間隔までは安定しないということです。

以前から考えてきた、「表示能力」と「実際のライン挙動は別」
という部分が、ここでも出てきました。


パターン② ストッパで間隔を整えてから加工機へ流す

では、これまで使ってきたストッパで整流すればいいのでは?
ということで、投入機 → ストッパ → 加工機のラインも試しました。

通常ワークなら、これがかなり有効です。
ストッパで一度止めて、一定周期で1個ずつ送り出せば、
加工機へ安定した間隔で供給できます。

ただし今回は精密品です。

精密品には、ストッパへ接触したらNGというルールがあります。
実際に流してみると、ストッパが閉じたタイミングで精密品が停止。

その瞬間、ストッパ接触エラーになりました。

動画:投入機 → ストッパ → 加工機

ワーク間隔自体は整えられますが、精密品がストッパへ接触した時点でNG。
通常ワークで使える整流方法が、精密品では使えません。

ここが精密品の特徴です。

単純に、「ストッパを入れれば全部解決」にはならない。
別の方法でワーク間隔を作る必要があります。


パターン③ バッファコンベアで間隔を作る

最後に、投入機 → バッファコンベア → 加工機のラインです。
今回作ったバッファコンベアは、超低速でワークを流します。

バッファ内では後続ワークとの間隔を一度詰める。
その後、通常速度のコンベアへ乗り移ると、
先頭ワークだけが先に加速します。

この速度差によって、後続ワークとの間隔が広がります。
実際に流してみると、ストッパを使わずにワーク間隔を確保できました。

加工機への投入も安定し、精密品の接触NGも発生しません。

動画:投入機 → バッファコンベア → 加工機

バッファコンベア内で一度ワーク間隔を圧縮し、出口側の速度差によって再び間隔を広げます。

精密品を停止させず、そのまま加工機へ安定供給できました。
ようやく、精密品専用ラインとして成立する形が見えてきました。


3パターンを比較すると違いが分かりやすい

今回の結果を整理すると、こんな感じです。

ライン構成結果問題点
投入機 → 加工機NG投入ばらつきで加工機への到着間隔が乱れる
投入機 → ストッパ → 加工機NG精密品がストッパへ接触する
投入機 → バッファ → 加工機OK速度差で間隔を作り、停止せず搬送できる

こうして実際の動画で比較すると、
なぜ精密品にバッファコンベアが必要なのか
がかなり分かりやすくなります。

単に新しい設備を追加したのではなく、精密品というワークのルールがあるから、
バッファコンベアという設備が必要になった。という関係です。

このあたりは今回かなり気に入っています。

ワーク種類を増やしたことで、
設備を追加する理由まで自然に生まれるようになってきました。

バッファでも「ライン能力のバランス」が重要になる

例えば、

投入機の能力が高すぎる。
↓
バッファへ入りきらない。
↓
入口で渋滞。
↓
精密品同士が接触。
↓
NG。

となります。

逆にバッファを速くしすぎれば、
今度は出口側で十分な間隔を作れない。

つまり、遅すぎてもダメ。速すぎてもダメ。という設備になりました。
これは結果的にかなりゲームらしいです。

単にバッファを置けば解決するのではなく、
前後の能力を見ながら速度を決める必要があります。

また一つ、「個/sでラインを見る」意味が増えました。


今までで一番苦労した設備になった

今回のバッファコンベア。

最初に考えたときは、
「超低速のコンベアを3マス置くだけ」
くらいに思っていました。

ところが実際には、

  • 精密品の接触判定
  • 入口Transition
  • ワーク間隔
  • コンベア速度
  • 1×3設備内部の搬送
  • 出口側との速度差

いろいろな処理が絡みました。

結果として、今まで実装してきた設備の中で、一番苦労しました。
でも、その分かなり面白い設備になったと思います。

ストッパは、止めて整える。
バッファコンベアは、止めずに速度差で整える。

同じ「ワーク間隔を調整する」という目的でも、
使い方がまったく違います。


精密品専用ラインらしさが出てきた

これで精密品は、普通のワークとはかなり違う扱いになりました。
標準品なら、ストッパを使って整流できる。

でも精密品は、ストッパに触れられない。
そのため、バッファコンベアと速度差を利用して、接触させないラインを作る。

ようやく第27回で考えた、
「ワークの種類によって最適なラインが変わる」
という考え方が、実際のゲームとして見えてきました。


次は「複数種類のワークが混ざって流れる」状態へ

今回、精密品用のバッファコンベアまで実装したことで、
ワークごとに違うラインを作る意味がかなり見えてきました。

ただ、現状はまだ、投入機ごとにワーク種類を選んで流しているだけです。

つまり、

標準品だけのライン。
精密品だけのライン。

といった形で、最初からワークが分かれています。

でも今後やりたいのは、
複数の種類のワークがランダムに混ざって投入される工場です。

  • 標準品
  • 未加工品
  • 精密品
  • 短納期品

これらが同じ投入機から次々と流れてくる。

そうなれば、プレイヤーはワークの種類を見ながら、
「このワークをどのラインへ流すか?」まで考える必要があります。

次回、第30回では、まずその土台として、
複数種類のワークをランダムに投入する「混合投入機」
を実装していきます。

ここから、いよいよワークを仕分ける工場へ進んでいきます。

コメント

タイトルとURLをコピーしました