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できます

忘れちゃうのでAWSにTERA TERMで接続する方法

まず、EC2の自分の使っているリージョンのEC2ダッシュボードへログインする。

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#Home:

で、実行中のインスタンスをクリックする

接続をクリックする

で、表示される秘密鍵ファイル名と接続先をコピーしておく

xxx.pemは作成しておく。

接続先はTERATERMの接続先になる

接続先ホスト名を入れてOK

秘密鍵へのパスを入れて、AWSのユーザー名(Ubuntuでインスタンスを作成していればUbuntuで)でログイン

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

COBOLってよく聞くが試しにUbuntuにインストールしていつものHELLO WORLDさせてみる

COBOLってよく聞くよね化石みたいな言語らしい

って、UbuntuにOpen-COBOLってインストールしてみて「HELLO WORLD」ってプリントしてみる。

【Open-COBOLをインストール】

user@user:~@ sudo apt-get install open-cobol

とUbuntuのコンソールに書いてリターン

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libmircommon6 linux-headers-4.8.0-28 linux-headers-4.8.0-28-generic
linux-image-4.8.0-28-generic linux-image-extra-4.8.0-28-generic
openbsd-inetd
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
autotools-dev libcob1 libcob1-dev libdb-dev libdb5.3-dev libgmp-dev
libgmp3-dev libgmpxx4ldbl libltdl-dev libncurses5-dev libtinfo-dev libtool
提案パッケージ:
db5.3-doc gmp-doc libgmp10-doc libmpfr-dev libtool-doc ncurses-doc autoconf
automaken gfortran | fortran95-compiler gcj-jdk
以下のパッケージが新たにインストールされます:
autotools-dev libcob1 libcob1-dev libdb-dev libdb5.3-dev libgmp-dev
libgmp3-dev libgmpxx4ldbl libltdl-dev libncurses5-dev libtinfo-dev libtool
open-cobol
アップグレード: 0 個、新規インストール: 13 個、削除: 0 個、保留: 4 個。
2,105 kB のアーカイブを取得する必要があります。
この操作後に追加で 8,902 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

こんな感じでインストール
ちゃんとインストールされとるか確認する

user@user:~@ cobc --v

インストールされればこんな感じで表示される

cobc (OpenCOBOL) 1.1.0
Copyright (C) 2001-2009 Keisuke Nishida / Roger While
Built    Aug 04 2016 15:56:22
Packaged Feb 06 2009 10:30:55 CET

じゃ、早速HelloWorld!してみましょう。
viエディタでカレントにHW.cobってソースファイルを作ります。

user@user:~@ vi HW.cob

そしたら以下を書きます。

      *これはコメントでソースは8文字目から始めます
      *7文字目まではスキップされますよ!注意しましょう!
       IDENTIFICATION DIVISION.
       PROGRAM-ID. helloworld.
       PROCEDURE DIVISION.
       DISPLAY "Hello World!".
       STOP RUN.
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"HW.cob" [Incomplete last line] 5 lines, 141 characters

【解説】
7文字目の*はC++、PHPでいう//でコメントです。
IDENTIFICATION DIVISION.とPROCEDURE DIVISION.は必要な呪文です。何も考えず入れましょう。
PROGRAM-ID. の後のhelloworld.は何でもいいんですがプログラムの識別子です。
DISPLAY “Hello World!”.のDISPLAYはC++、PHPでいうprintです。
STOP RUN.はここで終わりますねっていう呪文です。
,/td><<<<<<< 注意!)COBOLのソースは必ず8スペース開けてから書きます!コメントは*を7スペース目に入れて8文字目から書きますんで注意してください!この約束を守らないと「./HW.cob:1: Error: Invalid indicator ‘F’ at column 7」って怒られます!

COBOLは4つのカテゴリで分けられるようです。

構文 意味
見出し IDENTIFICATION DIVISION. 見出し呪文
環境部 ENVIRONMENT DIVISION. データファイルを記述
データ部 DATA DIVISION. 変数などのメモリ領域を記述
手続き部 PROCEDURE DIVISION. 処理ルーチンを記述

じゃ、コンパイル(ビルド)しますね。

user@user:~@ cobc -x HW.cob
user@user:~@

するとカレントに`HW`って実行ファイルができますので実行させてみます。

user@user:~@ ./HW
Hello World!

おお!Hello World!しましたね!おしまい。次は計算が得意な言語らしいので計算をさせてみます。

Download CounterをWPプラグイン、PHP:Mysql、ファイル 形式で作成する[第二回]

ダウンロードカウンターで検索してこられる人が結構いるので今回は①WPプラグイン形式、②PHPスクリプトでMysql形式で記録閲覧、③PHPスクリプトでファイルで記録閲覧という3つのダウンロードカウンターを作ってみることにする

【実装】

まず、Anonymous(匿名)でのダウンロードとアカウント(登録制)を切り替えられるようにするため、WPの認証機能を使います。

require_once('./wp-load.php');

これを書くとWPのユーザーが今誰かを見ることができるようになります。_oneceなので一回だけって意味です。

あとは

/*オブジェクトを生成*/
new DownloadCounter;

というオブジェクトを作成して

/*DownloadCounterクラスを定義*/
class DownloadCounter {
    /*コンストラクタだから一回だけ:UE4Blueprintの場合はEventBiginPlay*/
    function __construct() {
        /*wordpressから自身のMySQLへ接続するインスタンスを呼ぶ*/
        global $wpdb;
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
    }
 
    /*管理メニューの設定*/
    function add_admin() {
        if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
            $menuname="ダウンロードカウンター";
        }else{
            $menuname="DownloadCounter;
        }
        //level_8から10が管理者
        add_menu_page($nenuname,$menuname,'level_9', __FILE__, array($this,'WPDownloadCounter'));
    }

として以降に

function WPDownloadCounter(){

}

を書きます