clusterのワールドでローカルで動作するゾーニングチャットのスクリプトを作ってみました。全体チャットと別にエリアごとで独立したチャットを実現します。
Clusterゾーニングチャット - ナビズ企画 - BOOTH
clusterのワールド内で、独立した個別のチャットができるギミック一式です。 エリアを分割して楽しむワールドなどでは便利と思うのでぜひご自由にお使いください。 投稿時の成功音、失敗音のサウンドは未設定ですのでaudioSourceに各自お...
オブジェクト構成
NavicoZoneChat(Scritable Item)
├ subText(Text View)
├ subAudio1(AudioSource)
└ subAudio2(AudioSource)
clusterスクリプト
/*
プログラム名:Navico 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");
/* 初期化処理 */
$.onUpdate(deltaTime => {
// 出力テキスト初期化
if (!$.state.initialize) {
$.state.initialize = true;
$.state["msg"] = "";
}
});
/* 入力処理 */
$.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;
}
});