$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Macでコマンド一発で特定のアプリケーションのウインドウを指定サイズにする

cluster.mu

clusterでこちらのイベントスタッフをやることになり、そこでYouTube用のアーカイブ動画を撮る役割を担うことになった。うまくYouTubeにアップロードするために、OBSを使ってclusterをYouTubeに適切な16:9サイズ + ヘッダー無しで録画したいと考えた。

ただ意外とMacで指定のウインドウサイズに変更することが難しかったので、やってみたことをメモする。

ターミナルでコマンド一発で変更する方式

osascriptコマンドでAppleScriptを実行することでウインドウサイズを変更できる。同じ手法がhttps://dev.classmethod.jp/articles/mac-app-resize/で紹介されているが、最近のmacOSのプライバシー周りの変更などでうまく動かなくなっていたので調整した。

まずAppleScript的には以下のようにすると、clusterのウインドウサイズを1920x1080に変更できる。

set theSize to {1920, 1080} -- user set as desired

tell application "System Events"
    tell process "cluster"
        set size of every window to theSize
    end tell
end tell

これをターミナルで柔軟に実行できるようにしたbashのスクリプトが以下。

resize-window

#!/bin/bash

APP_NAME=$1
WIDTH=$2
HEIGHT=$3

osascript \
-e "set theSize to {$WIDTH, $HEIGHT}" \
-e 'tell application "System Events"' \
-e "    tell process \"$APP_NAME\"" \
-e '        set size of every window to theSize' \
-e '    end tell' \
-e 'end tell'

このスクリプトをresize-windowという名前で保存しておけば、ターミナルでこのようにアプリケーション名、幅、高さを指定して実行できる。

$ resize-window cluster 1920 1080

ちなみにこのコマンドを実行するターミナルアプリケーションにはプライバシーとセキュリティ > アクセシビリティの権限を与えておく必要があるので注意。

ショートカットアプリを使う方式

同僚に教えてもらったが、ショートカットアプリを使う方式もあるようだ。たとえば以下のように設定する。

このようにしてショートカットを実行するとclusterアプリケーションのウインドウサイズを16:9に変更できる。高さの指定が1080+28になっているのは、後からOBSでヘッダー領域をクロップしたときに16:9になるように調整したものだ。

まとめ

Macで特定アプリケーションウインドウを指定サイズにするのは意外と難しい。今回のやり方が誰かの役に立てば嬉しい。

【cluster】スイッチで風景とスクリーンを出しわけする

clusterの推しアバター展示場で作業配信をすることがありスクリーンを設置しているのですが、初めからスクリーンが出ているのは展示場としては不恰好で嫌だなと思っていました。

そこで最初は風景が出ているけどスイッチを押すとスクリーンが出るようにしてみました。対応したワールドは以下のリンクから入れるので、良ければ入ってみてください。

cluster.mu

どうなったか

このように最初は風景として木があるだけだが、スイッチを押すと元々の木がなくなりスクリーンと椅子が出てくるようになりました。

やり方

以下を参考にしました。

基本は「オブジェクト・照明を出したり消したりするスイッチ」を参考にしつつ、元々は風景を表示しておくという部分が違ったので少し改変をしました。構成を図に書くとこういう感じです。

Switchを押すとWhenActiveとWhenInactiveが入れ替わるサンプルをunitypackageとしてGoogle Driveにあげてみたのでよければ参考にしてください。以下のunitypackageではスイッチを押すごとにキューブとスフィアが入れ替わるようになっています。 https://drive.google.com/file/d/1wgxgkCNy2JPLm0u4drE5eJ9UZ9qduatC/view?usp=sharing

Unity Editorで子オブジェクトでもWorld Positionをインスペクタで表示したい

Unity Editorで子オブジェクトにするとインスペクタ上でLocal Positionしか出なくなってしまう。World Positionだけをコンポーネントとしてコピーする方法もあるのだけど、他のオブジェクトをこのオブジェクトとX軸だけ合わせたいんだよな〜と思った時には難しい。

そのためインスペクタ上でWorld Positionも一緒に表示したいと思い調べてみると、Unityで親子関係のある子オブジェクトのワールド座標(絶対座標、外部座標)をインスペクタに表示する方法 - 結果だけでなく過程も見てくださいというめちゃくちゃ便利なやつを見つけた!これを導入することでUnity Editor上でこんな感じになる。

上の記事を参考にし、少しシンプルにしたものを置いておく。自分のプロジェクトのAssets/Editor/WorldPositionInspector.cs に置いてRefreshすればできるはず。

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Transform))]
public class WorldPositionInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        Transform transform = (Transform)target;
        EditorGUILayout.Space();
        EditorGUILayout.Vector3Field("World Position", transform.position);
    }
}