clusterのワールドでローカルで動作するゾーニングチャットのスクリプトを作ってみました。全体チャットと別にエリアごとで独立したチャットを実現します。

【無料】clusterゾーニングチャットアセット(改変・商用可) - なび公のお店 - BOOTH
clusterのワールド内で、独立した個別のチャットができるギミック一式です。 エリアを分割して楽しむワールドなどでは便利と思うのでぜひご自由にお使いください。 投稿時の成功音、失敗音、削除音のサウン...
オブジェクト構成
Main(Scritable Item)
├ subText(Text View)
├ subAudio1(AudioSource)
├ subAudio2(AudioSource)
└ subAudio3(AudioSource)
Clear(InteractItemTrigger -> SpecifiedItem:clear Bool:true)
clusterスクリプト
/*
プログラム名:Navicoo Zone Chat
プログラム説明:clusterワールドで単体で動作する独立したチャットです。
作成者:なび公(https://x.com/metaverse_navi)
*/
const maxsize = 100; // 最大文字数
const kaigyo = 30; // 改行文字数
const maxline = 25; // 最大行数
const subText = $.subNode("subText");
const subAudio1 = $.subNode("subAudio1");
const subAudio2 = $.subNode("subAudio2");
const subAudio3 = $.subNode("subAudio3");
/* 初期化処理 */
$.onUpdate(deltaTime => {
// 初期設定
if (!$.state.initialize) {
$.state.initialize = true;
$.state["msg"] = "";
$.state.time = 0.0;
}
if($.getStateCompat("this","clear","boolean")){
// メッセージ削除
$.state["msg"] = "";
subText.setText($.state["msg"]);
$.setStateCompat("this", "clear", false);
// 削除音出力
subAudio3.setEnabled(true);
}
});
/* 入力処理 */
$.onInteract((playerHandle) => {
subAudio1.setEnabled(false);
subAudio2.setEnabled(false);
let yourname = playerHandle.userDisplayName;
playerHandle.requestTextInput(yourname, "100文字以内で投稿してください。");
});
/* テキスト保持・出力処理 */
$.onTextInput((text, meta, status) => {
switch(status) {
case TextInputStatus.Success:
// 入力がある場合
if(text != "" && meta != ""){
// テキスト分解(1文字ずつ)
let msgArray = text.split('');
// 文字数制限チェック
if(msgArray.length > maxsize){
// 失敗音出力
subAudio2.setEnabled(true);
exit;
}
// 改行付加
let msg = "";
for(let i = 0; i < msgArray.length; i++){
msg += msgArray[i];
if(i != 0 && i % kaigyo == 0){
msg += "\n";
}
}
// テキスト連結
msg = meta + ':\n' + msg + '\n' + $.state["msg"];
// 最大行数調整
msgArray = [];
msgArray = msg.split('\n');
msg = "";
for(let i = 0; i < msgArray.length; i++){
if(i < maxline){
msg += msgArray[i] + "\n";
} else {
break;
}
}
// 文字列格納
$.state["msg"] = msg;
// テキストの出力
subText.setText($.state["msg"]);
// 成功音出力
subAudio1.setEnabled(true);
}
case TextInputStatus.Busy:
$.state.should_retry = false;
break;
case TextInputStatus.Refused:
$.state.should_retry = false;
break;
}
});


