i++

プログラム系のメモ書きなど

Unreal Engine : C/C++ コードからのログ出力

コンソール(Output Log)へのログ出力と、ゲーム画面上へのログ出力の2通りの方法でログを確認できます。

Console ログ出力

UE_LOG(カテゴリ名, ログレベル, テキストフォーマット, テキスト引数) を使用します。

カテゴリなし
// LogTemp は定義なしで使用可能なカテゴリです
UE_LOG(LogTemp, Warning, TEXT("%s: Hello!"), __FUNCTIONW__);
単一ファイル用カテゴリ
// このカテゴリを使う .cpp 内で定義します
// カテゴリ名を "(ダブルクオーテーション)で囲んで文字列として定義する必要はありません
DEFINE_LOG_CATEGORY_STATIC(LogCategoryName, Warning, All);

UE_LOG(LogCategoryName, Warning, TEXT("%s: Hello!"), __FUNCTIONW__);
複数ファイル用カテゴリ
// (プロジェクト名).h に書きます
DECLARE_LOG_CATEGORY_EXTERN(LogCategoryName, Warning, All);

// (プロジェクト名).cpp に書きます
DEFINE_LOG_CATEGORY(LogCategoryName);

// ログを出すところで
UE_LOG(LogCategoryName, Warning, TEXT("%s: Hello!"), __FUNCTIONW__);
ログレベルの種類
レベル 備考
Fatal コンソールにログを出力すると同時にゲームをクラッシュさせます
(試しにコンストラクタに書いてみたらエディタの方がクラッシュしました…)
Error ログテキストは赤色
Warning ログテキストは黄
Display ログテキストは灰色
Log Log 以下のレベルのメッセージはコンソールには出力されず、ログファイルにのみ記録されます
(とドキュメントからは読み取れますが、自分の環境では Log までは Output Log に出力され、Verbose 以下から表示が消えました)
Verbose
VeryVerbose
All 実態は VeryVerbose です(All = VeryVerbose と定義されています)

画面ログ出力

GEngine->AddOnScreenDebugMessage(id, 表示時間, テキスト色, 表示するテキスト) を使用します。
GEngine は利用できない可能性があるので、AddOnScreenDebugMessage を呼び出す前にその有無をチェックする必要があります。マクロを書いておくと楽です。

#include "EngineGlobals.h"
#include "Runtime/Engine/Classes/Engine/Engine.h"

// 第1引数に -1 以外の数値を渡すと、前にその数値を使って出力したログを上書きします。-1 の場合は常に上書きせずログが追加されます。
// 第2引数は表示する時間(秒)
#define DISPLAY_LOG(fmt, ...) if (GEngine) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(TEXT(fmt), __VA_ARGS__));

DISPLAY_LOG("%s: Hello at line %d", __FUNCTIONW__, __LINE__);

参考

Unreal Engine : Blueprint/UserWidget.h が Visual Studio で認識されない

  1. (プロジェクト).Build.cs ファイルに UMG を使うための依存関係を設定する
  2. 一度 Visual Studio を閉じ、エクスプローラーで .uproject ファイルを選択して右クリックメニューから "Generate Visual Studio project files" 選択する

これで Visual Studio のソリューションファイルが更新され、Blueprint/UserWidget.h が開けるようになり、 intellisense による UUserWidget などに対する補完も効くようになります。

f:id:tkyjhr:20151212174645p:plain

// UMG を使う際に Games/(Project)/Source/(Project).Build.cs に必要な設定。Public の "UMG" と、Private の "Slate", "SlateCore"。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

参考

Unreal Engine : Starter Content を後から追加する

  1. Content Browser の Add New ボタン(左上緑色)を押して Add Feature or Content Pack を選択
  2. Content Packs タブから Starter Content を選択して Add to Project ボタンを押す

新規プロジェクト作成時のテンプレートとして使用できる他プロジェクトの Blueprint や C++ のコードも、Add Feature or Content Pack から追加可能。

Unreal Engine : C++ プロジェクトの作成でエラー

Common Tools for Visual C++ 2015 がインストールされていないせいでした。そういえば、Visual Studio 2015 はデフォルトでは C++ が入っていないんでしたね。

Visual Studio 2015 を Unreal Engine で使用するために必要な設定は以下のとおりです。

  1. 無料開発ツール - Visual Studio Community 2015 から Visual Studio 2015 Community をダウンロードします
  2. 自分の場合はすでに一部はインストール済みだったので Update を選択(次のダイアログが出てくるまで結構時間がかかりました)
  3. Update 終了後に出てくるダイアログで Modify を選択します
  4. インストールする機能を選択できるので、Programming Languages -> Visal C++ -> Common Tools for Visual C++ 2015 にチェックを入れて Next、Update と進みます
  5. 完了後 は PC の再起動が必要です。再起動後、Unreal EngineC++ のプロジェクトが作成できるようになります

ちなみに最初に出たエラーメッセージの内容は以下の通り。

Running C:/Program Files/Epic Games/4.10/Engine/Binaries/DotNET/UnrealBuildTool.exe  -projectfiles -project="E:/Project/UnrealEngine/BatteryController/BatteryController.uproject" -game -rocket -progress -2015
Visual C++ 2015 toolchain does not appear to be correctly installed. Please verify that "Common Tools for Visual C++ 2015" was selected when installing Visual Studio 2015.
Discovering modules, targets and source code for game...
UnrealBuildTool Exception: ERROR: Failed to find cl.exe in the default toolchain directory C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\../../VC/bin/amd64\cl.exe. Please verify that "Common Tools for Visual C++ 2015" was selected when installing Visual Studio 2015.

参考

Android : Overflow Menu で表示されるメニューに Horizontal の ImageButton 列を表示したかった(Chrome みたいに)

この画像の、メニュー上部に戻るボタンやお気に入りボタンが並んだものを作ろうとしたわけですが…

f:id:tkyjhr:20151105230219p:plain

方法

具体的な方法は調査中であるものの、どうやら PopupWindow もしくは ListPopupWindow を使ってゴリ押しで実装するしかないようです。

あまり面倒なことはしたくなかったので、費用対効果を考えてとりあえず保留に。気が向いたらまた調べることにして、参考リンクだけ並べておきます。

参考

Android : Runtime Permission 対応

Android 6.0 (Marshmallow, API level 23)に導入された Runtime permission に対応しようと思って調べたところ、インターネット接続に利用していた ACCESS_NETWORK_STATE と INTERNET は自動でパーミッションが付与される Normal Permissions という種類の権限に属していることがわかりました。

ゆえに結果的に今回対応は行わなかったのですが、今後に備えて参照したリンクだけまとめておきます。 対応のフローとしては、上2つの参考リンクでRuntime Permission 対応が必要な権限かを調べる → 具体的な対応方法を3つ目の参考リンクのサンプルに沿って実装する、という形になりそうです。

参考

オーバービューの説明的なビデオはこちら。

www.youtube.com

Android : gradle で定義された versionName を string リソースとして利用する

Android アプリではバージョン情報として versionCode と versionName があり、以下の様な形で gradle (app) で設定します。

defaultConfig {
    applicationId "com.example.increment"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "0.1"
}

アプリのバージョン情報について TextView などで versionName を表示したい場合は、ここで定義された変数をアプリから参照できるようにするための処理を追加します(下3行)。

defaultConfig {
    applicationId "com.example.increment"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "0.1"
}

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

これで、layout系の xml の中などで @string/versionName と指定すると "0.1" という文字列が得られるようになります。

IDE上では"定義されていません"というエラーが表示されますが、実際にはビルドが通り、きちんと文字列が取得できます)

解説

applicationVariants.all { variant -> ... } は全ての Build Variant (debug/release といった Build Type と Product Flavor の組み合わせ)に対して処理を行うという意味で、この中の

variant.resValue リソースの種類, リソース名, リソースの値

という構文の記述でリソースを追加で作成しています。

これは com.android.build.gradle.api.ApkVariant 型を持った variant の void resValue(String type, String name, String value) という関数の呼び出しです。

今回の例ではリソースの値には、defaultConfig で定義された versionName を引っ張ってきており、結果的には以下の行を string.xml に加えたのと同じような効果が得られています。

<string name="versionName">0.1</string>

参考