見出し画像

クラフトアイテムで楽屋口をつくる方法

1 はじめに

音楽ホールには
スタッフしか通れない楽屋口があります

舞台と客席の導線を
明確に区分するためのものですが
セキュリティを確保したり
『もぎり』での混乱を回避したりする
実務的な効果があります

また、副次的ではありますが
舞台そのものを聖域化する
演出上の特別な効果をもたらします

この記事は
Cluster『ワールドクラフト』の
クラフトアイテムで
楽屋口をつくりたい方に向けて
執筆しています

2 楽屋口 ~スタッフ判定システム~

3 機能の概要

① プレイヤーネーム内の文字列判定機能

プレイヤーネーム内の任意の
文字列(例『staff』)を
判別してワープ先を分岐させる機能
※セキュリティを担保するものではありません

② パスワード判定機能

パスワード(例『634』)を
判別して正答者のみワープさせる機能
※行事毎に変えてセキュリティを担保します

4 先人たちの知恵

上記の機能を実現するために参考にした記事

・ ネームを読む『vinsさん』のscript

・ パスを設定する『きえらさん』のscript

5 事前の準備

3Dモデル(例『PASS WORD』)を
Unity に読み込みCCKでコライダーを付け
コンポーネントで
『Scriptable Item』を追加します
動画の①②機能の3Dモデルは
メッシュが異なりますが
アイテムの設定は両方とも同じです

アイテム設定

6 Script

① プレイヤーネーム内の文字列判定機能のScript

const updatePerSec = 0.5; //何秒に一度チェックするか?
const distance = 2.0; //何m以内に来たらあいさつするか? 

function initProc() {
  $.state.isInitialized = true;
  $.state.tick = 0;
}

$.onUpdate((deltaTime) => {
  //初期化処理
  if (!$.state.isInitialized) {
    initProc();
  }

  //一定間隔でしか更新しない
  $.state.tick += deltaTime;
  if($.state.tick < updatePerSec) return;
  $.state.tick -= updatePerSec;

  $.getPlayersNear($.getPosition(), distance).forEach((player) => {
    //近くのユーザー名を取得
    let userDisplayName = player.userDisplayName;
    let text = userDisplayName;
    	if (text.includes("staff")) { 
        	player.setPosition(new Vector3(0,0,0));
        } else {
		    player.setPosition(new Vector3(1,1,1));
        }
  });
});

カスタムポイント

const distance = 2.0; 
//2.0の値を変えることでプレイヤーを感知する距離を変更できます
$.getPlayersNear($.getPosition(), distance).forEach((player) => {
    //近くのユーザー名を取得
    let userDisplayName = player.userDisplayName;
    let text = userDisplayName;
    	if (text.includes("staff")) {
        //("")内の文字列を変えることでワープを分岐させる対象を変更できます 
        	player.setPosition(new Vector3(0,0,0));
      //x,y,z座標の値を変えることで対象者のワープ位置を変更できます 
        } else {
		    player.setPosition(new Vector3(1,1,1));
      //x,y,z座標の値を変えることで対象者以外の者のワープ位置を変更できます
        }
 });

② パスワード判定機能のScript

const requestMeta = "入室確認";// requestTextInputを識別するために使う
const output = "Password";        

const defArr = ["634"];    // 指定したい単語の配列

var accept = 0;

//効果音定義
const se = $.audio("Audio1");

$.onTextInput((text, meta, status) => {
    switch (status) {
        case TextInputStatus.Success:
               if (defArr.includes(text)) { 
                  // 入力文字がdefArrの中に入っているときの処理を書く
                  $.log("Accept");
                  //許諾ビット
                  accept = 1
               }
            break;
    }
});

$.onInteract(player => {
    $.state.count++;
          switch(accept) {
                case 0:
		            try {
                        player.requestTextInput(requestMeta, output);
                        se.play();
                    } catch (e) {
                        // $.log(e);
                    }
                break;

     	        case 1:
		                player.setPosition(new Vector3(0,0,0));
                        $.log("Warp");
                        //許諾ビット
                        accept = 0
                break;
        }    
})


カスタムポイント

const defArr = ["634"];
//[""]内の文字列を変えることでパスワードを変更できます
player.setPosition(new Vector3(0,0,0));
//x,y,z座標の値を変えることでパスワード入力後のインタラクトワープ位置を変更できます

7 Special Thanks

これらのScriptは
先に紹介した偉大な方々のScriptでできてます
vinsさんときえらさんのお二人に感謝です

8 World & YouTubeShorts