見出し画像

OnCreateItemTriggerでアイテム生成数を制限する

本日は、なっとうまきのおうちのキッチンで用いられている
チキン、おにぎりといった食べ物の生成ロジックを紹介しようと思います。

何をするもの?

レンジのボタンを押すと、食べ物が出てきます。

画像1

画像2

出すだけならかんたんです。
でも、悪意のある人が1000個2000個もしかすると100000個なんて数を生成したらClusterサーバに迷惑がかかります。
(もしかすると、内部的に制限するロジック=一定以上の巨大なワールドインスタンスを停止する、的なものも存在しそうですが、あるかどうか分からない仕様に頼るのは安全設計の観点からすると、あまりよろしくないです。)
なので、アイテム生成上限を定めたいと思います。

このワールドに入れる人はたかが知れていて、おおよそ1インスタンス20人程度が限界だと思います。
なので、チキン、おにぎり共に15個程度を上限にします。

アイテム数の上限を定めるロジックは以下の記事を参考にしています。

クリックしたらアイテム生成するアイテムを作る [個数制限付き]
アイテムの生成、破壊2(個数制限)

これらを参考にしつつ、新しくロジックを作っていきます。

既存ロジックで足りない部分

アイテムを「食べる」という操作をした時に、アイテム生成制御をするアイテム(ボタン)に対してワールドからXXのインスタンスが減ったよという事象を通知するロジックが存在しないため、合計数に変更が掛かりません。
また、生成ボタンを押したときの挙動として、オブジェクトに対しては生成数は上限を設けているものの、内部変数がなんの制限もなくカウントアップされていきます
これは今回のワールドに於いては、意図した挙動ではないので修正していきます。

というわけで仕様を整理すると

・仕様0:アイテム1種類15個
・仕様1:上限は「今までに生成されたインスタンスの合計数」ではなく
 「現状生成されているインスタンスの合計数」としたい
・仕様2:「食べる」という操作をした時に、「生成されているインスタンス合計数を減らしたい」
・仕様3:「生成する」と言う操作をした時に「インスタンス生成上限を超えていたら、インスタンスの生成を禁止し、合計数も上限値のまま維持したい」

という仕様になります。
特に、最後の1行が非常に大事で
・「生成する」と言う操作をした時に「インスタンス生成上限を超えていたら、インスタンスの生成を禁止し、合計数も上限値のまま維持したい」

インスタンスの生成上限に達しているにも関わらず、生成ボタンを押しまくると、インスタンス数を制限する内部変数が16とか17になってしまって、最悪30を超えてしまうと、いくらチキンを食べてワールドからなくなっても生成されなくなってしまいます。(「30-15=15なので、生成上限以上だ!生成しない!」みたいなロジックになります)

細かいことよりもロジックを

とりあえず作れればいいのです。作っていきましょう。
ここからのロジックは、食べ物を生成する時に押すボタンに対して付けていきます。

画像3

アイテムが「食べられた」時に動作するロジックは以下です。(これも食べ物を生成するボタンに付けます)

画像4

続いて、食べ物側につけるロジックです。

画像6

という感じです。

課題

・ワールドに存在する地面のコライダーから飛び出て、Despawnポイントよりも下にアイテムが落下し、アイテムがDespawnした場合

この場合は、Use Item Triggerがトリガされないため、ParitikiEatメッセージがGlobalに飛びません。
そのため、アイテムの生成数(ボタン側で管理している値)が減らされません。

つまりいつまで経ってもボタン側は「生成上限のままだ!これ以上は生成しないぞ!」と言う気持ちになっています。

課題の解決方法案

・コライダーをアイテムが飛び出ないようにとりあえず太くする
  現在ワールドで取られている対策になります。
・アイテムカウント数をすべてゼロにするアイテム削除スイッチを付ける
 ・このスイッチを付ける場合は、生成されている全てのアイテムも同時に削除される必要があるので、アイテム側のロジックも少し変更する必要があります。
  「ふきん」や「掃除機」といったアイテムを「アイテム削除スイッチ」にするとメタい感じが無くなるので面白いかもしれませんね

などなど、まだまだ改良の余地が有り、ワールド作成はやめられませんね!

では!

この記事が気に入ったらサポートをしてみませんか?