結論から書きます。cluster で「触ったらアイテムを配る」ギミックが、3時間まったく動きませんでした。 エラーすら出ない、完全な沈黙。原因は、ScriptableItem のイベントを「代入」で書いていたこと。正しくは「コールバックを登録」する書き方でした。そして抜け出せた決め手は、推測をやめて「すでに動いているギミック」を正典にしたことです。
順番にお話しします。
何を作ろうとしていたか
私は、Tapiava のコミュニティ「タピアバの学校」を cluster で運営していて、入学式のライブイベントを開いたことがあります。その準備中(本番の前日)に作っていたのが、来場者にデジタルの「生徒手帳」を配るギミックでした。
やりたかったことはシンプルです。
- アイテムに触る(インタラクトする)
- 触ったその人に、手帳を渡す
cluster には ScriptableItem(アイテムにスクリプトで動きをつける仕組み)があり、これで実現できるはず——そう思って書き始めました。
3時間、何も起きなかった
ところが、いざワールドに入って触っても、うんともすんとも言わない。
つらいのは、エラーが出ないことでした。スクリプトのどこかが赤くなってくれたら、まだ手がかりになります。でも何も起きない。コードは一見ちゃんとしている。「保存し忘れ?」「アイテムの設定?」「触る判定?」と、あちこちを疑っては直し、また触っては沈黙。これを延々と繰り返して、気づけば3時間が溶けていました。
原因:ScriptableItem は「コールバックを登録」する
落ち着いて公式ドキュメントを読み直して、ようやく腹落ちしました。
cluster の ScriptableItem では、プレイヤーの操作に反応する処理を、コールバック関数を「渡して登録」する形で書きます。インタラクトに反応させたいなら、こうです。
// ✅ 正しい:コールバックを「登録」する
$.onInteract((player) => {
// 触ったプレイヤーに対する処理をここに書く
});
ところが私は、なんとなくの直感で、こう書いていました。
// ❌ これだと何も起きない(沈黙する)
$.onInteract = (player) => {
// ...
};
onInteract に関数を代入してしまっていたんです。onInteract は「登録するための関数を呼ぶ」もの。なのに私は「プロパティに値を入れる」書き方をしていた。登録されないので、当然なにも呼ばれない。間違いではあるけれど"文法的には通ってしまう"ので、エラーにもならず、ただ静かに無視される——これが沈黙の正体でした。
ちなみに公式によると、この手のコールバックはスクリプトのトップレベルで登録し、同じものを複数回登録すると最後の登録だけが有効になります。知っていれば一発、知らないと一生気づけない類のやつです。
抜け出せた決め手:「動いているもの」を正典にする
実は、原因そのものより大事な学びはこっちでした。
3時間ハマっていた間、私はずっと自分のコードを"推測で"いじっていました。でも沈黙する不具合は、推測で当てにいくと泥沼です。抜け出せたのは、すでに正しく動いている別のギミック(過去に作って問題なく動いているアイテム)を開いて、自分のコードと"差分"を取った瞬間でした。
並べて見れば一目瞭然。「あ、こっちは関数を渡して呼んでる。自分のは代入してる」。動く実物が、いちばん正確な仕様書だったわけです。
個人運営で学んだ3つのこと
- 沈黙する失敗ほど、推測でいじらない。エラーが出ない不具合は、「動いている実物」とのコード差分を取るのが最短ルート。
- APIの"形"を最初に確認する。「代入する値」なのか「呼んで登録する関数」なのか。ここを取り違えると、文法は通るのに動かない、という一番つらいパターンにハマる。
- 失敗の記録こそ、続けるための資産。1人で運営していると、こういう詰まりは全部自分に降ってきます。でも、記録しておけば次の自分(とだれか)の3時間を救える。
なぜこれを公開するのか
私は「個人とAIで、どこまで本物のサービスを作れるか」を、つまずきごと公開(build in public)しています。完成形だけ見せるより、この「3時間溶かした」みたいな手探りの記録のほうが、きっと誰かの役に立つと思うからです。
もしあなたが今まさに cluster の ScriptableItem で沈黙と戦っているなら——まず、動いているアイテムを開いて、onInteract を「代入」していないか見てみてください。それで救われる3時間が、どこかにありますように。
cluster でのイベントづくりや、つまずき・解決の話は、コミュニティでもよくしています。よかったらのぞいてみてください。
参考(cluster 公式)
— baku(Tapiava 運営)