Skip to content

Instantly share code, notes, and snippets.

@hobione2k
Last active April 14, 2025 17:12
Show Gist options
  • Save hobione2k/6adeb4c8010a0c368d09fffc0d41942a to your computer and use it in GitHub Desktop.
Save hobione2k/6adeb4c8010a0c368d09fffc0d41942a to your computer and use it in GitHub Desktop.
ClusterScript ボイスエリア
// エリアに入ったプレイヤーにグループを設定するやつ //
// こちらの記事のサンプルのMixerプレハブが必須
// https://creator.cluster.mu/2025/04/14/voicevolumerateof-sample/
// OverlapDetectorShapeコンポーネントが必要
const DEFAULT_GROUP = 0; // デフォルトのグループ
// groupIDを取得
const getGroupId = () => $.getStateCompat("this", "group", "integer");
// getOverlaps()からPlayerHandleをまとめて取得
const getOverlapsPlayer = () => {
const overlaps = $.getOverlaps();
const players = overlaps
.map((o) => o.handle)
.filter((h) => h?.type === "player");
return players;
};
// プレイヤー重複排除
const dedupPlayer = (players) =>
players.filter((p, i) => players.findIndex((p2) => p2.id == p.id) === i);
$.onUpdate((deltaTime) => {
const prevPlayers = $.state.players || []; // 前のプレイヤー
// 重なっているプレイヤーを検出
const players = dedupPlayer(getOverlapsPlayer());
// 新規プレイヤーを取得
const newPlayers = players.filter(
(p) => !prevPlayers.some((prev) => prev.id == p.id)
);
const leavePlayers = prevPlayers.filter(
(prev) => prev.exists() && !players.some((p) => p.id == prev.id)
);
// Debug用
// if (newPlayers.length>0) $.log(newPlayers);
// if (leavePlayers.length>0) $.log(leavePlayers);
// プレイヤーを保存
$.state.players = players;
// 新規プレイヤーにgroupを設定
const group = getGroupId();
newPlayers.forEach((player) => {
player.send("group", group);
});
// 離れたプレイヤーにデフォルトgroupを設定
leavePlayers.forEach((player) => {
player.send("group", DEFAULT_GROUP);
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment