ゆに帳(Unityの覚え書き)

Unity+メモ帳でゆに帳です。

AndroidのKeystoreとKeyのパスワードをUnity起動時に自動入力する

はじめに

 UnityでAndroid Player設定のPublishing SettingsでKeystoreを設定すると、Unity起動時に(より正確にはビルド時に)KeystoreとKeyのパスワードを入力する必要があります。パスワードを入力せずにビルドするとエラーで止まりまるため、ちょっと忘れただけでストレスの原因になります。

 ちょっと調べ物をしていたら、解決策を見つけたのでここに残しておきます。

解決策

Unity – auto set Android password in project – Da Viking Codeで紹介されている方法は、以下のコードをAssetフォルダ以下のEditorフォルダ内に.csファイルを作成して書き込みます。ファイル名は何でもいいです。迷ったらSettingKeystorePassword.csなど分かりやすい名前を付けましょう。

using UnityEngine;
using UnityEditor;
 
[InitializeOnLoad]
public class StartUp {
 
    #if UNITY_EDITOR
 
    static StartUp() {
 
        PlayerSettings.keystorePass = "myPwd";
        PlayerSettings.keyaliasPass = "myAliasPwd";
    }
 
    #endif
}

 記事内ではKeystoreのパスを自動で渡す方法も書いてありますが、こちらは一度設定すれば、その後設定し直すことはまずないので、ここでの紹介は割愛します。必要であれば記事の方を参照してください。

欠点

 パスワードが平文で保存されてしまうため、もしコードが流出するなどのアクシデントがあればパスワードも読めてしまうこと。

 Android Player 設定 - Unity マニュアルには、以下の引用のような記述があるため、その観点からも推奨される行為とは言えないでしょう。

ノート: セキュリティ上の理由から、Unity はこのページにパスワードを保存しません。署名されていないデバッグキーストアは、デフォルトで、MacOS の場合は ~/.android/debug.keystore、Windows の場合は %USERPROFILE%\.android\debug.keystore にあります。

別の解決策

 UnityのAndroidビルド時にkeystoreのパスワードを毎回要求しないようにする - テラシュールブログでは、もっと簡単な方法が紹介されています。「証明書をUnsigned (debug) に戻すだけ」でも言いようです。上で紹介した方法が難しい場合は、こちらでもいいかも…

 また、UnityでAndroidのKeystoreパスワードを自動セーブ・ロードする - Qiitaでは、タイトル通り自動でセーブ・ロードする方法を紹介しています。実装は少し複雑になっていますが、やり方はこちらの方がいいかもしれません。(ソースコード上にパスワードが残らず、EditorPrefs上に残すため)

終わりに

 セキュリティ的に多少問題があるとは言え、毎回パスワードを入力する煩わしさから解放されるのは、大きなメリットです。ビルド時にパスワードを入力するのを忘れるいうちょっとしたことでイライラすることが減るのはいいですね。

古いXcodeをインストールする方法【Xcode 12.5.1】

はじめに

 現行のXcode 13.0でビルドされるアプリに問題があって、Xcode 12.5.1にダウングレードする必要がありました。しかし、Xcode 13.0に正式に移行した後だったので、Appleの公式サイトやApp Storeではダウンロード出来ませんでした。

解決策

Xcodeは以下のリンクから(ストアを介さずに)直接ダウンロード可能です。
Xcode 13.0
https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_13/Xcode_13.xip

Xcode 12.5.1
https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_12.5.1/Xcode_12.5.1.xip

またRC版(ベータ版)なら以下のリンクからになります。
Xcode 13.1 RC
https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_13.1_Release_Candidate/Xcode_13.1_Release_Candidate.xip

だいたい分かるとは思うのですが、他に必要なXcodeがあれば、Xcodeのバージョンを置き換えればダウンロードできます。以下のxを置き換えることでも可能です。
https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_xx.x.x/Xcode_xx.x.x.xip

補足

 もう少し調べていると、過去のXcodeのリンクをまとめているサイトがありました。「Xcode Releases」とサイトで、Apple公式サイトではないのですが、ダウンロード元はAppleのサーバーです。(こっちの方が便利ですね!
xcodereleases.com

Unityでプレイ中の画面のスクリーンショットを取る方法

はじめに

 UnityでEditor上での実行中のゲーム画面を撮る必要があったのですが、OSのスクリーンショット機能で撮るのはかっこ悪いなあと思ったので、Unity Recorderを使いました。

Recorderのインストール

  1. 上のメニューバーからWindow->Package Managerを選び、Package Managerを選択します。
  2. 開いたウィンドウの左上の「Package: In Project」を「Package: Unity Register」に変更します。
  3. スクロールの下の方にある「Unity Recorder」をインストールします。
f:id:MiyukiFueda:20211021044701p:plain
Package Manager

スクリーンショットの撮影

  1. メニューバーからWindow->General->Reorder->Recorder Windowを選択します。
  2. 開いたウィンドウでAdd Recorder->Image Sequenceを選択します。
  3. Recording ModeのManualをSingle Frameに変更します。
  4. 再生ボタン(▶)を選択するとゲームが実行中に切り替わり撮影されます。
f:id:MiyukiFueda:20211021045821p:plain
Recorder Window

スクリーンショットの保存場所を変えたいとき

Recorder WindowのPathの左にある「...」ボタンを選択すると、好きなフォルダに保存することが出来ます。

おわりに

 Unity Recorderを使ったスクリーンショットの撮影方法でした。Recorderでは動画も撮ることが出来るので色々試してみてください。(それが本来の機能)

Unityのエラーで現れるbokkenについて

 Unityのエラー文で時々「user/bokken/~」のディレクトリを見かけます。そんなユーザー存在しないので、不思議に思い調べて見るとbokkenが何者か分かりました。

f:id:MiyukiFueda:20211021025947p:plain

This is definitely a bug in the Editor. Can you report a bug on it?
(これは間違いなくエディターのバグです。バグを報告してもらえますか?)
bokken is the username of our build machines.
(bokkenは、私たちのビルドマシンのユーザー名です。)*1

[引用元:https://forum.unity.com/threads/what-is-the-home-bokken-exception-on-linux-unity-2020.1001722/#post-6513384

 そういう訳で、bokkenとはUnity Engine開発サイドのビルドマシンのユーザー名でした。急に知らないユーザーが出てくるため、何も知らないとbokkenが原因に見えてしまいます。

参考

※質問者の環境がLinuxのため、上で書いている私のディレクトリ(OSX)とは異なります
forum.unity.com

*1:翻訳はこちらで付けています

【Unity】AAB(Android App Bundle)ビルドが遅いので解決する

はじめに

 Play Store*1では、AABが推奨されるようになって久しいですが、UnityでAABファイルのビルドを行うとAPKファイルの時よりも時間がかかります。なんとかならないかなと思いながら調べていたら、Unity ブログに書かれていたので紹介します。

f:id:MiyukiFueda:20211011063052p:plain
Build Settingのウィンドウ

解決法

バイスへのデプロイ前に、App Bundle から APK を生成する分の時間がかかるため、開発中はApp Bundle の生成を無効にして、通常の APK を生成するようにし、「Build and Run」オプションを使ったイテレーションのための時間を節約することをおすすめします。

 「それはそうなんだけどね。」というのが率直な感想。ビルドを高速化する裏技のようなものはないので、APKとAABを切替ながら開発していくしかないのかなというのが結論です。

*1:正式にはGoogle Playですが、ここではストアアプリ名に従ってPlay Storeで呼称します。

Unityにダイアログボックスを実装する【DisplayDialog】

はじめに

 Unityでダイアログを出したいという人向けに、DisplayDialogが容易されています。一時的でいいので簡単な確認画面や選択用にポップアップが欲しい人に便利です。

 公式リファレンスにも載っているのですが、ほとんど翻訳されていません。

使い方

 EditorUtility.DisplayDialog()で呼び出すことが出来ます。

public static bool DisplayDialog (string title, string message, string ok, string cancel= ""); 
public static bool DisplayDialog (string title, string message, string ok, DialogOptOutDecisionType dialogOptOutDecisionType, string dialogOptOutDecisionStorageKey);
public static bool DisplayDialog (string title, string message, string ok, string cancel= "", DialogOptOutDecisionType dialogOptOutDecisionType, string dialogOptOutDecisionStorageKey); 

 (公式リファレンスが悪い気がするのですが、)キャンセルに当たる文字列に、空の文字列(""またはフィールドを用意しない)を送る場合と何か文字列を送る場合でダイアログボックスが変わります。空の文字列の場合、キャンセルが表示されなくなります。(じゃあ、オーバーロード実装でいいのでは…)

 下2つは2回目以降表示しないボタンが表示されます。DialogOptOutDecisionTypeで、このセッションかこの端末で2度と表示しないか選べます。
 dialogOptOutDecisionStorageKeyには任意の文字列を入力します。これがキーになります。
 当然ですが、このボタンを押すとこのダイアログボックスは表示されなくなります。解除するにはEditorPrefsから削除しなければいけないようです。
 下2つの場合はcancelの値に関わらずボタンが表示されます。

注意点

 UnityEditor内にあることから分かりますが、あくまでエディター拡張機能のためのメソッドです。このダイアログをビルド時に含むことは出来ません。コンパイラに怒られます。
 そのためアプリに入れたい場合は、UGUIなど似たような機能を作るか、iOSAndroid向けにプラグインで実装する必要があります。

 個人的には、アプリ合わせたデザインでダイアログ(またはポップアップ)を作った方いいと思います。デザイン面で優れているのと、プラグインを作るよりダイアログのUIを作った方が早く終わるのが理由です。

【Unity】Xcodeでlinker command failed with exit code 1 (use -v to see invocation)のエラーが出たときの解決方法

はじめに

 UnityでビルドしたプロジェクトをXcodeでArchive化しようとしたところ、以下のエラーが出て躓きました。

linker command failed with exit code 1 (use -v to see invocation)

 この記事は解決方法の記録と同様のエラーに詰まった人への共有用です。このエラーに付きっきりではなかったですが、解決まで数日かかったので同じような人が減ればと思います。

解決方法

.xcodeprojファイルではなく.xcworkspaceファイルを開く

 私自身、あまり気に留めていなかったのですが、Xcodeを開く時に.xcworkspaceを開く必要があるようです。このエラーが出ている時は.xcodeprojを開いていたので、Xcodeを開き直したら解決しました。

ディレクトリを指定して開く

 別の解決策として、ディレクトリを指定してプロジェクトを開いた場合もエラーが起きません。Xcodeのスタート画面もしくはメニューの開くからプロジェクトのディレクトリを選択した場合でも解決します。

最後に

 エラー文が直接解決に繋がる情報を教えてくれないので躓きました。もう少し分かりやすいエラー文だと助かります。

参考リンク

qiita.com