表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
こねこのチビの『島管理にゃん』ものがたり~ストレイキャット・ツリータワーを育てよう!@Cluster World~  作者: 日向 るきあ
第二十七章 チビ猫、『四月のほんと』におどろく

この作品ページにはなろうチアーズプログラム参加に伴う広告が設置されています。詳細はこちら

421/429

日向、ItemScriptからPlayerScriptにメッセージを送るための奮闘(をするはめになった)記録

2026.04.05

こちらに記してあることは、部分的に現行のセッティングとは異なります。

混乱を避けるため追記をいたしました。


2026.04.02

投稿ボタンを押したはずが投稿されていませんでした、恥ずかしい(*ノωノ)

急ぎ投稿させていただきます。


今回はひたすらスクリプトのお話なので、眠気を感じましたら回れ右くださいませ。

もしくはお布団の中でご利用ください。

 まとめ!

1.Scriptをかくファイルの文字コードは、UTFN(BOMなし)にするべし!

2.Playerscriptのグローバル変数の値は、{}を出るとリセットされるよ!

 セットした値を使いたい処理は、全部なかにいれとこうね!!

3.logでログはいてもらうとチェックはかどるよ!(つか、ないとムリゲー)


~~~お忙しいお方はここまでで大丈夫! 以下はアホの子による奮闘記(※役に立つかはわからない)です!!~~~


第一章 触れて。ただ、それだけなのに ~最初にPlayerScriptをセットする時点でもう右往左往しているの巻~


 長いよ!(※アホの子の感想です)

 なにがって? 『プレイヤーが触れたら/来たらなんかする』スクリプト。

 特定のエリアをしめすキューブに触れたプレイヤーにPlayerScriptをひとつセットしたい、ただそれだけなのに、こんな長いの書かなならんのかい。

 CCKのコンポーネントじゃったら、OnCollideItemTriggerいっぱつで判定できるはずじゃん?

 なんでスクリプトだとこんなに何行も必要やねん……


 とか思っちまうのが、我があさはかさ。

 そもそもOnCollideのなかみに、これ(これ相当のC#のコード)が入っているんですよね。

 うん、知ってた。

 どこも、必要な手続きですよね。

 でも思っちゃったんす。長いよ!


 常にこんな長いの走らせて頻回に客人全チェックさせんのやだなあ。

 Player Scriptをひとつセットしたい、ただそれだけなのに。


 しかたがない、ボタンポチッ (=インタラクト)したときにセットすることにしましょう。

 いすにすわったとき、だと、いすを大量生産しないといけませんから、『インタラクトできるローカルUI』を使いましょう。

 ありがたき先達のページとくびっぴきでつくりました。

 しかし、できてみるとちょっと、ボタンの圧が強いな……

 吾輩なら逃げ帰る自信しかないよ? (どんだけピヨピヨやねん)

 つかなんか、どうも、違和感がぬぐえぬ。


 しかたがない、やっぱり『一定の場所をとおりぬけたときにセット』に再チャレンジしよう。

 だがこれがぜんっっっぜんうまくいかない!

 なんぼなにやってもセットされない(セットされたときにメッセージが出るようにしたんだがこれが出ない)

 うまくいってるほかのとよくよく見比べたら、メッセージをだす先の指定がまちがってた。

『Text』を指定しなきゃならんのに、そのうえのカンバスを指定していた。

 そら出んわ。

 これに気付くまで半日かかった。

 あほやん!


 その後、やっぱし椅子に座った時にセットにしました。

 理由はまず、簡便性と安定性。

 そして、『触れたときにPlayerScriptセット』にこだわった理由が消えたため。

 最初に考えていた構成、すなわちプランAはこう。


 来し方別のワールド入口にくる

  ↓

 そこに仕込んであったキューブに触れると、

1.『ClusterScript発動、プレイヤーにPlayerScriptをセット』

2.『来し方のワールドアドレス』を文字列で取得、変数Aに代入しとく

(文字列はScriptじゃないとあつかえないのでこれ必須!)

  ↓

(手続きるーむでお手続き)

  ↓

 るーむ出口には、『プレイヤーを別のワールドに飛ばす』メソッドBをつけたキューブがある。

 その引数として、変数Aをわたしとく

  ↓

 なんかしてメソッドB発動、ワールドアドレスAのワールドに飛ぶ

 

 しかし調べなおしたらメソッドBなんてものは存在しなかった。

 うちのあいちゃん、ちょっぴりがんばりすぎた模様。

 努力はほめたげたいけど、グッドは上げられない。切なし。


 結局、プレイヤーをもとのワールド(の、お手続き結果別のばしょ)にとばすためには、WorldGateをワールド×結果ぶん、おかなきゃならないのです。

(ワンチャンsetStateCompatでWorldGateのいきさきを入力できるかと思ったが、これで送れるデータに文字列はない。

 よってワールドアドレスを文字列で取得する必要がなくなっちまった。

 オリジナルの関数を作るとか日向の技術レベルではむり、というかClusterのワールドで超多分ぜったい動かん)


 つかもう『一日一回制限』なくそう。それだけで、キャリーオーバーできなくてもう一度来いにゃーがなくなる。ワールドゲートへらせるわ。

 この決断が、のちに大きな転機となることを、日向はまだ、知らない。



第二章 伝えたくて、伝わらなくて ~PlayerScriptにデータを送れない?! の巻~


 というわけでプランBにいきました。


 来し方別のワールド入口にくる

  ↓

 そこに仕込んであったキューブに触れると、

0.来し方をPlayer属性のデータAとしてゲット(整数)

1.『ClusterScript発動、プレイヤーにPlayerScriptをセット』

  ↓

(手続きるーむでお手続き)

  ↓

 るーむ出口には、侵入したプレイヤーを、変数Aに応じた場所(このワールド内)に飛ばすメソッドをつけた円筒をおいとく。

  ↓

 飛んだ場所にはワールドゲートがあり、問答無用で送還。


 つまり『そこまでのみちのりでPlayerのデータとして登録された来し方 (整数で表現)』をゲットしといて

それを使って移動先(=おかえりワールドゲートのどれの座標に飛ばすのか)を算出しましょうってことです。

 そうすれば、おかえりワールドゲートへの移動のためのスポーンポイントを作らないですむ。スポーンポイント管理の労が減る。


 だがしかし、それをしようとしたらなんかそれまで出ていたテスト用テキストさえ出なくなる。

 さんざん調べて原因は『PlayerScript内で、getStateCompatをやろうとした(=現時点、それはできない)』だとわかる。

 いやこれわかんないよ……

 調べるのに半日かかったよ……

 いや前回これに似たのやらかしてたよな……

 ええ、ぶっちゃけわすれてました。


 まあ『ない』ってことはItemScriptのほうでやってPlayerScriptにSendするんだよねっとわかったんだけど、またひっかかる。記法がイマイチよくわからない。

$.send(player)……

 て書く例と、

player.send("send", "")

 て書く例がみつかってどうしたらいいのかわからん。

 いくつかのサイト様めぐって後者でいくことにする。

(sendToは、PlayerScriptのなかじゃないとできないよ!)


 さらには、受け側の記法もよくわからん。

 どこに書いたのがどう入るんだよ。呼応がわからん。

 なんとか、sendもしくはOnReceive(荷札,荷物のなかみ,荷送り主)ってかんじなんだなーと理解。


 だがこれをつけたらもうまったくメッセージが出なくなった。

 記法は完全に正しいはずなんだが……

 細切れ時間をつかってチェックしてチェックしてもはや総当たり戦だがとにかく出ない。

 いったん、メッセ送る関連部分(送り・受け・代入)全部消したらやっと出てきた。

 どれかだけではだめ。

 これはもうお手上げか。


 最後の頼みの綱、コンソールをオンにしてログを出力してみたら、案の定、シンタックスエラーが出ているそうな。

<1:11>と<27:30>。

 ふと思いついて、変数名を直してみた。(from.Noをfromに)

 そしたら<1:11>がなくなった。

 そしてメッセージも出るようになった!

 うそやろsaveObject.playCountってのつかっとるやん予約語かfrom.Noっ( ´∀` )

 もしくはなにか;とかがなかったか? 


 ともあれ減ったのはよいのでそれでいくが(つか言及されてるスクリプトがこれでまちがってないこと確定。ただ、原形のマトモにうごくキャリーオーバーシステムにつけかえてもこれは出る)、やはりアイテムスクリプト側からのsendはなされてないかんじ。


(前略),"type":"ScriptLog_Error","message":"SyntaxError: Unexpected token ILLEGAL at <27:30>","kind":"ScriptableItem"}


 改行などで増減しても<27:30>はかわらず。

 調べてみると、こういうのはかっこがとじていないのが理由らしいが、どのかっこも閉じているのをエディタ上で確認できている。


 きちんと動いているものでもこれは出るので意味不明だが、ともあれこのシンタックスエラーに由来しない問題がsend部分まわりにあることがこれで判明。

 letでの変数宣言は、エラーが出たり、でなかったり。とりあえずとっぱらった。

(player側ではしとかないとReferenceErrorが出る)


 その後ほかのサイト様からコピペらせていただいたりしたが、なにをやってもだめ。

 うちのアイテムスクリプト、どうやらメッセージ送れないん?


 その後詳しい人に聞いてみたところ、<27:30>の原因はそもそもスクリプトを記載したjsonファイルそのものの文字コードがちがうのではないかとのこと。

 日本語SHIFT_JISにしてみる。直らない。

 おすすめされているUTFN(BOMなし)にしてみる。するとみごとに<27:30>どころかログがまっしろになった。すげえ!

 しかしやっぱりメッセージは送れていない。


 logを吐いてもらうと、sendからReceiveへの受け渡し自体は成立している。つまり、そのあとのセットができていないということ。

 もしかして、ifやswitchなどをかませて、もう一段階深くしないと、代入は不可能なのか?


 ここでふと思い出す。

 playerScriptにはStateがない、かわりにグローバル変数を使う。

 だが、グローバル変数は定期的にリセットされるそうな。

 じゃあ、リセットのすきを与えなければいい。

 onReceiveのおわりかっこを、メッセージ表示のあとまでもってきた。

 そしたらできた。

 できたあああああああああ!!



 いつものごとく三日かかった。

 ここまで食いついた理由は、まあ、気に食わなかったんです。

 ほかの人はできている、当然できるはずのことが、自分だけできないのは嫌。

 まあ我が人生そんなんばっかですが(※日向は極度の運動音痴+不器用。リズム感も当然ない)。



 まとめ!

 Playerscriptのグローバル変数は、{}を出るとリセットされるよ!

 セットした値を使いたい処理は、全部なかにいれとこうね!!





 でもそのあとふと、考え付いたんです。

 ワールドゲートからキャリオバワールドくるやん?

 おことわりはなくしたから、手続きルームでいすすわったりとかしたら、そこで5000共通チップをゲットやん?

 そしたらもう、席立ってクラスターメニューの履歴から帰っちゃってよくね?


 もとのワールドで手続きいったよフラグたてとけば、かえってきたときに『おつかれー』ルームいくようにできるから、そのとき5000取られるーでよくない?

 こうしておけば、通信エラーでキャリオバワールド入りそこねても、またもとのワールドからいきなおせばいい。

 手続きルーム入ったけど5000もらえてないよ! は、はいったときに受け取りOKフラグをたて、うけとったあと受け取りOKフラグを消し、受け取りOKフラグがたってるときにこのワールドにきたら問答無用受け取りルームにスポーンとすればいいだけのはなし。

 コンポーネントだけでできます。やってました、これは。


 ああ、スクリプト、いらんかったやん。

 ちょっと仕組みを変えれば、それで。


 つか、いろいろあちこち読み漁ったくせに、いまいち理解できてなかった。

 結果、総当たりみたくして正解をみつけるしかなかった。

 この三日間、なにしてたんだろう。

 無駄ではなかったと信じたい。


 まあね、よく知らない分野の話って、聞いても結局、ちゃんと理解できないからね。

 頭の中にスキーマができてないからね。

 このくらい端的に書いとけば、きょうのことをかっぽり忘れた未来の私も一発理解できることでしょう。

 書いたことを忘れなければ、の話ですが……((((;゜Д゜))))ガクガクブルブル



 でも結局は、CCKとの合わせ技でおかえりルームに一括とばせるシステム(いま命名)にスクリプトがあるとべんりで、この経験もちょっと活かせたのでよしとしましょう。

 logでログはいてもらうとチェックはかどるよ!(つか、ないとムリゲー)



追記:

 その後再びいろいろ実験した結果、やはり『預入時には、ワールド側の預入ルームの徴収エリアで5000を支払い、転送の台座の前へ』『この時点で途中退室となったら、専用の看板をおしてその内側・転送の台座の前に飛ぶことで、追加払いなしでリトライできる』のセットのほうがよいことがわかりました。

(現行に『看板でリトライ』――旧ファームに入れた救済措置です――の組み合わせです)

 そのため、実際のアップデートではそのようにしております。

 当時このように考えていた記録としてお納めくださいませ。


参考(敬称略)


cluster PlayerScriptの役割と$.setPlayerScriptについて|Muku

https://note.com/summon_battle/n/nb00d16cda4d4


【Cluster ベータ機能】目の前にアイテムを出現させるUIボタン

https://zenn.dev/toruto/articles/d453e9ac276d4d


かせーさんのポスト

https://x.com/kasei_s/status/2033955206992625767


ClusterでNPCを作ったときのメモ|Ryo-ta

https://note.com/ryota1211/n/n9c635f659a70


座る位置を自動調整する椅子のClusterScript

https://zenn.dev/vkao/articles/ebc54353d41020


Cluster Script関係メモ(βもあり)|かせー

https://note.com/kasei_s/n/nf6a30f35a2b5


次回は『チビ猫、にんじんの芽をパーティクルで生やし、イースターの金色うさちゃんをあちこち隠す』4/3投稿予定です!

どうぞ、お楽しみに!


ようやく新ワールド上梓出来ました。

そっとアドレス貼り候。

お暇ご興味ござりましたらぜひいらしてくださいませ!


ツリータワー・のんびりファームI ~卯月~ ☆クラフトモード使えます!

https://cluster.mu/w/2d640e58-1d5c-48ab-8cb1-b314c01fb1e3


ツリータワー・のんびりファームII ~卯月~ ☆クラフトモード使えます!

https://cluster.mu/w/185889c9-6054-40eb-8276-f974f1a40372


ツリータワー・のんびりファームIII ~卯月~ ☆クラフトモード使えます!

https://cluster.mu/w/7f627020-ebd0-4968-9113-be0eeaa760fc


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

↑ページトップへ