UE4のデバッグ画面に表示される◎を消す

UE4の画面に◎のコントローラが表示されるんだけど

この下の◎二つ

うざいので消します。

参考

まず、「プロジェクト設定」を開いて

インプット>デフォルトのタッチインターファイスをクリック

表示オプションで「エンジンのコンテンツを表示」にチャックを入れてクリアします。

これで表示されなくなりますよ。おしまい。

UE4でARアプリを作ってみる

ではARアプリを作ります。UE4は4.24.3です。テストで用意した端末はNexus5Xです。

【仕様】

Android用ARCoreアプリ

フェーズ1

①アプリを起動して辺りをスキャン

②お化けがいたら反応する

③幻描の香を焚くとお化けが見える

④お化けがこちらに気が付く前にチャクラを開き九字を切る

⑤お化けが九字を切る前に気が付くと逃げられてしまう

⑤無事九字を切るとお化けが昇天する

⑥昇天すると徳が積まれる

⑦徳が積まれると天部から明王、菩薩、如来と階位が上がる

という感じでまずはARテストアプリを構築します。

【準備】

Android Studioをインストール

こちらを参考にプラグインとプロジェクト設定を行います。

必要なのは以下です

  1. プラグインでAndroid Cameraにチェックを入れます
  2. プラグインでARCoreとARCoreServiceにチェックを入れます
  3. プロジェクト設定>Androidで書き込み可能にします

デバックに使うAndroid端末を用意します。

端末とPCを接続してcmdから端末が見えるか確認します

見えたらUE4を起動し「Blank」を作成しモバイル、スケーラブル、コンテンツなしを選択しプロジェクトを作ります。

まず、レベルを作っておきましょう。

でレベルブループリントを開きます。

でこれだけで平面を認識できます。

で、認識した平面のスマホ画面をタップするとアクターをSpawnするようにします。プロジェクト設定のエンジン>インプットでアクションマッピングを追加します。

で、画面がタッチされたらイベントが発生しますのでそのイベントを受け取る処理を入れます。

認識した平面の範囲をタップされたらアクターをSpawnしますのでそのアクターも用意します。

アクターは以前作ったふわふわするお化けです。

お化けは常にカメラを向きますので今回はPlayerCameraManagerをターゲットにします。

また、今回はコリジョンでの判定ではなく距離判定にしてみます。こんな感じでカメラマネジャーがアクターに200cm以内に入ったらの処理を追加します。

200cm以内に入ったら一回だけスプライトを切り替え、アクターを廃棄します。

これでテストアプリの完成です。

アプリが起動したら、辺りをタップしてみましょう。お化けが見えます。でも200cm以内に入ったらお化けがビックリして、怒って逃げます。

    

このアプリはコチラからDLできます。

おばけは明かり0.4以下の識別範囲で出現します。

Nexus5をAndroid10で動かす

Android6で見捨てられたNexus5。でもまだまだ現役で使えるのでAndroid6で止めとくのはもったいない。
なのでNexus5を最新のAndroid10で動かすようにします。
※僕の場合はTWRPが再起動ループに入って2度チャレンジしましたがダメでしたので元に戻しました

【事前準備】

Android StudioをPCにインストールする

TWRPの最新版をDLする

カスタムROMのAndroid 10のROMをDLする

GAAPSもDLします

で、Nexus5の設定から「バックアップとリセット」

をタップして「データの初期化」をします。

※セキュリティのパスワードがONになっているとダメなのでセキュリティはOFFにします

初期化されるのでしばらくお待ちください。

※初期化されるのでデータのバックアップは取っておきます

初期化されたら起動して「開発者モード」の「USBデバッグ」をONにします。

PCとNexus5をUSBケーブルで繋ぐ。

adb devices

とcmdに打ち込み、PCからNexus5が見えるか確認する。

確認できたらNexus5をbootloaderでリブートする

adb reboot bootloader

で、bootloaderをアンロックする

fastboot oem unlock

lineage-16.0-20190926-UNOFFICIAL-hammerheadをflashします

fastboot flash recovery lineage-16.0-20190926-UNOFFICIAL-hammerhead.zip

これでTERPがインストールされたはずです。rebootします

fastboot reboot

これでTWRPの画面になるはずです

で、まず、Nexus5ROMのバックアップを取っておきます

crDroidAndroid-10.0-20200315-angler-v6.4をインストールして、

open_gapps-arm-10.0-pico-20200311をインストールすれば終わりです。

再起動します。Android10のNexus5が起動します。

※うまくいかなかったら元に戻せます。

こちらからNexus5のイメージをDLしときます。

DLしたら展開してflash-all.batを実行します。

これで元に戻ります。

でも、元に戻すのに時間がかかるのでもう一回チャレンジ。あきらめたらBootloaderをロックしなおすのをお忘れなく

 

UE4でAndroidが起動しなくなった場合の対処

ERROR: System.ArgumentException: Attempt to construct staged filesystem reference from absolute path (/xxxx/xxxx.uexp). Staged paths are always relative to the staging root.

と表示され、エラーで実行できない場合の対処。

前提に全ての準備ができている事が前提で突然エラーが表示されるようになった場合。
コマンドプロンプトを起動し以下を実行

Microsoft Windows [Version 10.0.18362.657]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\xxxx>adb shell
127|shell@hammerhead:/ $ ls -l
drwxr-xr-x root root 1970-03-11 20:37 acct
drwxrwx--- system cache 2020-03-05 13:00 cache
lrwxrwxrwx root root 1970-01-01 09:00 charger -> /sbin/healthd
dr-x------ root root 1970-03-11 20:37 config
lrwxrwxrwx root root 1970-03-11 20:37 d -> /sys/kernel/debug
drwxrwx--x system system 2020-03-05 13:27 data
-rw-r--r-- root root 742 1970-01-01 09:00 default.prop
drwxr-xr-x root root 2020-03-05 13:40 dev
lrwxrwxrwx root root 1970-03-11 20:37 etc -> /system/etc
-rw-r--r-- root root 21384 1970-01-01 09:00 file_contexts
dr-xr-x--- system system 1970-01-01 09:00 firmware
-rw-r----- root root 2857 1970-01-01 09:00 fstab.hammerhead
lstat './init' failed: Permission denied
-rwxr-x--- root root 852 1970-01-01 09:00 init.environ.rc
-rwxr-x--- root root 78 1970-01-01 09:00 init.hammerhead.diag.rc
-rwxr-x--- root root 15994 1970-01-01 09:00 init.hammerhead.rc
-rwxr-x--- root root 6534 1970-01-01 09:00 init.hammerhead.usb.rc
-rwxr-x--- root root 26830 1970-01-01 09:00 init.rc
-rwxr-x--- root root 1921 1970-01-01 09:00 init.trace.rc
-rwxr-x--- root root 9283 1970-01-01 09:00 init.usb.configfs.rc
-rwxr-x--- root root 5339 1970-01-01 09:00 init.usb.rc
-rwxr-x--- root root 342 1970-01-01 09:00 init.zygote32.rc
drwxr-xr-x root system 1970-03-11 20:37 mnt
drwxr-xr-x root root 1970-01-01 09:00 oem
lstat './persist' failed: Permission denied
dr-xr-xr-x root root 1970-01-01 09:00 proc
-rw-r--r-- root root 3361 1970-01-01 09:00 property_contexts
drwxr-xr-x root root 1970-01-01 09:00 res
drwx------ root root 2016-09-20 07:13 root
drwxr-x--- root root 1970-01-01 09:00 sbin
lrwxrwxrwx root root 1970-03-11 20:37 sdcard -> /storage/self/primary
-rw-r--r-- root root 596 1970-01-01 09:00 seapp_contexts
-rw-r--r-- root root 63 1970-01-01 09:00 selinux_version
-rw-r--r-- root root 151598 1970-01-01 09:00 sepolicy
-rw-r--r-- root root 9769 1970-01-01 09:00 service_contexts
drwxr-xr-x root root 2020-03-05 08:54 storage
dr-xr-xr-x root root 1970-03-11 20:37 sys
drwxr-xr-x root root 1970-01-16 08:26 system
-rw-r--r-- root root 2204 1970-01-01 09:00 ueventd.hammerhead.rc
-rw-r--r-- root root 4587 1970-01-01 09:00 ueventd.rc
lrwxrwxrwx root root 1970-03-11 20:37 vendor -> /system/vendor
shell@hammerhead:/ $ cd sdcard
shell@hammerhead:/sdcard $ ls -l
drwxrwx--x root sdcard_rw 2019-08-09 21:05 Android
drwxrwx--x root sdcard_rw 2019-12-27 07:07 DCIM
drwxrwx--x root sdcard_rw 2020-01-04 00:47 Download
drwxrwx--x root sdcard_rw 2020-03-01 13:16 Pictures
drwxrwx--x root sdcard_rw 2020-03-04 13:41 UE4Game
drwxrwx--x root sdcard_rw 2019-08-25 14:57 gooblog
drwxrwx--x root sdcard_rw 2020-02-26 07:47 jp.co.yahoo.premium.yomihodai
drwxrwx--x root sdcard_rw 2020-02-29 10:11 ぼかし丸
shell@hammerhead:/sdcard $ cd UE4Game
shell@hammerhead:/sdcard/UE4Game $ ls -l
drwxrwx--x root sdcard_rw 2020-02-28 13:29 AndroidNexusGhost
drwxrwx--x root sdcard_rw 2020-02-27 11:43 GPSinfo
drwxrwx--x root sdcard_rw 2020-03-05 08:52 My415Project2
drwxrwx--x root sdcard_rw 2020-02-27 16:48 Widgit415
drwxrwx--x root sdcard_rw 2020-02-18 10:55 test
shell@hammerhead:/sdcard/UE4Game $ rm -r My415Project2
shell@hammerhead:/sdcard/UE4Game $ ls -l
drwxrwx--x root sdcard_rw 2020-02-28 13:29 AndroidNexusGhost
drwxrwx--x root sdcard_rw 2020-02-27 11:43 GPSinfo
drwxrwx--x root sdcard_rw 2020-02-27 16:48 Widgit415
drwxrwx--x root sdcard_rw 2020-02-18 10:55 test
shell@hammerhead:/sdcard/UE4Game $

まず、

C:\Users\xxxx>adb shell

で、Androidのシェルを使えるようにします

127|shell@hammerhead:/ $ ls -l

で中身を見ます。で、中に`sdcard`を確認しここへ移動します

shell@hammerhead:/ $ cd sdcard

この中身を`ls -l`で確認。UE4Gameを確認して移動します

shell@hammerhead:/sdcard $ cd UE4Game

この中身を`ls -l`で確認。削除対象(更新対象)を確認し削除します

shell@hammerhead:/sdcard/UE4Game $ rm -r My415Project2

ここでは`My415Project2`が対象です。削除されたか`ls -l`で確認しておしまい。
これでエラーが解消されます

ウィジットにGPS情報を表示させて更新させる

PlayerPawnにポイントライトをあてて、GPSに合わせてマップを移動してのそのGPS情報をウィジットに表示させる

まず、レベルBPに作成したGPS取得するモジュールをPlayerPawnに移植します。

PawnのイベントBiginPlayでGPSの初期化を行い、初期値を設定します。

 

GPSがないPCだとPCであると表示させます

イベントTickでGPSの初期化ができないとウィジットに一回だけPCモードのメッセージを入れます。Tick一回だけです。これは気を付けないとメモリーリークしちゃいます。

GPSの初期化ができていればGPS情報を得られるまでGetting GPS Infoと表示してGetできたら消します

GPS情報がGETできたら変数に格納し、最初の初期値を保存しておきます

GPSがGetできた情報と今のGPS情報に差があったらウィジットにGPS情報を送ります。ここで気にしてほしいのは最初にウィジットを消去している点です。

消去しないと前のウィジットが残りますのでこれもメモリーリークの原因になります。

GPS情報と今のGPS情報が同じならウィジットを更新する必要がないのでそのままLocation&Rotateをセットします。

「Tiltを取得」というのはAndroidのジャイロセンサーの値を取るという事です。これでジャイロセンサーの値が取れます。Tickあたり0.02加算しているのは僕のNexus5のジャイロセンサーが大暴れするからです。※FPSに合わせる仕様に変更しました。

※TickのFPSレートを取って、Alphaに渡します。

GPS情報を得た最初の一回は最初の一回以降セットされる変数の値が0に設定されているので初期値は大きくマイナス位置に設定されます。なので2回目以降のGPSデータをGetできたら0,0,120近くに戻ります。

こんな感じで最初は0,0,120で始まりGPS情報を得るまで待ちます

最初の一回はこんな感じで範囲外に移動します(移動しない処理を入れればいいんですが…)※処理を追加

こんな感じで2回目が来てなかったらそのままの位置で2回目が来るのを待ちます

2回目を得られましたので戻ってきました

ウィジットは2つあって一つ目はこんな感じ

2つ目のウィジットはこんな感じ

ポイントライトがちょっとブッキーな感じです。

apkを試すのはこちらからDLできます。

apkをインストールする方法

 

AndroidのGPS情報とジャイロセンサーを元にマップを移動するアプリを作る

AndroidのGPS情報が取れたら

UE4でAndroidのGPS情報を得る

これを元にマップを移動するアプリを作ります。まあ、ポケGOですね。

EVENT BIGIN PLAYでGPSを初期化して有効か無効かを判定するブーリアンを用意します

EVENT TICKでGPSが使えるか分岐します。

GPSが使える場合はシーケンスに進みます

で、後で書き込むstring変数が空なら分岐します

で、flugのブーリアンは最初falseなので最初は上を通りウィジットの「GPS情報を取得中」と表示します。で、GPS情報が得られたらstring変数に格納されるので下に移動してウィジットを消去します。

で次のシーケンスへ移動し、GPS情報がEVENTとして受け取れたらその情報を得ます

GPS情報が得られたらその情報がString変数にここでSETされます。

Firstflugのブーリアンは最初はTRUEにしてあります。最初の一回はTRUEが走ります。そしたらFirstflugはFALSEにします

以降はGPSが取得される度に下が走ります。

で、最初に取得した緯度、経度と次に取得した緯度、経度の差を得ます。

得たら現在のPawnのLocationを得てLerpで補正を0.1/Tickずつ加算して得た差をターゲットに移動させます。また、ジャイロセンサの情報をTiltを取得してPawnのTotaterを得て同様にLerpで補正を0.02/Tickずつ加算しますがこれは僕のNexus5のジャイロセンサーの振れがすごいので振れを抑制するのにTickの移動を小さくしています。

これでAndroidの向きと移動が取れます。緯度、経度の差に1000000を掛けているのはUE4の単位がcmなので0.000001の緯度、経度の単位がcmなので合わせるのに使っています。これでUE4のマップのサイズと地球のサイズが合いました。

ではAndroidで動かしてみましょう。動作確認できている端末はNexus5:Android6.0です。

https://phpjavascriptroom.com/?t=mobile&p=android_apk_install

↑apkインストール方法

このapkはこちらからDLできます

UE4でAndroidのGPS情報を得る

UE4でAndroidのGPS情報を得る方法

まず、バージョンは4.15以上でないとダメらしい。

事前準備として以下が必要

  1. VisualStudio2015以上
  2. AndroidStudioとAndroidSDKのセットアップ
  3. C:\Program Files\Epic Games\UE_4.15\Engine\Extras\AndroidWorks\Win64\CodeWorksforAndroid-1R5-windows.exeのセットアップ

以上が必要。3はUE4インストール時の環境による。またSDKはテストするAndroidのバージョンに合わせてセットアップする。

で、UE4の「編集」→「プロジェクト設定」を開き

プラットフォーム-Androidを「プラットフォームファイルは書き込み可能です」にする。

こうなればOK

で、次に「編集」→「Plugins」を開き

MobileLocationServicesAndroidとBlueprintLibrary、PatchingUtilityのチェックを入れる。iOSの場合はiOSのチェックを入れる

で、LevelのBlueprintを開く

で、まず初期化してTikでGPS情報を更新する

GPSの正確さを指定して、更新頻度をミリ秒単位で設定する(ここでは1000ミリ秒で設定)で、最小距離フィルター?を設定するがこれはいまいちわからない。

で、EventTickでGetLocationServiceImplでGPS情報をゲットしてイベントを受け取る

受け取れる情報は

  1. タイムスタンプ
  2. 緯度
  3. 経度
  4. 水平測位精度
  5. 垂直測位精度
  6. 高度

となっている。ここではAppendしてプリント分で画面出力しているが、改行は「shift+enter」でできる。

UIの作成は以下を参照

https://docs.unrealengine.com/ja/Engine/UMG/HowTo/CreatingWidgets/index.html

Sequenceノードの誤解

誤解してたのだけど、Then0へ処理が走って、Then0の処理が終わったらThen1の処理をする訳ではないので気をつけないと変な結果になる。

Then0の処理が走って、次にThen1の処理が走るって事。Then0の処理が終わったらThen1の処理が走る訳じゃないよ。

Then0の処理が終わってなくとも走ればThen1の処理が始まっちゃうよ。

キーボード入力の実装

キーボードの入力は直接もできるのですがここでは「プロジェクト設定」の「インプット」で行います。

こんな感じで

レベルBPで設定します。(動かすPlayerPawnでも記述できます。)

細かく見て行くと、BeginPlayで初期位置と向きを設定していて一旦位置を変数に格納してResetイベントが呼ばれたら初期値に戻すという仕様です。

次にキーのWが押されたら前進、Sが押されたら後退、Aが押されたら左、Dが押されたら右に移送する仕様です。ここで重要なのはForward(向き)を取り、ローカルで前進後退左右に移動しているという点です。

また、Z軸に左右回転とZ軸にUpDownと見上げる見下ろす処理も実装しています。

さらにこのままではゲームが終わらないのでESCキーを押されたらゲームが終了する処理も入れてます。

スプライトがプレイヤーのカメラ方向を常に向き、ふわふわ・くるくる。消えたり、現れたり

レベルにスプライト(平面)を置いて常にカメラを向く仕様を実装します。

まず、プレイヤーを作りますが

↑の手順でPawnで作成して作成したPawnのBlueprintをWクリックして開きます。

Collisionをつけてカメラもくっつけときます。collisionは当たりの判定用に使います。※追加したらコンパイルしておきましょう。

で、プロジェクト設定を開き

マップ&モードのDefaultGameModeの+を押し、NewGameModeを新たに作ります。

で、GameInstanceClassの+を押し、同様にNewGameInstanceを作り、選択したゲームモードのDefaultPawnClassに作成したPawnを指定します。

これでプレイヤーの設定は終わりです。

で、Blueprintsフォルダ内で右クリックしてブループリントクラスを作成して平面を置いておきます。


ブループリントクラスを作ります。クラスを作っただけで何もありません。


Actorを選択しときます。


Ghostって名前をつけました。これをWクリックして開きます。


平面を追加しておきます。


平面は回転x:90、y:0、z:-90にしておきましょう。

で、マテリアルを作ります。


できたマテリアルのBlueprintをWクリック


デフォルトはこんな感じ

こんな感じで作ります。LerpにAlphaって名前をつけてます。

Alphaの設定はこんな感じ。デフォルトは1です。

マテリアルを作ったら平面に貼ります。

こんな感じ。でこれが常にPlayerを向くようにします。

実装はこんな感じです。

ちなみにお化けなのでふわふわさせます。

こんな感じ。上下にふわふわしながらやや周回します。

まあ、これだけじゃ面白くないのでお化けに近づくとお化けが驚いて怒って逃げる(消える)ってのを実装します。

全体はこんな感じ。

詳しくはお化けのcollisionを350cmに設定しているので、playerがお化けのcollisionに触れて、お化けのダイナミックマテリアルの値が1ならテクスチャを差し替えるって事をします。

で、0.5秒後に怒った絵に差し替えて

2秒後にイベントが発生してタイムラインが動いて2秒でAlphaが0になって消えるって実装です。

ダイナミックマテリアルはコンストラクションスクリプトの中で設定しています。

で、何でAlphaが1か1以外かを見ているのかというと、消える2秒の間で再びお化けのcollisionに触れた場合に絵を差し替える処理をさせないためです。

ちなみにお化けのcollisionから出た場合は以下の処理になります。

またここでAlphaが0かどうかの判定がありますが、0なら10秒後に現れるんですが、でもお化けとPlayerの距離が350cm以上離れてないとAlphaが0から戻らないようにしています。

350cm以上はなれると再び2秒でAlphaが1に戻り姿を現します。

という感じ。

 

このアプリを動かしてみるにはこちらからダウンロードします。

キーボードの[W]で前進。[A]で左移動、[D]で右移動、[S]で後退、[Z]で左向き、[C]で右向き、[esc]で終了です。