開発者向けの機能

デベロッパーメニュー

clusterにはワールドを作成しているクリエイター向けの機能が用意されています。
それらの機能はデベロッパーメニューから有効化したり利用したりできます。
デベロッパーメニューの有効化の方法やデベロッパーメニューへのアクセス方法はヘルプページをご覧ください。

スラッシュコマンド

スラッシュコマンドとは、コメント欄に / から始まる文字列を入力し送信することで様々な機能を実行できる機能です。
スラッシュコマンドはデベロッパーメニューから有効化することができます。

送信したスラッシュコマンドやその結果は他のユーザーからは見えません。

一部のスラッシュコマンドにはパラメータを指定するものがあります。
コマンドやパラメータは半角スペースで区切って入力する必要があります。

現在、スラッシュコマンドには以下のコマンドが用意されています。

  • /getmyposition
    • 自身の現在座標を表示します。
      ワールドクリエイターのみが実行できます。
  • /getmypos
    • /getmyposition の省略形です。
  • /help
    • スラッシュコマンドの一覧を表示します。
  • /item destroy itemID
    • itemID で表されるアイテムを削除します。ワールド設置アイテムは削除ができません。
      ワールドクリエイターのみが実行できます。
  • /item owner itemID
    • itemID で表されるアイテムの現在のオーナーであるユーザーのIDをコンソールに表示します。
      ワールドクリエイターのみが実行できます。
  • /item state itemID
    • itemID で表されるアイテムのステートに設定されている一覧をコンソールに表示します。
      アイテムクリエイターのみが実行できます。
  • /item state itemID key
    • itemID で表されるアイテムのステートに設定されている、keyで取得できる値をコンソールに表示します。
      アイテムクリエイターのみが実行できます。
  • /item state itemID key type value
    • itemID で表されるアイテムのステートに、プロパティ名がkeyで型がtypeの値valueを書き込みます。
      アイテムクリエイターのみが実行できます。
      typeには各Sendable型に対応する以下の文字列、およびnullのいずれかを指定できます。

      • number: 数値に対応します
      • string: 文字列に対応します
      • bool: booleanに対応します
      • vec2: Vector2に対応します
      • vec3: Vector3に対応します
      • quaternion: Quaternionに対応します
      • playerHandle: PlayerHandleに対応します
      • itemHandle: ItemHandleに対応します
      • array: 配列に対応します
      • object: objectに対応します

      valueの記法については valueの生成規則を参照してください。

  • /items
    • 空間内のScriptableItem コンポーネントを持つアイテムのID一覧をコンソールに表示します。
      表示されるIDはItemHandle.idで取得できるものと同等です。
      ワールドクリエイターのみが実行できます。
  • /respawn
    • 自身をリスポーンさせます。
      ワールドクリエイターのみが実行できます。
  • /users
    • 空間内のユーザーのID一覧をコンソールに表示します。
      表示されるIDはPlayerHandle.idで取得できるものと同等です。 ワールドクリエイターのみが実行できます。
  • /warp x y z
    • 自身を(x y z)で指定する座標にワープさせます。
      ワールドクリエイターのみが実行できます。

valueの生成規則

/item state itemID key type value で使用するvalueの生成規則は以下の通りです。

  • <value> -> <null> | <number> | <bool> | <string> | <vec2> | <vec3> | <quaternion> | <itemHandle> | <playerHandle> | <array> | <object>
  • <null> -> null
  • <number> -> 数値 | NaN | Infinity | -Infinity
  • <bool> -> true | false
  • <string> -> “<string_element>
    • <string_element> -> 文字列
  • <vec2> -> (<number> <number>)
  • <vec3> -> (<number> <number> <number>)
  • <quaternion> -> (<number> <number> <number> <number>)
  • <itemHandle> -> item-<itemId>
    • <itemId> -> ItemHandle.idで取得できるものと同等の文字列
  • <playerHandle> -> player-<playerId>
  • <array> -> [<array_element>]
    • <array_element> -> ε | <value> | <value> <array_element>
  • <object> -> {<object_element>}
    • <object_element> -> ε | <object_key>:<value> | <object_key>:<value> <object_element>
    • <object_key> -> 空白を含まない文字列

記述例

  • /item state 123456789 playerData object {targetPlayer:player-a0a-b1b-c2c-d3d-e4e playerName:"player01" position:(1.5 0 -2.5) equipments:[item-12345 item-67890]}
    • IDが123456789であるアイテムのステートに対してplayerDataというkeyで、以下の4つのプロパティを持つオブジェクトを書き込みます。
      • key: targetPlayer, value: IDがa0a-b1b-c2c-d3d-e4eであるプレイヤーのPlayerHandle
      • key: playerName, value: player01 という文字列
      • key: position, value: (1.5, 0, -2.5) のVector3
      • key: equipments, value: 要素が「IDが12345であるアイテムのItemHandle, IDが67890であるアイテムのItemHandle」の2つである配列

ログをすべて表示

有効にすると、クラフトまたはスペース内で発生したすべてのスクリプトのログを表示するようになります。
この機能はPC/Macで使用可能です。

アイテムの名前は32文字まで表示されます。
短時間に大量のログが出力されたり、ログが長かったりする場合、一部のログが表示されない場合があります。

エディタ拡張の開発で利用できる機能

Unity Editor でのエディタ拡張機能として、 Creator Kit ではワールドのアップロード前後にコールバックを登録できます。

Editor 向けに記述された Unity C# コードから ClusterVR.CreatorKit.Editor.EditorEvents.asmdef を参照することで、WorldUploadEvents クラスにアクセスしてワールドのアップロードイベントを処理します。

WorldUploadEvents クラスでは以下の関数が利用できます。

関数機能
RegisterOnWorldUploadStartワールドのアップロード前に呼ばれるコールバック関数を登録します。コールバック関数では、アップロードを続行してよい場合に true を返し、アップロードを中止すべき場合は false を返してください。
RegisterOnWorldUploadEndワールドのアップロードが成功、または失敗した場合に呼ばれるコールバック関数を登録します。

以下のサンプルコードでは、ワールドのアップロード前後にログ出力を行うコールバックを登録します。

using ClusterVR.CreatorKit.Editor.EditorEvents;
using UnityEditor;
using UnityEngine;

public static class MyWorldUploadEventHandler
{
    [InitializeOnLoadMethod]
    public static void Initialize()
    {
        WorldUploadEvents.RegisterOnWorldUploadStart(OnWorldUploadStarted);
        WorldUploadEvents.RegisterOnWorldUploadEnd(OnWorldUploadEnded);
    }

    static bool OnWorldUploadStarted(WorldUploadStartEventData data)
    {
        Debug.Log($"World upload started, root object count = {data.Scene.rootCount}");
        return true;
    }
    
    static void OnWorldUploadEnded(WorldUploadEndEventData data)
    {
        Debug.Log($"World upload ended, success={data.Success}");
    }
}