コンビネータ チュートリアル
2026-05-22
Factorioのコンビネータ高度チュートリアル。SRラッチ、メモリセル、クロックなどの実践的な回路論理を解説。
これは 上級者向け のチュートリアルです。
初心者はまず Tutorial:
回路ネットワーク cookbook の例や
回路ネットワーク の概要ページを参照してください。
本稿は回路の基本を理解していることを前提として、 SR ラッチ、 メモリセル、 クロックなどのより高度なトピックを扱います。
Introduction
コンビネータ論理は、 出力を入力へクロス接続することで達成され、 望む論理動作を実現します。
高度な論理では多数のコンビネータが必要になりますが、 ほんの数個のコンビネータだけで役立つ基本的な論理を実現できることも多いです。
コンビネータ論理が動作する理由は、 Factorio が 1 秒あたり 60 回 更新されるため。
論理的には、 各更新ティックは二段階に分かれます。
ティックの 2 段階
第一段階では、 すべてのコンビネータがまず接続されたネットワークから入力を読み取り、 計算を行います。
これにより各コンビネータの出力値が生成されますが、 この時点ではまだネットワーク自体の値は更新されていないので、 同じネットワーク上にある別のコンビネータからは旧値が見える状態が続きます。
ティックの更新は第二段階で終了し、 各ネットワークの値は接続されたすべての出力の総和として更新されます。
コンビネータによって論理値が計算されても、 その出力は次の段階まで回路ネットワークに認識されません。
デシダコンビネータで特定の入力条件を検出する場合、 その出力値が回路ネットワークに反映されるのは次のステップになります。
この挙動は重要であり、 複数のコンビネータを直列につないだ際にシーケンスの誤りや大きな遅延を生む原因になります。
上級回路設計でハマる原因の上位がこれ。
ワイヤの振る舞い
回路ワイヤは電子回路のワイヤバスのように振る舞い、 接続されたワイヤにある情報を運びます。
同じ信号がワイヤ上にある場合、 自動的に加算されるという特徴があり、 これにより複数のチェストの中身を同じ電柱に集約して 1 つの「総和信号」 として読み出せるので、 工場全体の在庫を 1 本のワイヤで把握できる、 という Factorio 特有のエレガントな設計が成立しています。
別の信号があれば同じワイヤ上で別の信号として運ばれます。
コンビネータをクロス接続する際は、 未使用の色のワイヤを使って接続するのが良い習慣です。
入力と出力のネットワークが分離され、 不要な入力が大きな回路ネットワークに誤って接続されるのを防げます。
コンビネータは計算前に赤と緑の入力を合算するため、 出力を入力に戻すときはどちらの色でも使用可能。
ただしほとんどの場合、 結果の出力や入力に干渉しないように反対色を使う方が有用です。
デバッグの友: Tick once
コンビネータを理解する際の最良の友はゲーム内エディタです。
ゲームを一時停止し、 "Tick once" のキー割り当てでノードやネットワークをステップごとに調べることができて、 1 ティックずつ進めて値の流れを観察できるため、 複雑なクロックやラッチを設計する時にこれを使わずに頭の中だけで挙動を追うのは現実的ではないので、 必ず割り当てておくべきキーです。
仮想信号 (Virtual signals)
標準のアイテム信号に加え、 Factorio の回路ネットワークには特定のゲーム内アイテムを表さない一連の信号が含まれています。
これらの仮想信号は回路ネットワーク用のユーザー定義チャネルとして機能し、 ユーザーが任意の意味を持たせることができ、 「赤色信号 = 警報」 「青色信号 = 在庫不足」 のように自分でルールを決められるので、 大規模回路網の中で人間が読みやすい命名規則として機能するのが嬉しいところ。
現在、 回路ネットワーク上で送信可能な仮想信号は 102 種類 (Space Age では 172 種類) あり、 Signals、 Enemies、 Environment、 Unsorted のタブに分かれています。
含まれているもの:
- 36 の英数字文字 (A-Z、 0-9)
- 9 色: red、 green、 blue、 yellow、 magenta、 cyan、 white、 grey、 black
- 25 のアイコン: いくつかの十字、 線、 矢印
- 敵の全種類
- 環境オブジェクトのすべて (木、 岩、 プレイヤー、 崖など)
- 2 本のワイヤ、 spidertron、 discharge、 artillery リモート
ロジック信号 (3 種類)
ロジック信号と呼ばれる 3 つの追加の仮想信号があります。
他の信号とは異なり、 これらは回路ネットワーク上で送信できません。
代わりに、 コンビネータの振る舞いを修正する追加の論理を適用します。
これらのロジック記号はワイルドカードとして機能し、 単一の離散的な信号を表すのではなく、 0 個以上 の任意の信号を表す特殊な信号です。
Factorio の回路ネットワークは 3 種類のワイルドカードを実装しています。
Everything wildcard
Everything ワイルドカードはデシダコンビネータで使用されます。
正確な挙動は入力として使うか出力として使うかで変わります。
- 入力: すべての入力信号が条件を満たす場合、 または入力信号が存在しない場合に true を返し、 それ以外は false
- 出力: すべての非ゼロ入力信号を返す
入力として使う場合、 Everything は論理的な AND、 あるいは全称量化子のように考えることができます。
出力として使う場合は入力信号の 「エコー」 あるいは 「ダンプ」 として振る舞います。
注意: 入力が each ワイルドカードでない限り、 出力として使用可能。
Anything wildcard
Anything ワイルドカードもデシダコンビネータで使用されます。
少なくとも 1 つの入力信号がある場合、 任意の入力信号が条件を満たすと true を返します。
どの信号も条件を満たさない場合、 または入力信号が存在しない場合は false を返します。
この挙動から、 Anything は論理的な OR、 あるいは存在量化子のように考えられます。
デシダコンビネータの入力と出力の両方で使われると、 Anything は条件に一致した信号のうちの 1 つを返します。
Each wildcard
Each ワイルドカードはデシダコンビネータおよび算術コンビネータの両方で使われ、 前の 2 つとはやや異なる振る舞いをします。
各信号に対して 個別に コンビネータの動作を行い、 その具体的な動作は使い方とコンビネータの種類によって決まるので、 同じ Each でも文脈で全く違う意味になり、 慣れるまでは挙動を 1 つずつ実機確認しながら使うのが安全です。
入力として使えますし、 出力としても使えますが、 出力として使う場合は入力としても使用されている必要があります。
デシダコンビネータでの挙動
入力として使う場合、 Each は各入力信号を個別にコンビネータ条件と比較し、 条件を満たす各信号を返します。
Each が入力として使われたときの出力の返し方は、 それが出力としても使われているかどうかで次のように変わります。
- 入力のみ: 条件を満たした各入力信号を合算し、 出力設定に応じて通過した信号の個数 (カウント) または値の合計を所望の出力信号として返す
- 入力かつ出力: 条件を満たした各信号を、 それぞれの値 (出力設定に依存) で返す
算術コンビネータでの挙動
指定された算術演算が各入力信号に個別に適用され、 デシダコンビネータ同様、 Each が出力として使われているかで返される信号が変わります。
- 入力のみ: 入力信号それぞれに対する演算結果を合算して、 所望の出力信号として返す
- 入力かつ出力: 各入力信号に指定された演算を適用した結果を、 それぞれ対応する信号として返す
Each は他の 2 つのワイルドカードより複雑ですが、 その分強力な操作を可能にします。
動的に変わる多種類の信号を一括処理できる、 上級設計の要です。
Input insulator & gate
(In: Each + 0、 Out: Each) に設定した算術コンビネータは、 ワイヤ色を変えるためや、 下流の論理が回路ネットワークの入力に逆流して入らないようにするインシュレータ (絶縁器) として使えます。
(Out: Everything、 Input -> Output) に設定したデシダコンビネータも、 設定された論理条件が true の間はインシュレータとして機能します。
これにより意図したときだけ入力を選択的に通す 「
ゲート」 としても使えます。
リモートの列車駅のチェスト内容を順次ポーリングし、 欲しい駅だけを含めるといった用途に使えます。
Set/Reset latching switch
ある量に達したときにトリガーを SET したいが、 その後別の値 (RESET 値) に達するまで ON のままにしたい場合があります。
これにはデシダコンビネータ 1 個と算術コンビネータ 1 個が必要です。
(より複雑な多チャネル条件にはデシダ ×2 と定数コンビネータを使用することもあります。
)
設計手順
最初のデシダコンビネータを望むセット条件にして出力を 1 に設定。
次にその出力を算術コンビネータの入力に接続し、 バイアス値 (セット値とリセット値の差) で乗算するよう設定し、 算術の出力をデシダの入力に戻します。
算術の出力チャンネルはデシダの入力チャンネルと同じにする必要があります。
セット条件が満たされるとデシダは 1 を出力し、 算術コンビネータのバイアスが適用されます。
これにより値がリセット点を下回るまで出力が 「保持」 されます。
この具体例では、 ライトオイルが 20000 に達するとポンプが動き、 5000 に達すると停止します。
詳細な設定と説明を伴う類似のバックアップ蒸気発電例は、 RS latch - single decider version ページにあります。
Basic memory
デシダコンビネータは値を保持するために使えます。
カウンタやより高度な論理のための記憶装置として機能します。
デシダコンビネータは次のように設定します。
- 入力と出力を同じネットワーク (通常は相互に) に接続する
- 条件を、 正の値のときは signal > 0、 正負両方を保持したければ ≠ 0 に設定
- 出力を特定の入力信号の入力カウントまたは入力信号自体に設定
ネットワーク上のすべての入力がゼロである限り、 以前に設定された値を保持します。
動作の詳細
上で述べた二段階更新プロセスを思い出してください。
ネットワークに値 =5 がある場合、 コンビネータはネットワークからこの値を入力として読み取り、 それが > 0 であると判定します。
次に出力を入力 (=5) に設定。
次のステップではネットワークの値が接続されたすべての出力の合計として計算され、 これも =5 になります。
増加クロック
定数コンビネータなどから非ゼロの入力が時間をかけて供給されると、 基本的な増加クロックが作られます。
保存された値は毎サイクル、 接続されたすべての入力値の合計によって増加します。
たとえば、 定数コンビネータが =1 を出力してメモリに接続されている場合、 ネットワークは最初のティックに 1 を保存し、 2 ティック目に 2 を保存し、 以降は毎秒 60 回 (60 ティック) 増加していきます。
Copy blueprint string
0eNqlU11rwzAM/C96TkuStWvqh8F+xyghH2orSOygyGWh5L/PjkcJJetW9hKQLd2d7pwrlI3FjkkLqCtQZXQP6uMKPZ100fgzGToEBSTYQgS6aH1VY0U18qoybUm6EMMwRkC6xk9QyRj9CuCJpNCyjJCOhwhQCwlh0DMVQ65tWyI7iodAEXSmd7NGe36Ht9sk620EA6jVNsvWW8fk5oRNk5d4Li7khlznkRpB/sGAC7FYd3JjDh2rd5jQrHcwiWcmHAKLxsor6T1U4j8nRtTzpah2G7te4sqSTKWfHr2Nd3unjxJYWPtu6Zo4qAmECxZ8w+burqab7iNxL/mfLcEL8iBn0qfgTUgIVOyLtit4kqvgzU0aK539B3Y35JP5+ZFNm5N2YKCELY7P2J/MvF6II53CTJ9Lzz3h6c2r2T8WgZPfhwCyZLPbp7vsdR+/xJtx/AJNbzZ8
これがどのように動作するか? ネットワークは最初は何の値も持ちません。
定数コンビネータがアクティブになると =1 を生成し、 デシダコンビネータはまだ値が設定されていないので 0 を出力します。
ステップ 2 でネットワークはすべての出力の合計に設定され、 =1 に。
次の更新ティックで定数コンビネータは再び =1 を出力しますが、 今度はデシダは =1 を読み取り、 自身も [A]=1 を出力。
ステップ 2 でネットワークは合計 =2 に。
以降同様に増えていきます。
通常は 1 を出す定数コンビネータが使われますが、 もちろん他の値 (負の値を含む) を出力することもできます。
負の値は以下の例のように保存値を減少させます。
デシダの条件が > 0 の場合は正の値のみが許されるため、 0 に到達すると減少は止まり、 そこから先は条件が満たされなくなるためデシダは出力を発しなくなる、 という形でカウンタの自動停止が実現できます。
条件が ≠ 0 の場合は負の値も許されます。
パルス入力でカウンタ
入力の単一パルスはパルス値分だけ単一の増分を引き起こし、 カウンタを作ります。
次のブループリントではベルトにアイテムを 1 つ置いてください。
接続されたベルトがそれを検出するたびにパルスが生成され、 保存値が増えます。
Copy blueprint string
0eNqllMGO4jAMQP/F5zAqpaXQw/7IahWljQFLbVIlLtoK5d83aXdZEJ3DMBeQU+fFenZyg6YbcXBkGOobUGuNh/rnDTydjerSGk8DQg3E2IMAo/oUsVPGD9bxpsGOIQggo/E31NvwSwAaJiZcSHMwSTP2DbqY8BlDwGB93GZNOjWiqqL8KAVMUG/KQ/ZRhiBeaPl7tG2kCdDksF1S8hX27gvs/XOlT+xCQNTKznaywYu6knVpX0uuHYklGtV0KDX59A/1SXUexf2zQ6XlRRktEySWGK2yGx8y/q0vqb3VEZKF+VCz1ODTedv0c3aI5rEtpKEu/7NSGFsY1lwX7/l4cV2ssMs7W2NLGt2mtX1DRnGUtcI/fmo7X7f9F5tkabo7OZHzLF9m/UqOx7hyL2rJ2OAV3cQXMmdY/HpW6eJkKegH5eZya/gRd9qRh/Eb7GGKtY6G5cnZXpKJsKXx4Sut3T24Xml1HlstIP/uZOzfuoXVcf1OV2/N2Ux7moR9eormZ6t+eOUERNF+GZXDtqiOeXXYH7NdVoTwB9igtjA=
保存された値は条件が満たされなくなるとクリアされ、 デシダは出力を消します。
これはその値がネットワークの他の場所で出力されていない場合にのみ働きます。
保存値はまた、 入力と等しい負のパルスでゼロにリセットできます。
後者は他の入力がまだ接続されている間でも起こり得ます。
Basic clocks
クロックはコンビネータの出力を自身の入力に戻し、 毎サイクル自己のカウントを進めるように構成して作ります。
算術コンビネータでもデシダコンビネータでもどちらでも使用できます。
算術コンビネータ版
自身にループした算術コンビネータは見ていると面白く果てしなく増加しますが、 リセットするための追加の制御ロジックが必要です。
デシダコンビネータ版 (自己リセット)
単一のデシダコンビネータを使うと、 自己リセットするクロックが構築できます。
出力を入力に接続し、 特定の数値に対して less than (<) に設定し、 Input → Output にします。
そこに定数コンビネータを入力として接続すると、 各サイクルで定数コンビネータの出力分だけカウントアップし、 数値に達するとデシダは出力をクリアします。
その時点では定数コンビネータだけがネットワークに寄与し、 クロックはリセットされます。
この仕組みにより、 クロックのシーケンスには 0 が含まれません。
クロックは定数コンビネータで設定した値から開始します。
さらに、 条件が false になる原因となったその数値もシーケンスに含まれます。
算術コンビネータはクロックシーケンスを変更できますが、 算術の出力はクロック値より 1 サイクル遅れて出力されることを忘れないでください。
定数コンビネータは、 定数 1 を追加出力として加えることで省略できます。
このバージョンは閾値に等しい信号値を 1 ティックだけ設定するため、 同じ閾値なら 1 ティック多くカウントすることになります (プログラミングにおける 1 始まりと 0 始まりの違いに類似)。
もし正確な周期が重要なら、 閾値を 1 下げる必要があります (例: 毎秒 (60 ティック) で繰り返すには閾値を 59 にする)。
一度だけカウントするクロック
一度だけカウントするクロックは次の設定で作れます。
クロックは定数を出力する定数コンビネータを有効/無効にすることでリセットできます。
One-time clock: Runs until T=Z+1。
Reset via R>0。
Copy blueprint string
0eNq1VdtugzAM/Rc/p1Wh9BZtPzHtaVOFKLidJUhQSKpVFf8+B6oK9QrT9oJI4hzb5xzDETa5w9KQsiCPQKlWFcjPI1S0U0nu9+yhRJBAFgsQoJLCrzJMKUMzSnWxIZVYbaAWQCrDb5BBLZ4C+EQ2UfY2QlivBaCyZAnbeprFIVau2KDhFI8qEVDqiq9q5dMz3GI2E3AAOZqtgvGM02RkMG0D5sLXYo3O4w1+JXtiAL51go35LGugKr+7JVPZ+Kq1PRnreOdcVBsxevctVegx+l/68Je4mzIxTTcSXjhGO1u6oalTXR64A6dsvDW6iEkxBshtkldYN+dKtTw03QX+YTDrEk68ijiSTOrINstGnJ1BVJeBfMKoYT+YgINr75QLacOHHrmh7WI8WN0t5RbNHac/Ecb5UQmWk47d13e4vElS0I+G6VAawjMNy9V/0vDWpaFLAr9Xsc/W+msAJT2dEf1y6K/5CP9x6E/8tJqBnFwM8+sfD7M1bsgsB31nedoR4PZH4MGoX3tcDFDeO8n/LGTn5yRgz05txVsG0WIVLpbz1WQ6ier6B+n0TYg=
Pulse generators
基本クロックの出力に追加の (=) デシダコンビネータを接続するとパルスジェネレータが作れ、 クロックが設定条件を通過するたびに単一の出力をパルスします。
任意の出力値が使えます。
クロックシーケンスから直接 (input->output)、 1、 あるいは定数コンビネータなどで別の論理チャンネルに設定された値など、 どれでも可能で、 これによって定周期で発火するイベントを別の信号に翻訳できて、 たとえば 1 秒ごとに警報を出す、 30 秒ごとに在庫を集計する、 といった用途に展開できます。
- 値 1 は 1 以上の任意の正の整数として書ける。
ただしタイマの上限/天井を超えないこと - 上記タイマの例では、 タイマが 30 ティックに達した後の 1 ティック目にこのライトがパルスし、 Factorio が 1 秒間に 60 回更新するため 1/30 秒間隔で点滅
Edge detectors
コンビネータの計算遅延を利用して、 信号が変化したとき (例: 0 から 1 へ) の 1 ティックパルスを生成できます。
コンビネータの出力を赤ワイヤで入力に戻し、 算術コンビネータの入力へは赤、 出力を緑で接続して -1 倍するようにします。
赤回路が信号を 0 から 1 に変えたとき、 算術コンビネータは入力 1 を受け取りますが、 このティックではまだ出力が 0 のままです。
したがってその 1 ティックだけ緑ワイヤは 1 を持ちます。
次のティックで算術コンビネータが更新され、 出力は -1 に。
緑ワイヤは今、 2 つの入力が互いを打ち消す状態。
同様に赤入力が 1 から 0 に変わった場合も同様のことが起こりますが、 この場合緑ワイヤは 1 ティックだけ -1 を持ちます。
もし 0 から 1 への変化のみでパルスを生成したいなら、 デシダコンビネータを >0 に設定して負のパルスをフィルタリングできます。
この仕組みは駅に入る列車の数を数えるなどに使えます。
Counter
カウンタは入力イベントの数を数え、 その合計を出力します。
入力がパルスする任意の信号を、 input->output に設定したデシダコンビネータに繋ぎ、 出力と入力の間でループさせるとカウンタができます。
ただしこの入力は常にゼロでなければならず、 そうでないとコンビネータはクロックのように暴走します。
通常はパルスジェネレータを使ってこれを実現します。
複数のゲーティングデシダ (順次条件を設定した絶縁器)、 クロック、 パルスジェネレータをカウンタの入力に組み合わせることで、 各絶縁器の内容をリモートでポーリングしてカウントするという、 列車駅の在庫を順番に集計するような大規模応用に展開できます。
Memory cells
Simple latch
コンビネータを自身にループさせるときは、 メインの入力や出力とは異なる色のワイヤを使ってください。
真理値表:
| Output 1 | Input 1 (Set) | Input 2 (Reset) | Output 1 (t+1) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 0 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | 0 | 1 (2) |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 (2) |
Output 1 は図で見える緑ワイヤのループで、 ラッチする値を保持します。
Input 1 は Set、 Input 2 は Reset。
Positive cell
正の値を記憶するセル (リセット対応):
右側に信号 I として望む値を接続するとメモリセルにセットされ、 負の値を信号 I として接続するとセルはリセットされます。
- メモリセルの出力は互いに排他的な 2 つの信号
- 入力信号 I > 0 の場合、 信号 I が他側へ伝達される
- 入力信号 I が途切れた場合、 代わりに信号 M が過去の入力値の記憶として出力される
- 入力信号 I が途切れると、 メモリ信号 M に切り替わるのに 2 ティックかかる
- 入力 I が 1 ティックだけ続く場合、 メモリセルは以前の 2 つの値間をティックごとに交互に循環し続ける。
無限に続く - 切り替えはシームレスで、 空の信号になるティックはない
Positives and negatives cell
このセルは正負の値のどちらも保存できます。
リセットは専用ラインで行います。
さらに、 1 ティックのバーストも正しく扱えます (フォーラム投稿参照)。
- 出力 M (メモリ) は最後の非ゼロの入力 I (Input)
- 非ゼロの R (リセット) 信号が出ると出力はゼロにセットされる
- R または I の 1 ティックのバーストは正しく処理される
- 負の値も正しく扱われる
Multiplier and Dictionaries/Arrays
2 つの信号を掛け合わせることは単純で、 単一のコンビネータだけで可能ですが、 複数の信号を掛け合わせるのはより複雑です。
下に方程式の証明とその動作の理由が示されています。
Dictionary (辞書)
辞書 (ディクショナリ) は特定の信号上の値にアクセスできるシステムです。
たとえば A は多くの信号を含み (定数コンビネータやメモリセルから)、 B は特定の信号 1 つを含む (例: 青信号)。
結果として残るのは A の中の青信号の値だけ。
これは他のすべての信号が 0 で掛けられるためです。
Array (配列)
配列は辞書に似ていますが、 キーとして信号を使う代わりに数字を使います。
定数コンビネータを配置して各信号を一意の番号に対応付け (例: 1 = 黄色ベルト、 2 = 赤ベルト、 3 = 青ベルト、 4 = 石油式インサータ、 など)。
次に "each = index OUTPUT 1 of each" のようなコンビネータを使い、 それを辞書の入力として接続します。
数学的証明
((A+B)² - (A-B)²) / 4 = AB
(A+B)² - (A-B)² = 4AB
(A² + 2AB + B²) - (A² - 2AB + B²) = 4AB
4AB = 4AB
算術回路
定数回路
条件回路