kiyasuの日記

ハッピーうれピーよろしく哀愁

行数リミッターのあるLogWriter

    public class LogWriter : MonoBehaviour
    {

        public string fileName;
        public int limit = 2000;
        StreamWriter logFileWriter;

        void Start()
        {
            Application.logMessageReceivedThreaded += logMessageReceived;
            var filepath = Path.Combine(Application.persistentDataPath, fileName);

            if (File.Exists(filepath))
            {
                string[] lines = File.ReadAllLines(filepath);
                if (lines.Length > limit)
                {
                    File.Delete(filepath);
                }
            }
            logFileWriter = new StreamWriter(filepath, true);
        }

        private void logMessageReceived(string condition, string stackTrace, LogType type)
        {
            logFileWriter.WriteLine(DateTime.Now.ToString("yyyyMMddHHmmss") + " :" + type.ToString() + " :  " + condition);
            logFileWriter.WriteLine("================================");
        }

    }

HoloLens2とiPadで動作確認しました。アプリ閉じた後に書き込まれる感じ。

無制限にデバイス内のログファイルに追記追記追記とやってるといつか破綻をきたしそうなので。 persistentDataPathにファイルを格納するかどうか、というのは要検討のようです。

参考

Unity iOSの内部フォルダの保存、閲覧する方法 - Qiita

gitのprivate ripositoryからcloneする

https

% git clone https://github.com/xxxx/xxxx.git
Cloning into 'xxxx'...
Username for 'https://github.com': "githubのサイトからPersonal access tokensコピペ"
Password for 'https://xxxx@github.com':

いつも一瞬忘れるので。

これ登録した後に会社のprivate repositoryからパッケージ取ってくるUnityプロジェクト立ち上げるとエラー。Packages/manifest.jsonの中身よくみるとsshでした。

SSH

macのターミナルでssh鍵を作る

% ssh-keygen -t rsa -b 4096 -C "コメント。メールアドレスを書くのが一般的らしい"

パスフレーズは空欄でもOK。公開鍵と秘密鍵が~/.ssh/id_rsa.pub に作られる。

そのあとはGithubのSettings/SSH and GPG keysからSSH公開鍵(.pub)の中身をコピペして登録すればおk

The type or namespace name 'UI' does not exist in the namespace 'UnityEngine'

その後プロジェクト開くとこのエラーが出て焦った。Libraryフォルダを消してプロジェクト再起動すると治った。自分のプロジェクトpullするだけでこの苦労である。

Assertion failed on expression "g_ThreadedGfxDevice"

f:id:mojo_nobu:20210924092348p:plain

WindowsのUnity 2020.3.17f1にて、Threadを使ってTCP通信を行う処理をしようとしたら掲題のエラーがでてUnityがクラッシュする。調べると

0001538: Unity Crash on Project Load - NoesisGUI Issue Tracker

このようなクラッシュレポートが出るが、自分の状況とはあまり関係なさそうだ。グラフィックスのスレッド関連?ということでgraphics設定からV Sync Countを「Don't Sync」にしたが解決せず。

Unity の Gfx.WaitForPresent とは何か

よくわからないので既にインストールしてあったUnity 2019.4.26f1にしたらエラーでなくなりました。

M1 MacでMediaPipeを動かす

Installation - mediapipe

基本はこれに沿って行うがいくつか気をつけるところあり

python

pythonコマンドのパスがmacにデフォルトの2.7になってたのでそれを3系統にする。

python version 切り替え mac - kiyasuの日記

% python --version
Python 3.9.7

こうなってれば良いです。

bazel

何も設定を変えずにhello_worldを動かそうとするとコケる。

% bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world
2021/09/23 18:19:21 Downloading https://releases.bazel.build/3.7.2/release/bazel-3.7.2-darwin-arm64...
2021/09/23 18:19:22 could not download Bazel: HTTP GET https://releases.bazel.build/3.7.2/release/bazel-3.7.2-darwin-arm64 failed with error 404

これはbazeliskの設定を変えて使用するbazelのバージョンを変えればOK

vi ~/.zshenv

で設定ファイル開いて

export USE_BAZEL_VERSION=4.2.1

を追記して

source ~/.zshenv

でOK。と思いきや改めてhello_world実行するとエラーが出る。

xxxx/mediapipe/mediapipe/mediapipe/framework/BUILD:966:11: Compiling mediapipe/framework/scheduler_queue.cc failed: (Aborted): wrapped_clang failed: error executing command external/local_config_cc/wrapped_clang ‘-D_FORTIFY_SOURCE=1’ -fstack-protector -fcolor-diagnostics -Wall -Wthread-safety -Wself-assign -fno-omit-frame-pointer -O0 -DDEBUG ‘-std=c++11’ ... (remaining 60 argument(s) skipped)
Use --sandbox_debug to see verbose messages from the sandbox
mediapipe/framework/scheduler_queue.cc:212:3: error: expected expression
AUTORELEASEPOOL {
^
mediapipe/framework/scheduler_queue.cc:29:25: note: expanded from macro ‘AUTORELEASEPOOL’
#define AUTORELEASEPOOL @autoreleasepool
^
mediapipe/framework/scheduler_queue.cc:226:5: error: use of undeclared identifier ‘is_idle’
is_idle = IsIdle();
^
mediapipe/framework/scheduler_queue.cc:228:7: error: use of undeclared identifier ‘is_idle’
if (is_idle && idle_callback_) {
^
3 errors generated.
Error in child process ‘/usr/bin/xcrun’. 1
Target //mediapipe/examples/desktop/hello_world:hello_world failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 82.222s, Critical Path: 46.20s
INFO: 738 processes: 187 internal, 551 darwin-sandbox.
FAILED: Build did NOT complete successfully
FAILED: Build did NOT complete successfully

これはmediapipe/framework/scheduler_queue.cc開いて、21行目の

#define AUTORELEASEPOOL @autoreleasepool

#define AUTORELEASEPOOL

に変えればいいです。MediaPipe currently doesn't have the official support of apple silicon devicesだからこうなるらしいです。

改めて実行

% bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world
(略)
I20210923 18:56:03.526690 34651456 hello_world.cc:57] Hello World! I20210923 18:56:03.527341 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527349 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527355 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527361 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527367 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527374 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527379 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527385 34651456 hello_world.cc:57] Hello World!
I20210923 18:56:03.527391 34651456 hello_world.cc:57] Hello World!

参考

bazelisk from homebrew looks for macOS arm binary 4.0.0 and 404s · Issue #245 · bazelbuild/bazelisk · GitHub

GitHub - bazelbuild/bazelisk: A user-friendly launcher for Bazel.

HelloWorld on M1 Mac - githubmemory

python version 切り替え mac

MediaPipeのインストール途中、homebrewからpythonインストールする段階で

% brew install python
Warning: python@3.9 3.9.7 is already installed and up-to-date.
To reinstall 3.9.7, run:
brew reinstall python@3.9

と言われる。自分で入れた記憶はないがhomebrew管理のpythonが入ってるらしい。しかし

% python --version
Python 2.7.16

これである。どうやらmac標準のpythonが呼ばれているようだ。

まずhomebrew内のpythonのパスを調べる。

% brew info python
python@3.9: stable 3.9.7 (bottled)
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/opt/homebrew/Cellar/python@3.9/3.9.7 (3,082 files, 56.6MB) *
Poured from bottle on 2021-09-22 at 12:37:50
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/python@3.9.rb
License: Python-2.0

(略)

Unversioned symlinks python, python-config, pip etc. pointing to python3, python3-config, pip3 etc., respectively, have been installed into
/opt/homebrew/opt/python@3.9/libexec/bin

そういえばhomebrewもmacに標準でインストールされてるって聞いたんですけど本当かな。

次にパスを通す。~/.zshenvに以下を追記

export PATH=/opt/homebrew/opt/python@3.9/libexec/bin:$PATH

以下で反映

% source ~/.zshenv

バージョン確認

% python --version Python 3.9.7

余談

macにも標準でpythonが入っているんですね。/usr/bin/python3 と/usr/bin/python です。後者はpython2.7でした。

mac標準に入ってるpython3を使おうとするとpython3コマンドを打つ必要があるのか。あとはパスを変えるとか。手軽に切り替えたいならpyenv入れてpythonもそれぞれ別で入れて管理しないといけないんだろうか?似たようなプログラムが一つのプログラムに入ってるのちょっと悲しい気分になるんだよなあ

参考

MacでPython3デフォルトにする - あとらすの備忘録

Unity StreamingAssets wav AudioSource.clip 渡し方

VideoPlayerの場合

VideoPlayer videoPlayer;
videoPlayer.url = Application.streamingAssetsPath + "/file.wav";

VideoPlayerはurlから取得できるのでこれでOKです。

AudioSourceの場合

audioSouceはclipだけでurlはないので間にwebrequestを挟みます(実際に呼ぶのはローカルのファイル)。UnityWebRequestの中身が2020と2019で違うようで、動作確認したのでは2019,.4.26f1のみです。

Unity 2019.4

public class AudioInitializer : MonoBehaviour
{
  [SerializeField]
   private AudioSource audioSource;
 
   [SerializeField]
   private string audioFolderPath;
 
   [SerializeField]
   private string audioFileName;

   private void OnEnable()
   {
       StartCoroutine(GetAudioClip());
   }

   IEnumerator GetAudioClip()
   {
       string clipPath = "file://" + Application.streamingAssetsPath + audioFolderPath + audioFileName;
       using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(clipPath, AudioType.WAV))
       {
           yield return www.SendWebRequest();
           if (www.isHttpError || www.isNetworkError)
           {
               Debug.Log(www.error);
           }
           else
           {
               AudioClip loadedClip = DownloadHandlerAudioClip.GetContent(www);
               audioSource.clip = loadedClip;
               audioSource.Play();
           }
       }
   }
}

参考

How would I go about using music from StreamingAssets folder (imported by the player) : Unity3D

UnityWebRequestでもローカルファイルの取得ができる - Qiita

2019での書き方

Unity - Scripting API: Networking.UnityWebRequestMultimedia.GetAudioClip

最新版(現在2020.3)での書き方

Unity - Scripting API: Networking.UnityWebRequestMultimedia.GetAudioClip リンクがバージョン指定されてないので今後変わりそう

Unityのカメラから360度動画の作成と再生

作成

UnityのUnity Recorderを使う。

xr-hub.com

Unity2019.4.16f1だとPackage Managerから取得して使うようになってました。

上記記事と重複しますが、metadataを編集するのを忘れずに。

github.com

再生

metadataがちゃんと設定されていれば、対応プレーヤーで自動的にスティッチしてくれるようです。

再生確認はYoutubeの限定公開やVLC3.0以降でできます。

その他

もらった360度動画をどうもうまく再生できない時はmetadataを確認するのがいいかもしれない。

windowsmacの両方でexiftoolsが使えます。

ExifTool by Phil Harvey

Mac で Exif を編集したり削除したりできる「ExifTool」 | 使える機材 Blog!

とりあえずmacで見てみました。インストールして、ターミナルから

exiftool <ファイル名>

を実行。下のように設定されていればよさそう。 f:id:mojo_nobu:20210903012414p:plain