この記事は…
- Gather Town Desktop (ブラウザ版ではない) を使っている
- Alfred (フリー版 or 有料版) を使っている
- TypeScript を使っている
方向けの内容です!
※また 身の回りの困りごとを楽しく解決! by Works Human Intelligence Advent Calendar 2024 の 14 日目の方の記事が投稿されてなかったので代わりに投稿しました 🙏
はじめに
Gather Town や MetaLife などの仮想オフィスでは、会議や相談のためにコールボタンを押すのではなくその場所へアバターを移動させる必要があります🏃🏃💨
※もちろん退出する場合も移動が必要
Gather上でたまたま会議室エリアにいたこと忘れて作業に熱中してたら、突然「あれ端羽さんがいる」「今からこのミーティングに使うんで」って追い出されて、ほんとリアルのコミュニケーションと一緒だなと思った。。
— 端羽英子@ビザスク (@eikohashiba) May 27, 2022
それが醍醐味なのか不便なのかはともかく、瞬間移動するためのソリューションがこれまでいくつか開発されてきました。
今回はデスクトップ版の Gather Town でも瞬間移動ツールを作れないか試してみました 🙌
できたもの
手元に Alfred と Node.js の実行環境があったのでそれらで動くツールを作ってみました ⚒️
主な機能は以下のとおり
- Gather Town のプレイヤーや場所の名前が用いられた移動用シェルスクリプトファイル を自動で任意のパスの下に作成する機能
- 自身のアバターの現在地に名前をつけて保存(上記のファイルを作成)する機能
- 指定された マップID と マップ座標(X,Y) の場所へ移動する機能
- 指定された プレイヤーID のプレイヤーの マップ座標(X,Y) を取得しその場所へ移動する機能
これらの機能と Alfred が組み合わさることでサクッと移動できます ✨️
デモ動画 (gif)
Alfred から Gather Town のプレイヤーや場所の名前が用いられた移動用シェルスクリプトファイル
を実行しその場所へ移動する様子↓ 🥷💨🥷
より詳しい使い方は README をご確認ください
使った技術・はまったことなど ①
@gathertown/gather-game-client
今回は Gather Town のソケット API のハンドラーとしてこちらのクライアントライブラリを使ってみました。
API との接続が確率してから自身を含むプレイヤーの情報が利用できるようになるまで少し時間が掛かるので待機する処理が必要でした。
const getPlayers = async () => {
while (!Object.keys(gather.players).length) {
await wait(100);
}
return gather.players;
};
使った技術・はまったことなど ②
sanitize-filename
渡された文字列に対して、ファイル名やディレクトリ名・パスとして無効な文字を削除/置換するなどし安全に使えるようサニタイズしたものを返してくれるライブラリです。
実際によろしくないプレイヤー名の方が社内にいたわけではないのですが念の為使ってみました 🙌
const shFileForAlfred = path.join(shFilesDirForAlfred, `gt-${sanitizeFilename(placeName, { replacement: '_' })}.sh`);
fs.writeFileSync(
shFileForAlfred,
`#!/bin/bash\n${process.argv[0]} ${process.argv[1]} teleport ${player.map},${player.x},${player.y}`,
);
さいごに
今回はデバック中に神出鬼没な存在となってしまったりと楽しく開発できて嬉しかったです! 🥳🥳🥳
殆ど Alfred や便利なライブラリのおかげですがサクッと作れたところも良かったです 💪
今後は Electron で Alfred やシェルスクリプトを挟まずもっと速く動くように改善できたらなと思います 💪💪
ここまで、ご高覧ありがとうございました!