【cluster】アクセサリー(アバター)判定によるイベント発生ギミック

アクセサリー、またはアバター判定によって指定のアクションを起動します。アクションは、下記3つが選択できます。

・オブジェクト切り替え処理
・商品付与処理
・プレイヤー移動処理

このギミックを要素として関連づけることで複雑なイベントを組み立ててゆきます。

使用例)
・宝箱をクリックすると宝箱が開いてアイテム(アクセサリー)がゲットできる。
・NPCに話しかけるとボイスが再生されてアイテム(アクセサリー)がゲットできる。
・鍵(アクセサリー)を装着して扉をクリックすると扉の中に移動する。

・指定のアバターでNPCに話しかけると屋内に移動できる。

このギミックを使って取得したアクセサリーを利用して、次のイベントに進むといった形で一連のストーリーを作成してみましょう。

※オブジェクト切り替えは他ユーザーにも反映されますのでご注意ください。

オブジェクト構成

Event_***
├ objTrigger(Script Itemable)
├ objBefore(Set Game Object Active Gimmik)item, KEY名, objTrigger ※初期表示
└ objAfter(Set Game Object Active Gimmik)item, KEY名, objTrigger ※初期非表示

スクリプトサンプル

/* ---- 定数定義 ---- */

// 判定種別
const jid = "accessory";
// const jid = "avatar";
// const jid = "none";

// 判定用商品ID
const productArr = [ "商品ID", "商品ID", "商品ID" ];

// 付与商品ID
const productId = "商品ID";

// プレイヤー移動先情報
const pos = new Vector3(0, 0, 0);

// 制御オブジェクト
const key1 = "KEY名"; // 初期表示
const key2 = "KEY名"; // 切替表示

/* ---- メイン処理 ---- */

$.onInteract(player => {

  // 無判定の場合
  if(jid == "none"){

    // オブジェクト切り替え処理
    changeObject();

    // 商品付与処理
    // addProduct(player);

    // プレイヤー移動処理
    // movePlayer(player);

  }

  // アクセサリー判定の場合
  if(jid == "accessory"){

    if(checkAccessory(player)){

      // オブジェクト切り替え処理
      changeObject();

      // 商品付与処理
      // addProduct(player);

      // プレイヤー移動処理
      // movePlayer(player);

    }

  }

  // アバター判定の場合
  if(jid == "avatar"){

    if(checkAvatar(player)){

      // オブジェクト切り替え処理
      changeObject();

      // 商品付与処理
      // addProduct(player);

      // プレイヤー移動処理
      // movePlayer(player);

    }

  }

});

/* ---- 関数 ---- */

// アクセサリー判定処理
function checkAccessory(player){

  let myaccarr = player.getAccessoryProductIds();
  let judge = false;
  for(let i = 0; i < productArr.length; i++){
    for(let j = 0; j < myaccarr.length; j++){
      if (myaccarr[j] === productArr[i]) {
        judge = true;
      }
    }
  }
  return judge;

}

// アバター判定処理
function checkAvatar(player){

  let myavtid = player.getAvatarProductId();
  let judge = fals
  for(let i = 0; i < productArr.length; i++){
    if (myavtid === productArr[i]) {
      judge = true;
    }
  }
  return judge;

}

// オブジェクト切り替え処理
function changeObject(){

  $.setStateCompat("this", key1, false);
  $.setStateCompat("this", key2, true);

}

// 商品付与処理
function addProduct(player){

  player.requestGrantProduct(productId, `${productId}_${player.id}`);

}

// プレイヤー移動処理
function movePlayer(player){

  player.setPosition(pos);

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