見出し画像

Cluster Script関係メモ(基本β)

[公式リファレンス]

cluster Cluster Creator Kit ドキュメント

Cluster Creator Kit Script Reference

[Cluster Creator Kit Scriptの基本概念など(Index)]

[Cluster Creator Kit Script の詳細説明(Module)]

Cluster Creator Kit Script(cluster-script-types)を書くに当たり、
npmでTypeScript型定義ファイルを公開しているサイト。
Visual Studio Codeなど対応しているエディタで読み込めば、
エディタの入力補完してくれる。

[公式ガイド:ベータ機能]


【参考補助情報】VisualStudioCodeでのインテリセンス(入力補完)の設定


ClusterScriptの保存文字コード

「UTF-8(BOMなし)」にした方がよさそう。
※VisualStudioCodeを使っていれば意識する必要はないです。


PlayerHandle関連

このハンドルを使うと、Playerが存在しているかや各プレイヤー位置や向きの参照/変更などが可能。
各ボーンの位置や回転も参照可能(HumanoidBone)。
getHumanoidBonePositiongetHumanoidBoneRotation
※プレーヤー間でデータのやりとりするI/Fは、
 2023/9/21現在用意されていない。


PlayerHandle取得方法

ClusterScriptの
getOverlaps
  (返値:Overlap[].object.playerHandle)
 ※Overlap[].selfNodeが"ClusterScript"の場合も取得は可能そう
getPlayersNear」(返値:PlayerHandle[])
onCollide」(引き数:Collision.object.playerHandle)
onGrab」(引き数:playerHandle)
onInteract」(引き数:playerHandle)
onRide」(引き数:playerHandle)
onUse」(引き数:playerHandle)
raycast」(返値:RaycastResult.object.playerHandle )
raycastAll」(返値:RaycastResult[].object.playerHandle )

ItemHandle関連

このハンドルを使うと、Itemが存在しているかや各Itemに対して重心や重力などの値を設定可能。
sendを使うとItemHandleがわかれば、
別のアイテムに対して配列などの値(参照:Sendable)を送信可能。
※アイテム間でデータのやりとりが可能
sendで送られた値はonReceiveで受け取れる。


ItemHandle取得方法

ClusterScriptの
createItem」(返値:PlayerHandle)
 ※このメソッドを使う場合は、cluster Cluster Creator Kit ドキュメント
  「クラフトアイテムの情報取得」を事前に参照
getItemsNear」(返値:PlayerHandle[])
getOverlaps
  (引き数:Overlap[].object.itemHandle)
 ※Overlap[].selfNodeが"ClusterScript"の場合も取得は可能そう「onCollide」(引き数:Collision.object.itemHandle)
onReceive」(引き数:itemHandle)
raycast」(返値:RaycastResult.object.itemHandle)
raycastAll」(返値:RaycastResult[].object.itemHandle)


ApiAudio

Scriptから$.audio経由でApiAUdioを呼びだしAudioを使う場合は、
シーンに対して事前に
Item Audio Set List」に音を一通り登録しておく必要がある。
シーンに仕込んだIDを与えることで、その音に対して制御が出来る。

参考ガイド

humanoidAnimation

ScriptからHumanoid Animationアニメーションのポーズを取得したい場合は、シーンに対して事前に「HumanoidAnimationList」に
AnimationClipを一通り登録しておく必要がある。
$.humanoidAnimationの引き数に、シーンに仕込んだIDを与えることで、
そのアニメーションデータを取得できる出来る。
姿勢などの情報も取得可能。
(値の型は「HumanoidPose」)

// HumanoidAnimationListで設定したIDから目的のアニメーションデータを取得。
const humanoid_anim = $.humanoidAnimation(ID);

// アニメーションデータから、指定した時間のアニメーションサンプルを取得
// ※アニメーションの最大秒数は、「humanoid_anim.getLength()」で取得可能。(型:number)
//   (小数点を設定できるので、1秒以下なども0.5などと指定可能)
// 返値の型は、「HumanoidPose」
const humanoid_pose = humanoid_anim.getSample(姿勢を取得したいアニメーションタイム);

// 取得した、「HumanoidPose」のポーズデータmusclesのFrontBackの値を表示。
$.log(humanoid_pose.muscles.chestFrontBack); 

【参考】


【Tips】
humanoidAnimationで取得したアニメーションデータをPlayerに設定する。

PlayerHandleにある、「setHumanoidPose」を使用する。

// アイテムを掴んでいる間、ポーズを変更する。(そのポーズに固定されるので実用性はない。。。)
$.onGrab((isGrab, isLeftHande, player) => {
  if (isGrab) {
  // HumanoidAnimationListに登録したIDを指定して、アニメーションデータ取得(HumanoidPose)
   const humanoid_anim = $.humanoidAnimation(ID);
    if (humanoid_anim.getLength() >= 0.5) {
      // 取得したアニメーションデータの0.5秒目のアニメデータ取得
     const humanoid_pose = humanoid_anim.getSample(0.5);
      
      if (humanoid_pose.muscles != null)
      {
        // 取得したアニメーションポーズを反映する
        player.setHumanoidPose(humanoid_pose);
      }
  } else {
    player.setHumanoidPose(null);  // ポーズを元に戻す。
  }
});

【Tips】
Playerの各ボーンの位置や回転情報を取得する

PlayerHandleにある
---
ポーズ:getHumanoidBonePosition
回転 :getHumanoidBoneRotation
---
を使用する。
引数に指定する、取得するボーンの位置値指定は、
HumanoidBone」を使って指定する。
HumanoidBoneは、Cluster Creator Kit Scriptで事前に定義された
 固定値の集まり(Enumeration)。


 「HumanoidBone」(固定値:Enumeration)
      と
 「HumanoidPose」(クラス:Class)
  
は、名称は似てるけど、まったく別物なので要注意。

// IntractしたPlayerのHeadボーンの位置や回転情報を取得する
$.onInteract(player => {
    // Headボーンの位置情報を取得(返ってくる型:Vector3 or null)
    const bone_pos = player.getHumanoidBonePosition(HumanoidBone.Head);

    // Headボーンの回転情報を取得(返ってくる型:Quaternion or null)
    const bone_ret = player.getHumanoidBoneRotation(HumanoidBone.Head);
});

【参考】

【Tips】
回転系のVector3Quaternionの変換

Quaternion -> Vector3
  → $.getRotation().createEulerAngles()
Vector3 -> Quaternion
  → (new Quaternion()).setFromEulerAngles("回転を表すVector3データ")

【Tips】
移動量(ベクトルの長さ)

[2点間]
「(new Vector2(x,y)).length」
[3次元空間]
「(new Vector3(x,y,z)).length」

で、ベクトルの長さが求まる。
(三角関数などの手間が省ける)