clusterゾーニングチャット実装サンプル(ローカル動作版)

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;

  }

});

タイトルとURLをコピーしました