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)。
(getHumanoidBonePosition/getHumanoidBoneRotation)
※プレーヤー間でデータのやりとりする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】
回転系のVector3とQuaternionの変換
Quaternion -> Vector3
→ $.getRotation().createEulerAngles()
Vector3 -> Quaternion
→ (new Quaternion()).setFromEulerAngles("回転を表すVector3データ")
【Tips】
移動量(ベクトルの長さ)
[2点間]
「(new Vector2(x,y)).length」
[3次元空間]
「(new Vector3(x,y,z)).length」
で、ベクトルの長さが求まる。
(三角関数などの手間が省ける)