コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】CommandInvokationFailure: Unable to query OpenGL version information.

概要

CommandInvokationFailure: Unable to retrieve device features information. 
Please make sure the Android SDK is installed and is properly configured in the Editor. 
See the Console for more details.

/Applications/Unity/Hub/Editor/2022.3.62f2/PlaybackEngines/AndroidPlayer/SDK/platform-tools/adb -s "2c4217c7" shell dumpsys package f

Unity + Android で Build and Run した時に、上記のエラーが発生する現象に遭遇した。

Android 端末の「開発者向けオプション」の「USB デバッグの許可の取り消し」を実行して
「USB デバッグを許可しますか?」と表示されたら
「このパソコンからの USB デバッグを常に許可する」をオンにして「許可」を押したら
接続が安定してビルドに成功するようになった。

【Android】Mac で Android 端末のアプリを簡単に管理できる「Debloatfy」

概要

Windows には「ADB AppControl」というツールがあるが、
これと同等の機能を持つ Mac 用のアプリを調べていたところ
「Debloatfy」というアプリが使いやすかった。

Android 端末の開発者向けオプションを有効にして、
USB デバッグをオンにして Mac に接続すると
Mac で Android 端末のアプリを管理できるようになる。

上記のように Debloatfy で Android 端末が正常に認識されない時は
「USB の接続用途」を「ファイル転送/Android Auto」にすると認識された。

【Unity】POCO F7 にビルドしたアプリの動作が重かった時にやったこと

概要

Android 端末の POCO F7 で開発中の Unity アプリのエージングテストを実行してみたら
妙に時間がかかる状態だった。

端末 テストにかかった時間 AnTuTu Benchmark のスコア
POCO F7 1 時間 53 分 2179683
Pixel 6a 1 時間 12 分 941863

ベンチマークのスコアが低い Pixel 6a よりもテストに時間がかかる状態だった。

POCO F7 の設定を開いて以下の項目の設定を変更してみた。

  • 「バッテリーとパフォーマンス > 現在のモード」を「究極モード」に変更。
  • 「アプリ > 【開発中のアプリ】 > バッテリー > バッテリーセーバー」を「制限無し」に変更。

その後、再度テストを実行してみたらテストが早く終わるようになった。

端末 テストにかかった時間
POCO F7 1 時間 9 分
Pixel 6a 1 時間 12 分

【Unity】CommandInvokationFailure: Unable to query OpenGL version information.

概要

CommandInvokationFailure: Unable to query OpenGL version information. 
Please make sure the Android SDK is installed and is properly configured in the Editor. 
See the Console for more details.

/Applications/Unity/Hub/Editor/2022.3.62f2/PlaybackEngines/AndroidPlayer/SDK/platform-tools/adb -s "2c4217c7" shell dumpsys SurfaceFlinger

Unity + Android で Build and Run した時に、上記のエラーが発生する現象に遭遇した。

adb devices -l

ターミナルで上記のコマンドを実行したら

List of devices attached
XXXXXXXX device usb:34603008X product:onyx_global model:25053PC47G device:onyx transport_id:19

Android 端末は認識されていた。

adb -s XXXXXXXX shell dumpsys SurfaceFlinger >/dev/null && echo OK

ターミナルで上記のコマンドを何度か実行したら

OK
adb: device offline
adb: device 'XXXXXXXX' not found

OK が出たり offline が出たり not found が出たりする状態だったので
接続が安定していない(USB 経由の ADB 接続が瞬断してる)ようだった。

Android 端末の「開発者向けオプション」の「USB デバッグの許可の取り消し」を実行して
「USB デバッグを許可しますか?」と表示されたら
「このパソコンからの USB デバッグを常に許可する」をオンにして「許可」を押したら
接続が安定してビルドに成功するようになった。

【Unity】DeploymentOperationFailedException: Installation failed. See the Console for details.

概要

DeploymentOperationFailedException: Installation failed. See the Console for details.
  at UnityEditor.Android.AndroidDeploymentTargetsExtension.UploadAPK (UnityEditor.Android.AndroidBuildProperties buildProperties, UnityEditor.Android.AndroidDevice device, UnityEditor.Android.AndroidDeploymentTargetsExtension+LaunchProgressTaskManager taskManager) [0x00154] in /home/bokken/build/output/unity/unity/PlatformDependent/AndroidPlayer/Editor/Managed/DeploymentTargets/AndroidDeploymentTargetsExtension.cs:719 
  at UnityEditor.Android.AndroidDeploymentTargetsExtension+<>c__DisplayClass15_1.<LaunchBuildOnTarget>b__3 () [0x00000] in /home/bokken/build/output/unity/unity/PlatformDependent/AndroidPlayer/Editor/Managed/DeploymentTargets/AndroidDeploymentTargetsExtension.cs:542 
  at UnityEditor.ProgressTaskManager.Run () [0x0002e] in /Users/bokken/build/output/unity/unity/Editor/Mono/Utils/ProgressBarUtils.cs:71 
  at UnityEditor.Android.AndroidDeploymentTargetsExtension.LaunchBuildOnTarget (UnityEditor.DeploymentTargets.IDeploymentTargetsMainThreadContext context, UnityEditor.BuildProperties buildProperties, UnityEditor.DeploymentTargets.DeploymentTargetId targetId, UnityEditor.ProgressHandler progressHandler) [0x0021f] in /home/bokken/build/output/unity/unity/PlatformDependent/AndroidPlayer/Editor/Managed/DeploymentTargets/AndroidDeploymentTargetsExtension.cs:550 
  at UnityEditor.DeploymentTargets.DeploymentTargetManager.LaunchBuildOnTarget (UnityEditor.BuildProperties buildProperties, UnityEditor.DeploymentTargets.DeploymentTargetId targetId, UnityEditor.ProgressHandler progressHandler) [0x00001] in /Users/bokken/build/output/unity/unity/Editor/Mono/DeploymentTargets/DeploymentTargetManager.cs:45 
  at UnityEditor.PostprocessBuildPlayer+<>c__DisplayClass22_1.<LaunchOnTargets>b__1 () [0x00065] in /Users/bokken/build/output/unity/unity/Editor/Mono/BuildPipeline/PostprocessBuildPlayer.cs:283 

Unity + Android で Build and Run をしたら、
上記のエラーが発生してビルドに失敗する現象に遭遇した。

Android 端末の POCO F7 の画面を見てみたら、
上記の「USB 経由でインストール」が表示されていたので、
「この選択を記憶」をオンにして「インストール」を押したらビルドに成功して
次からのビルドも正常に動作するようになった。

【Unity】Gradient クラスから部分範囲を切り出すメソッド

ソースコード

using System.Collections.Generic;
using UnityEngine;

namespace Kogane
{
    public static class GradientExtensionMethods
    {
        public static Gradient GetSubGradient
        (
            this Gradient self,
            float         min,
            float         max
        )
        {
            min = Mathf.Clamp01( min );
            max = Mathf.Clamp01( max );

            var gradient = new Gradient();

            var colorKeys = new List<GradientColorKey>
            {
                new( self.Evaluate( min ), 0 ),
            };

            foreach ( var key in self.colorKeys )
            {
                if ( key.time <= min ) continue;
                if ( max <= key.time ) continue;

                var time     = Mathf.InverseLerp( min, max, key.time );
                var colorKey = new GradientColorKey( key.color, time );

                colorKeys.Add( colorKey );
            }

            colorKeys.Add( new( self.Evaluate( max ), 1 ) );

            var alphaKeys = new List<GradientAlphaKey>
            {
                new( self.Evaluate( min ).a, 0 ),
            };

            foreach ( var key in self.alphaKeys )
            {
                if ( key.time <= min ) continue;
                if ( max <= key.time ) continue;

                var time     = Mathf.InverseLerp( min, max, key.time );
                var alphaKey = new GradientAlphaKey( key.alpha, time );

                alphaKeys.Add( alphaKey );
            }

            alphaKeys.Add( new( self.Evaluate( max ).a, 1 ) );

            gradient.SetKeys
            (
                colorKeys: colorKeys.ToArray(),
                alphaKeys: alphaKeys.ToArray()
            );

            return gradient;
        }
    }
}

【Unity】Gradient クラスで虹色を作る例

概要

var gradient = new Gradient();

var colorKeys = new GradientColorKey[]
{
    new( Color.red, 0 ),
    new( new Color( 1, 0.5f, 0 ), 0.16f ),
    new( Color.yellow, 0.33f ),
    new( Color.green, 0.5f ),
    new( Color.cyan, 0.66f ),
    new( Color.blue, 0.83f ),
    new( new Color( 0.5f, 0, 1 ), 1 ),
};

var alphaKeys = new GradientAlphaKey[]
{
    new( 1, 0 ),
};

gradient.SetKeys
(
    colorKeys: colorKeys,
    alphaKeys: alphaKeys
);

【Unity】Unity Hub で「アカウントを切り替え」「サインアウト」ができない場合

概要

Mac の Unity Hub 3.15.3 で「アカウントを切り替え」「サインアウト」を押しても
何も反応しない現象に遭遇した。

~/Library/Application Support/UnityHub

Unity Hub を終了してから上記のフォルダを削除して
Unity Hub を開いたら別のアカウントでサインインできた。

ただし、上記のフォルダを消してしまうと
Unity Hub の設定などがすべて消えてしまうので注意。

Unity Hub の CLI でサインアウトできないか調べてみたが、できなさそう?

【Unity】Error building Player: Failed to find entry-points

概要

Error building Player: Failed to find entry-points: 
System.Exception: Could not resolve assembly 
'XXXX, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
referenced by the assembly 
'YYYY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. 
Does the assembly name differ from the DLL name (Burst does not support this)? ---> 
Mono.Cecil.AssemblyResolutionException: 
Failed to resolve assembly: 
'XXXX, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Exception: 
Failed to resolve assembly 
'YYYY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
in directories: /Applications/Unity/Hub/Editor/2022.3.62f2/Unity.app/Contents/MonoBleedingEdge/lib/mono/unityjit-macos

Unity で iOS ビルドした時に上記のエラーが発生してビルドに失敗する現象に遭遇した。
もう一度 iOS ビルドしたら今度はエラーが発生せずに正常にビルドできた。

【Mac】CleanShot X で Studio Display のスクショを撮影するときに画像解像度を縮小する方法

概要

CleanShot X で Studio Display のスクショを撮影すると
スクショの画像解像度が 2 倍になってしまう。

「Settings... > Screenshots」を開いて「Scale Retina screenshots to 1x」をオンにすると
画像解像度が 2 倍になることを防げる。

【Unity】Android SDK not found

概要

If command-line tools are installed, but this message is still shown, please restart the Unity editor. 

新しい Mac に Unity 2022.3.62f2 をインストールして CLI で Android ビルドしたら
上記のメッセージが出力されてビルドに失敗する現象に遭遇した。

Android SDK not found

Unable to detect SDK in the selected directory. /Applications/Unity/Hub/Editor/2022.3.62f2/PlaybackEngines/AndroidPlayer/SDK/cmdline-tools/latest/bin/sdkmanager does not exist. Android SDK command-line tools component is not found. Make sure "Command-line Tools (6.0)" is installed in the SDK manager.
If command-line tools are installed, but this message is still shown, please restart the Unity editor. 

Unity エディタから Android ビルドしたら上記のエラーが表示された。

You are missing the recommended Android SDK Tools. Install the recommended version with Unity Hub.

Preferences を見てみたら上記の警告が表示されていた。

Android モジュールはインストールされていた。

Android モジュールのインストール先のフォルダを見てみたら
「cmdline-tools」フォルダが存在しなかった。

Unity をアンインストールしてから再インストールして
「Android SDK Command Line Tools」が正常にインストールされるのを待って

Unity インストール後に「cmdline-tools」フォルダが作成されたことを確認して
Android ビルドしたらエラーが消えてビルドに成功した。

【C#】.Replace( "\\", "/" ) よりも .Replace( '\\', '/' ) の方が速い

検証結果

検証用スクリプト

using UnityEngine;
using UnityEngine.Profiling;

public class Example : MonoBehaviour
{
    private void Update()
    {
        const string path  = "Assets\\material.mat";
        const int    count = 100000;

        Profiler.BeginSample( "\"" );

        for ( var i = 0; i < count; i++ )
        {
            _ = path.Replace( "\\", "/" );
        }

        Profiler.EndSample();

        Profiler.BeginSample( "\'" );

        for ( var i = 0; i < count; i++ )
        {
            _ = path.Replace( '\\', '/' );
        }

        Profiler.EndSample();
    }
}

【C#】Path.ChangeExtension でファイルパスから拡張子を取り除ける

概要

const string path = "Assets/material.mat";

var result = Path.ChangeExtension( path, null ); // Assets/material

null ではなく string.Empty を渡すと Assets/material. のように
末尾に . が残ってしまうので注意。