カテゴリー: プログラミング

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

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

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

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

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


他の人のエントリを色々読み、理解せずにやっていたから気が付かなかったが、手順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プラグインの初歩の使い方は理解出来たので良しとしよう(・∀・)

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

覚書 : jQueryを用いた埋め込みデータ表示

きっと未来の俺氏はいつものように過去にやったことをほぼほぼ全部忘れてしまい、「これ、なんだったかのぅ("・ω・゙)」となるに決まっているので、自分の為に覚書を残す。

デザインやらコードやら、色々と手直ししたいところはあるものの、取り敢えずこれでいいか。

このデータ埋め込みだと、コードをそのままコピペすることも出来るし、コメントも埋め込めるので視認性は良いかなぁと思うのだけれどもどうかなぁ…(´・ω・`)

cssでも実現可能なら、いずれはcssのみで実装したいところではある。


disp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8">
<meta http-equiv="content-style-type" content="text/css">
<title>embedded_data</title>

<style type="text/css">
div#disp {
white-space: nowrap;
border: solid 1px #808080;
width:100%;
height:150px;
padding: 0.5em;
line-height: 1.8em;
overflow: auto;
background-color:#eeeeee;
}

div#code {
white-space: nowrap;
border: solid 1px #808080;
width:100%;
height:250px;
padding: 0.5em;
overflow: auto;
background-color:#dddddd;
}

.ml-1 {
margin-left: 20px;
}
.ml-2 {
margin-left: 40px;
}
.ml-3 {
margin-left: 60px;
}
.ml-4 {
margin-left: 80px;
}

</style>
</head>
<body>

<div id='disp'>disp</div>

<div id='code'>
<span id='d1' class='dc'>aaa</span><br>
<span id='d2' class='dc'>bbb</span><br>
</div>

<div>
<span id='d_d1' data-con='aaa'></span><br>
<span id='d_d2' data-con='bbb'></span><br>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type='text/javascript'>
jQuery(function () {
let orgColor;
$('span.dc').hover(
function () {
orgColor = $(this).css('color');
$(this).css('color','red');
var id = '#d_' + $(this).attr('id');
$('#disp').html($(id).attr('data-con'))
},
function () {
$(this).css('color',orgColor);
}
);
});
</script>
</body>
</html>















こういうのをもっと楽にできないのだろうか(´・ω・`)?

こんな感じのやつ(´・ω・`)


disp
package org.example
import org.other.samplefunc.dosomething
import org.other.samplefunc.*

fun main(){
println("Hello kotlin!");
}




ちなみにここに至る流れは、

Kotlin Koans、これきちんと勉強しないと解けないやつやんけヽ(`Д´)ノ
 ↓
でも全部翻訳するのも時間がかかりすぎるし、基本部分だけ読んでなんか作るかぁ…
 ↓
取り敢えず読む
 ↓
(#^ω^)イライラ
 ↓
って、なんで相変わらず、プログラミング言語の解説ページは紙ベース、HTML以上の進歩がないんだよヽ(`Д´)ノ
 ↓
スニペットと文章による説明って、紙の書籍とかPCというか大きいディスプレイで読む分にはなんとかなるけど、スマホとかだとお話にならんじゃろがいヽ(`Д´)ノ ←老眼や老化のせいで小さい字が読みにくいというのもある("・ω・゙)
 ↓
断片的で体系的な学習を阻害する部分もある。
 ↓
ということで、標準的な一個のプログラムを提示し、説明したい各要素に触れることによって説明文等が表示出来る新しいフォーマットがあるべきじゃろヽ(`Д´)ノ
 ↓
だけど僕にはオツムがない~(・∀・)♪ ←新しいフォーマットを考える頭も気力もない
 ↓
まあ、aタグでtitle属性に書けば一応実現できるけどねぇ…( ゜σ・゚)ホジホジ
 ↓
スマホだと上手く動かない? onstarttouchを使えばいいのかもしれないがaタグだとインテントが飛んでそれをキャンセルする手間が発生する? 加えて言うと出来れば説明文自体は他所から持って来たい。
 ↓
取り敢えず、スマホ操作時に影響がない表示の実現をcssで図る。
CSSだけでツールチップを表示する
 ↓
だがしかし、説明文の分離とフェッチを俺氏のcss知識ではどうやっていいかわからない(´・ω・`)
 ↓
cssは諦めて、なんやかんやでjQueryで分離も可能に。そこまでしてないけれども、説明文は別ページに置いておいたり、もう少しidとclassをまとめることも出来そう。
 ↓
何故かdivでx方向のスクロールが出来ないと勘違いし、一時、iframeをいじくったり、srcdoc属性でjQuertyが使えないかと色々やってはまる。(正確に言うとwordpressのエントリ上のiframeのsrcdoc属性でjQueryを使おうとしていた。)
結局divで出来ることに気づいてiframeのことは忘れることにした(ノ∀`)
 ↓
キーワードの色付とか出来ないかなと思って色々奮闘したが、いまいち希望通りの形にならず、同時に「あれ? これ説明文を作る時に色付けとかすればいいのか(´・ω・`)?」と気付き、取り敢えず、
当初の新フォーマット的なものの提示だけしとこう(・∀・)ということに。

今回のものはコードが対象だけれども、これってもう一歩進めてあらゆる文書、解説書のみならず、小説とかでも語句の意味や時代背景とかを埋め込んで表示させるとかも出来ると思うし、やるべきなんではなかろうかと思う。英語文書の日本語訳埋め込みとかでもいいし。

ちなみに今回、上に表示divを配置したのはスマホで見た時に下に表示divがあると指で隠れてしまうという致命的欠陥があることに気づいた為(ノ∀`)

何はともあれ、
こういったことが簡単にできるフォーマットなり、統一的な決まりが作られて、より電子機器の利点がより活かされる流れになってほしい(・∀・)

もしかして俺氏が寡聞なだけで既にあるけど流行ってないとかなのだろうか…(´・ω・`)?