投稿者: moleking

スタンド・バイ・ミー -恐怖の四季 秋冬編- / スティーヴン・キング

森の奥に子供の死体がある──噂を聞いた4人は死体探しの旅に出た。もう子供ではない、でもまだ大人にも成りきれない少年たちの冒険が終ったとき、彼らの無邪気な時代も終ったのだった……。誰もが経験する少年期特有の純粋な友情と涙を描く表題作は、作家になった仲間の一人が書くという形をとった著者の半自伝的作品である。他に英国奇譚クラブの雰囲気をよく写した1編を収録。

春夏編の『刑務所のリタ・ヘイワース『ショーシャンクの空に』の原作』と『ゴールデンボーイ』が中々良かったのと、「そういや『スタンド・バイ・ミー』の映画をきちんと観たことないし、細かいストーリーを知らないな(´・ω・`)」ということで読んでみた。

収録作である『スタンド・バイ・ミー』と『マンハッタンの奇譚クラブ』はどちらもまあまあ良かったかな。


スタンド・バイ・ミー

原題は"The Body"。 死体として登場するレイ・ブラワー少年を指している?
何か他の意味も含んでいるのかな?

翻訳が『ゴールデンボーイ』の浅倉久志ではない所為ではないのだろうけれども、スティーヴン・キングの原文が悪いのか、序盤は読んでていまいちわかりにくかったり、読みづらいところがあった。

ゴーディ達の冒険と小説内小説やゴーディの作り話という入れ子構造的な部分がある構成だった。小説内小説の内容はなんだかな感が多少あったw スティーヴン・キング自身の習作なのか、あれ。

『スタンド・バイ・ミー』は洋楽やこの時代の空気や知識がないと完全には楽しめない感じなのかもと思った。知らない歌手や曲名の羅列が多くて、その辺を読むのは若干苦行に近かった(ノ∀`)

泥濘とも言える少年たちの家庭環境でのもがき、そこから一時的に逃げるための退避場所とも取れなくもない"友人関係"などが何とも言えない悲哀を感じさせて悪くなかったが、正直、ゴーディのパイの作り話とかはそんなにはまらなかった。

テディとバーンはどうでも良かったが、ちょっとクリスが可哀想な気がした(´・ω・`)

なぜに作者は中年になったエースを最後の方で登場させたのだろうか?
皆何もなかったら、クリスは努力してなかったら、エースのようになっていただろうという示唆なんだろうか?

若干の改変があるらしいが、いつかきちんと映画版も観てみるか(´・ω・`)


マンハッタンの奇譚クラブ

中年のマンハッタンの弁護士デイビッドがナレーターである。シニアパートナーの招待で、ニューヨーク、35ストリートにあるクリスマスに会員達が持ち回りで語り聞かせあう奇妙なクラブに参加する。そこでは読書、おしゃべり、ビリヤードとチェスなどが行われていた。

原題は"The Breathing Method"。
内容的には、まんまと言えばまんまだなw

こちらも入れ子構造な感じの構成で、謎のクラブに関する記述とそのクラブメンバー達が話す奇譚とに分かれる。

と言っても、マッキャロン以外の話は概略のみなので、読み手の消化不良感を倍増させるw

マッキャンの"呼吸法"の話はなんだかんだで引き込まれる筆致であったように思えた。
つーか、これ"ふつうの小説"じゃなくて、いつものホラー小説に分類されそうな感じの内容ではなかろうかw

外側の、というかデイビッドが訪れた奇譚クラブの存在についての記述は蛇足なような気がしなくもない。必要だったのかなぁ?

『恐怖の四季』の他三作は映画化されているけれども、これだけ映画化されていない模様。
2012年に映画化の話は出てたようだけども。
スティーブン・キング「マンハッタンの奇譚クラブ」映画化へ

これはどちらかというか映画化するよりも連ドラにして、毎回クラブメンバーの誰かが不思議な話を語るって感じにした方が良さげ。 完全なレギュラーキャラはスティーブンズだけにして、クラブメンバーは時々入れ替えたり、一回こっきりのキャラにしたりして。


悪くはなかったけれども、インパクトは『ゴールデンボーイ』の2作品には劣る感じがした。

うにのトゲは刺さると痛い(´・ω・`)-40 : Javaプラグインの利用 (Java側)

きっと他のことをやって全てを忘れてしまう未来の俺氏へのUnityで自作Javaプラグインを利用する時のJava側手順。

何故か他の人のコードを実行しようとすると上手く行かなかったので、Unity側から文字列を渡して、それにJava側が文字列を付加して返すという簡単なものにした(´・ω・`)

面倒だったのでAndroid10決め打ちにした。
日本語化が上手く行ってないのか、メニュー等がなんか中途半端な状態になっているw

参考サイトというか目を通したり試したエントリはたくさんあるのだが、ブックマークに残っていたのは下の3つくらいだった(ノ∀`)マタヤラカシタ
Unityのプラグインを作るAndroid/iOS
[Android]Unityへ組み込むAndroidライブラリビルド手順解説
突然仕事でUnity向けのSDKやPluginを作ることになった人向け資料<Android実践編>


他の人のエントリを色々読み、理解せずにやっていたから気が付かなかったが、手順8~11のUnityのClass.jarのコピーにまつわる作業は、Java側でUnityPlayerActivity等をいじったりしない場合は必要ない気がする…( ・´ω・`)トバシテイイ


  1. Android Studioを起動し、[Create New Project]をクリック。
  2. [No Activity]を選択し<次へ>をクリック。
    ※目的はモジュール作成の為、実際にはActivityは何を選んでも問題はない筈。

  3. 任意のプロジェクト名を指定し、[Minimum SDK]で"API 29 Android 10.0"を選択し、<終了>をクリック。
    ※うちの実機はAndroid10なのでこの選択をしているが、必ずしも10でなければならないわけではない。但し、他のバージョンでは動作確認をしていない。
  4. プロジェクトの作成が終わったら、[ファイル]-[New]-[New Module]の順に選択。
  5. [Android Library]を選択し、<次へ>をクリック。
  6. [Module Name]に任意の名前を指定、[Minimum SDK]で"API 29 Android 10.0"を選択し、<終了>をクリック。
    ※この例では[Module Name]を"UniAndLib"に指定。
  7. <プロジェクト>プルダウンをクリックし、"プロジェクト"をクリック。
  8. 使用する予定のバージョンのUnityのフォルダで"Class.jar"をコピー。
    この例ではUnity Hubを使用し、バージョン 2020.2.4f1 を使用。かつmonoではなくil2cppでビルド。
    "C:\Program Files\Unity\Hub\Editor\2020.2.4f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes"

    カスタムインストール時は当然のことながら、Class.jarの在り処は変わってくる。

  9. Android Studioのプロジェクトの新しく追加したモジュール配下のlibsフォルダに貼り付け。
  10. ダイアログが表示されたら、<リファクタリング>をクリック。
  11. 新しく追加したモジュール配下のbuild.gradleをダブルクリック。
  12. build.gradleが表示されたら、dependenciesの箇所に
    compileOnly fileTree(dir: 'libs', include: ['*.jar'])
    compile 'androidx.appcompat:appcompat:1.1.0'
    

    を追加。

    これを追加しておかないと、"Execution failed for task ':launcher:checkDebugDuplicateClasses'"とかいうエラーが出る筈。Android Studioで作ったライブラリ側とUnity側にUnityのClass.jarが存在しちゃって、その辺がいけないらしい…

    ※compileのところに打ち消し線が出るのでDeprecatedかなにかなのかもしれないがキニシナイ( ゚ 3 ゚)
    もしかしたらそもそも必要ないのかな? よくよく見ると下の行で"appcompat:1.2.0"をimplementationしてるから要らないか?

  13. 新しく追加したモジュール配下の[src]-[main]--[パッケージ名]のフォルダを右クリックし、コンテキストメニューが表示されたら、[新規]-[クラス]の順に選択。

  14. 「New Java Class」ダイアログが表示されたら、クラス名を指定し、"Class"をクリック。
    ※この例ではクラス名に"ReturnString"を指定。
  15. 作成したクラスがエディタに表示されたら、以下の内容を入力して保存。
    package com.example.uniandlib;
    
    public class ReturnString {
        public String returnResult(String fromUnity) {
            return "Via Java Lib:\n" + fromUnity;
        }
    }
    

    (パッケージ名やクラス名を任意の値を指定している場合は適宜書き換える。)

  16. メニューで[ビルド]-[Rebuild Project]の順に選択。
  17. ビルドが終了するまで待つ。
    (ウィンドウ下のステータスバーで以下のようなの表示がされている間はビルド実行中。)

以上がUnityで使用できるJavaプラグインの作成方法。

画像を入れたら長くなりすぎたので、Unity側は次のエントリで…(ヽ'ω`)


CommandInvokationFailure: Gradle build failed.

このエラーが出た場合は、一回エクスポートして、Android Studio側でインポートしてGradleをアップグレードしないといけないとかどうとか。

参考:
Gradle build failedが出る(Unity2019から)

うにのトゲは刺さると痛い(´・ω・`)-41 : Java プラグインの利用 (Unity側)

前回のエントリに続き、Unity側の手順。
尚、今回の設定値等は前回の設定値と対応している。


  1. Unity Hubを起動し、任意のバージョンのUnityでプロジェクトを作成する。
    ※この例では"2020.2.4f1"
  2. [2D]を選択、任意のプロジェクト名を指定し、<作成>をクリック。
    ※この例では"UniAndLink"。ちなみになんでネーミングにブレがあるかというと、それほど深く考えて作らなかったから(ノ∀`)
  3. Unityが起動したら、[ファイル]-[ビルド設定]の順に選択。
  4. 「Build Setting」タブが表示されたら、[App Bundleをビルド]、[開発ビルド]、[スクリプトデバッグ]を有効にし、 をクリック。

    ※ここは実機デバッグをしない場合は必要ないかも(ノ∀`) [App Bundleをビルド]はそもそもこんな実験プログラムでは必要ないか。

  5. プラットフォームの切り替え処理が終了したら、<プレイヤー設定>をクリック。
  6. 「Project Settings」タブが表示されたら、[企業名]に任意の値を指定。

    ※今もDefaultCompanyだとビルド出来ないのかどうか不明(ノ∀`) もしかしたら変えなくてもいいかも。

  7. [最低 API レベル]を"Android 10.0(API level 29)"、[スクリプティングバックエンド]を"IL2CPP"、[API 互換性レベル]を".NET 4.x"にそれれぞれ設定し、[ARM64]を有効にする。
  8. 「ゲーム」タブに切り替え、画面アスペクト比を"1920x1080 Portrait"を選択。
    ※尚、この辺の手順は実機デバッグでLogを確認する場合には必須ではない(ノ∀`)
  9. 「ヒエラルキー」タブ上で右クリックし、コンテキストメニューが表示されたら、[UI]-[テキスト]を選択。
    ※この例では作成されたTextコンポーネントを持つゲームオブジェクト名を"result"に指定。
  10. 「ヒエラルキー」タブ上で右クリックし、コンテキストメニューが表示されたら、[UI]-[ボタン]を選択。
  11. 「ヒエラルキー」タブ上で"Canvas"を選択し、インスペクターで、
    Canvasコンポーネントの[レンダーモード]で"スクリーンスペース - カメラ"を選択し、[レンダーカメラ]に「ヒエラルキー」タブ上の"Main Camera"をドラッグ&ドロップ。

    Canvas Scalerコンポーネントの[UI スケールモード]を"画面サイズに拡大"、[参照解像度]の[X]と[Y]にそれぞれ"1080"と"1920"を指定。[マッチ]の値を"1"に。

  12. 「プロジェクト」タブ上でAssetsフォルダ以下にPluginsフォルダ、Pluginsフォルダ内にAndroidフォルダを作成し、そこにAndroid Studioでビルドしたプラグイン(ライブラリ)をドラッグ&ドロップ。

  13. 「プロジェクト」タブ上でAssetsフォルダ以下にScriptsフォルダを作成し、Scriptsフォルダ内に"C#スクリプト"を任意の名前で作成。
    ※この例では"CallJavaLib"

  14. 前項で作成したスクリプトファイルをダブルクリックし、Visual Studioが起動したら、以下の内容を入力し、保存。
    ※余り深く考えずに人のコードを切った貼ったしてて気が付かなかったが、これjavalibがstaticである必要もないし、PushButton()メソッドのローカル変数で良かったな(ノ∀`)

    (パッケージ名やクラス名を任意の値を指定している場合は適宜書き換える。特にAndroidJavaObjectをNewする際のパッケージ名を間違えないこと。)

    using UnityEngine;
    using System.Collections.Generic;
    using UnityEngine.UI;
    
    public class CallJavaLib: MonoBehaviour
    {
        static AndroidJavaObject javalib = null;
    
        public static void PushButton()
        {
            Debug.Log("Pushed");
            javalib = new AndroidJavaObject("com.example.uniandlib.ReturnString");
    #if UNITY_ANDROID && !UNITY_EDITOR
            GameObject.Find("result").GetComponent<Text>().text = javalib.Call<string>("returnResult","From Unity");
    #endif
        }
    }
    

  15. Textコンポーネントを持つゲームオブジェクトとButtonコンポーネントを持つゲームオブジェクトのサイズの位置を任意で変更する。
    ※この辺は正直適当で良い(ノ∀`)
  16. Textコンポーネントの[フォントサイズ]を"50"、[色]を黄色に指定する。
  17. 作成したスクリプトをButtonコンポーネントを持つゲームオブジェクトにドラッグ&ドロップ。
  18. ドラッグ&ドロップしたスクリプトが追加されていることを確認し、Buttonコンポーネントの[クリック時]の<+>をクリック。
  19. Buttonコンポーネントの[クリック時]のオブジェクト欄に「ヒエラルキー」タブ上のButtonをドラッグ&ドロップ。

  20. Buttonコンポーネントの[クリック時]の関数欄から[追加したスクリプトファイル]-[ボタン押下時に実行させたいメソッド]の順で選択。
    ※この例では"CallJavaLib"の"PushButton()"。
  21. 実機に接続し、「Build Settings」タブの<ビルドして実行>をクリック。
  22. aabの名前を指定して<保存>をクリック。
  23. 問題がなければ、実機上で以下のように表示され、ボタンをクリックすると、Javaライブラリ上で指定した文字列が追加されTextコンポーネント上で表示される。

内容的に大したことをしていないが、取り敢えず、Javaプラグインの初歩の使い方は理解出来たので良しとしよう(・∀・)

久しぶりに手順みたいなのを作ったから、色々と瑕疵がある(ノ∀`)

うにのトゲは刺さると痛い(´・ω・`)-39

それほど必要でもなかったのだが、Unity上でMediaStoreとContentResolverを使って画像を取得する方法を調べて2~3日くらいを潰す…

未だにまともに画像表示出来ていないが50%くらい目的を果たせたので取り敢えず、その苦闘の記録を残すとする(ヽ'ω`)

正直な所、Javaでプラグインを書いた方が早いような気がする(ノ∀`)

※尚、以下のコードは色んなところから切り貼りしたり、適当に書いている為に、変数名等は統一されていないw


AndroidJavaClassとかってよくわからない(´・ω・`)

まず第一にAndroidJavaClassやAndroidJavaObjectや、そのメソッドの呼び出しであるCallやCallStaticがよくわからずに躓く…__○_
どうもReflectionみたいな感じでJavaのオブジェクトを扱ってるのかなぁ?って感じか。

習うよりも慣れろというか、コード実行の成功という或る種の成功体験、つまりは自己の環境に問題がなく、そのコードの内容が完全ではなくてもある程度のレベルで実行出来るという正当性を確認してからじゃないと、中々コードの内容の理解が進まない俺氏なので、色々とぐぐって試した。

他にも見たサイトやコードはあったような気もするけれど、比較的楽に動作を確認できたのが下の4つ。

アラートダイアログの表示
【Unity】Androidのネイティブの機能を使う

インテントでブラウザを開く
UnityC# で完結できるAndroidプラグインを簡単に作っちゃうぞ!☆ミ

インテントでギャラリーを開く? その他色々 5番目のコードだったかな?
在unity中如何高效的使用内置android方法

これは何か書き換えたんだったか間違えたんかわからないけど、JsonUtility.ToJsonが"{}"しか吐かなかったので、普通に文字列化した日時を書き込むように変更して試した。実機デバッグでファイルが書き込まれること、catで内容を確認した。
UnityでAndroidの内部ストレージにファイルを保存する


動作するコードを確認した結果、なんとなくはわかってきたような気がする。

AndroidJavaClassは完全限定名を渡してnewするものみたい。
どういう仕組かようわからんけど、newしてるけど扱いとしてインスタンスじゃなくてクラスなのかな?
メソッド呼び出しもCallStaticというStaticメソッドだし…

AndroidJavaObjectは普通のインスタンスとしてCallでメソッド呼び出しする。
最初のStringがメソッド名でそれ以降が可変長引数のobject配列らしい。
ここの処理もどうしてるのかよくわからない。

多分、基本的に下の2行は常にやる感じ?
UnityPlayerオブジェクトと現在のアクティビティ(つまりはコンテキスト)を取得してる模様。

AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");

関係ないが、完全限定名以外に正規名なんてのもあるのか(´・ω・`)
完全限定名と正規名とバイナリ名


ContentResolverやらMediaStoreで苦しむ

むかーし、Androidのページの翻訳もどきをちょこっとしてた時にContentProviderやContentResolverという言葉を目にしてたが、がっつりとそのクラスを使ったことがなかったので、色々と苦労した…(ヽ'ω`)

ContentResolver.query()等の抽出操作についての理解とそれをC#側から行う為の試行錯誤の為にえらく時間を要した…

最初に参考にしてたページ群で使用されていた画像系のcolumn名がAndroid10では使えなかったようで、それに気がつくまで時間がかかった…
何がいけないのかがわからなかったから(ノ∀`)

たまたま見かけた音楽系のタグを使用して、音楽タイトルの取得に成功した。
尚、このページの内容はよくわかっていないw
ロシア語は全くわからんw

参考?:
Плагин: сканирование устройства на наличие аудиофайлов

Unity完結での音楽タイトルの取得
    public void GetMusicMedia()
    {
        try
        {
            AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject contentMusicUri = new AndroidJavaClass("android.provider.MediaStore$Audio$Media").GetStatic<AndroidJavaObject>("EXTERNAL_CONTENT_URI"); 
            AndroidJavaObject contentResolver = currentActivity.Call<AndroidJavaObject>("getContentResolver");
            AndroidJavaObject cursor = contentResolver.Call<AndroidJavaObject>("query", contentMusicUri, null, null, null);

            int titleColumn = cursor.Call<int>("getColumnIndex", "android.provider.MediaStore.Audio.Media.TITLE");

            while (cursor != null && cursor.Call<bool>("moveToNext"))
            {
                string m = cursor.Call<string>("getString", new object[] { titleColumn });
                Debug.Log("m:" + m);
            }

            if (cursor != null)
            {
                cursor.Call("close");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message);
        }
    }
ImageのタイトルやIDの取得
public void GetPicMedia()
    {
        try
        {
            AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject contentUri = new AndroidJavaClass("android.provider.MediaStore$Images$Media").GetStatic<AndroidJavaObject>("EXTERNAL_CONTENT_URI");
            AndroidJavaObject contentResolver = currentActivity.Call<AndroidJavaObject>("getContentResolver");

            AndroidJavaObject cursor = contentResolver.Call<AndroidJavaObject>("query", contentUri, null, null, null,null);


            int titleIndex = cursor.Call<int>("getColumnIndex", "android.provider.MediaStore.MediaColumns.Title");
            int IDIndex = cursor.Call<int>("getColumnIndex", "android.provider.MediaStore.MediaColumns._ID");
            while (cursor != null && cursor.Call<bool>("moveToNext"))
            {
              
                if (titleIndex != -1)
                {
                    Debug.Log("title:" + cursor.Call<string>("getString", new object[] { titleIndex }));
                }

                if (IDIndex != -1)
                {
                    Debug.Log("ID:" + cursor.Call<string>("getString", new object[] { IDIndex }));
                }

            }

            if (cursor != null)
            {
                cursor.Call("close");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message);
        }
    }

EXTERNAL_CONTENT_URIの指定

ちなみにEXTERNAL_CONTENT_URIの指定でもはまった。
これはStack Overflowのページだったかどっかに書いてあったが、何処で見たかわからない(ノ∀`)
複数のページの情報を総合したのかもしれない。

AndroidJavaClass("android.provider.MediaStore$Audio$Media").GetStatic<AndroidJavaObject>("EXTERNAL_CONTENT_URI"); 

コラム名の取得

これはどんなcolumn名があるのか知りたくて調べたんだっけかな?
確かImageのDATAとかがDeprecatedで…

全cloumn名の取得
public void GetColumnsName()
    {
        try
        {
            AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
            AndroidJavaObject contentImageUri = new AndroidJavaClass("android.provider.MediaStore$Images$Media").GetStatic<AndroidJavaObject>("EXTERNAL_CONTENT_URI"); 
            AndroidJavaObject contentResolver = currentActivity.Call<AndroidJavaObject>("getContentResolver");
            AndroidJavaObject cursor = contentResolver.Call<AndroidJavaObject>("query", contentImageUri, null, null, null, null);

            string[] colNames = cursor.Call<string[]>("getColumnNames");

            foreach(string colName in colNames)
            {
                Debug.Log("colName: " + colName);
            }

            if (cursor != null)
            {
                cursor.Call("close");
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.Message);
        }
    }

参考:
Android開発: ”ContentResolver” とは何者か?


enumの取得

AndroidJavaClass BitmapConfig = new AndroidJavaClass("android.graphics.Bitmap$Config");
AndroidJavaObject RGB_F16 = BitmapConfig.GetStatic<AndroidJavaObject>("RGBA_F16");

参考:
How to access enum in Unity AndroidJavaClass


上手く行かなかったもの

ContentResolverへ渡すprojectionを作る方法を探して試してみたが、なんか駄目だった(´・ω・`)
やり方を変えたら上手く行くかもしれないが、

まあ、全部取得しちゃってもよくね( ゜σ・゚)ホジホジ?

という高度な政治的判断により、掘り下げることをやめた(ノ∀`)

配列引数作成?
private AndroidJavaObject javaArrayFromCS(string[] values)
    {
        AndroidJavaClass arrayClass = new AndroidJavaClass("java.lang.reflect.Array");
        AndroidJavaObject arrayObject = arrayClass.CallStatic<AndroidJavaObject>("newInstance", new AndroidJavaClass("java.lang.String"), values.Length);
        for (int i = 0; i < values.Length; ++i)
        {
            arrayClass.CallStatic("set", arrayObject, i, new AndroidJavaObject("java.lang.String", values[i]));
        }

        return arrayObject;
    }

参考:
AndroidJavaObject.Call array passing error (Unity for Android)
Setting fields of an android java object from unity C#, including array


Bitmap => byte配列

immutableだかなんかとエラーが出たのでcopyをしたが、これが本当に正しい対処かどうかわからない。

AndroidJavaClass BitmapConfig = new AndroidJavaClass("android.graphics.Bitmap$Config");
AndroidJavaObject RGB_F16 = BitmapConfig.GetStatic<AndroidJavaObject>("RGBA_F16");
bitmap = bitmap.Call<AndroidJavaObject>("copy", RGB_F16,true);

Bitmapをbyte配列にする

これで一応Byte配列になるような感じなのだが、

AndroidJavaClass ByteBuffer = new AndroidJavaClass("java.nio.ByteBuffer");
AndroidJavaObject byteBuffer = ByteBuffer.CallStatic<AndroidJavaObject>("allocate", bitmap.Call<int>("getByteCount"));
bitmap.Call("copyPixelsToBuffer", byteBuffer);
byte[] bmparr = byteBuffer.Call<byte[]>("array");

その後、以下のようにしてTextureを作成して、

Texture2D texture = new Texture2D(width, height);
texture.LoadImage(bmparr);
texture.Apply();

TextureをSprite.CreateでスライトとしてImageに突っ込んで上手くいかなかった(ヽ'ω`)

なんか反転して、色が赤だけで他の部分は透過して描画されていたような…
もう少し頑張って駄目だったら、素直にJavaでプラグインを作るか…

つーかそもそも必須な機能じゃないんだよな、今調べてることってw

参考:
AndroidでのBitmap/JPEG/byte配列の相互変換


いちいち[デバッグ]メニューをクリックしてから[Unityデバッガーのアタッチ]をクリックするのがめどい(´・ω・`)

普通に設定で表示出来るのかなと思ったが、ちょっと一手間必要だった。
なんで「コマンドの追加」で選択する時の表示名が"Unityデバッガーのアタッチ"ではなくて"cmdldUnityAttach"なのだろうか。
わかりにくい(´・ω・`)

まあでもツールバー上に追加出来たので良しとする。

参考:
VisualStudio2019でUnityデバッガーのアタッチをツールバーに置く


調べ物に疲れてしまったのと日銭を稼ぎに行かないといけないので、しばらく更新は途絶えるかもしれない(ノ∀`)