カテゴリー: C#

うにのトゲは刺さると痛い(´・ω・`)-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プラグインの初歩の使い方は理解出来たので良しとしよう(・∀・)

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

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

結局、力尽きた…_| ̄|○

TowerDefenceTutorialのTowerフォルダ以下のコードまでは目を通したが、力尽きたというか、

飽きた(・∀・)
ということで挫折(ノ∀`)

読み進める為に参考にしたエントリは以下の通り。理解したと思ってもすぐ忘れてしまうので、またいつか読む時の為に。

参考:
デリゲートとは【C#】
【Unity】UnityEventの用法と用量
数学系の処理を扱うMathfの全変数と全関数【Unity】
[Unity][Unity3d] Unity の C# で限りなく小さい float 値を使いたい時には float.Epsilon を使ってはダメ
Time.fixedDeltaTimeとTime.deltaTimeについて
【Unity】ISerializationCallbackReceiverを使ってみたんだ
数学系の処理を扱うMathfの全変数と全関数【Unity】
インデクサー
Java プログラマのための C# 入門 (#4 クラス定義の応用的なことと演算子のオーバーロード)


何故かMole's Match-upはリファクタリングを開始している。
中学生漢字データを作成しないといけないのに(ノ∀`)

何はともあれ、遊んでないで早く仕事を探さないといけない…(ヽ'ω`)

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

スポーンとやる気が飛んだ模様(´・ω・`)

そろそろ遊んでいられなくなったり、Google+閉鎖で次何処に行こうかと色々探しながら、チュートリアル消化を続けていたが、二つ続けてギブアップしてしまい、なんだかやる気が消失。

挫折したチュートリアル一件目はアドベンチャーゲーム。これもワークショップだかトレーニングデイの映像を流用したもの。

既に何件か、この手の形式のチュートリアルを観てきて、かなり飽きてきていたのに加えて、あんまり興味のない3D移動のアドベンチャーということもあり、途中で止めてしまった(ノ∀`)

navMeshやらScriptableObjectを使用しているようなので、それはそれで理解したら為になるとは思うものの、これは日本語で解説してくれているサイト等で勉強してもいいかなぁと思ってしまった。


挫折したチュートリアル二件目はタワーディフェンステンプレート

これは動画なしのテキストオンリーだったが日本語訳がされていたので、一瞬、「お(・∀・)」と思ったが、かなり内容を端折ったチュートリアルだった…(ヽ'ω`)

正直、訳がわからない(´・ω・`)
これは完成プレハブをいちいち開いてみて、その値やアタッチされているコンポーネントを真似しないと駄目?
中級向けとはいえ、これはチュートリアルなんだろうか。

せめて、もっと外殻や構造の説明があれば、それがとっかかりになるが、この状態では全く内容の想像がつかない。完成プレハブやコードを一から見ていかないといけないのであれば、これはチュートリアルとは言うべきではないか、上級にすべきではないかなぁ。上級というのもおかしいかな。サンプルという方が正しいのかもしれない。

今までのチュートリアルもレディメイドのものを持って来てどうこうするという形だったので、個人開発者向けというよりかは、グラフィッカー等々の別の人間が作ったものを組み立てていくような企業所属の分業プログラマ向けの内容ではあったが、それでもまだ動画の流れに従っていればゲームは完成するので、チュートリアルであったと言える。

このチュートリアルはその動画がなく、テキストでは細い説明はしていない……もしかしたら、どっかにあんのかな(´・ω・`)

というわけで取り敢えず挫折した…(ヽ'ω`)


しばらくはチュートリアルは触らない方向で…

という結論に達したものの、なんやかんやでスクリプトを読み始めた(´・ω・`)

まだTower絡みを幾つか読んだだけなので勘違いしているのかもしれないが、

  • 「Tower コンポーネントを理解する」で"Tower Description"が表示されるように書いてあるが、"Tower Description"はTowerLevelDataのパブリック変数なのでTowerコンポーネントでは表示されない?
  • 「エージェントの作成」でAlignmentフィールドに"Ememy (SimpleAlignment) スクリプタブルオブジェクトをドラッグ"するように書いてあるけれど、これってDamagerを先にアタッチしてないと駄目な気がするんだけれども、その前の手順を行った場合に自動的にアタッチされるんだろうか?
  • "Towers"等のコメントのIntiailisesでiが抜けてる。
  • "TowerLevel"のコメントでITowerRadiusProviderがITowerRadiusVisualizersになっている?

と言ったところが気になり申した(´・ω・`)

あとこれは全然関係ないが、書いている人がイギリス英語の人らしく、initialiseとかを見ると「ん(´・ω・`)?」となってしまう(ノ∀`) メソッド名はInitializeだったりするからw
英文に慣れている人ならば、イギリス英語とアメリカ英語の違いを気にせずに居られるんだろうなぁ。

最後まで読み切るかどうかは判らないが、取り敢えず読んでみるか。


中学生漢字の入力がまだ300ちょいまでしか行っていない(ヽ'ω`)
あの作業はかなり苦痛なので、Mole's Match-upのアップデートはまだまだ先だな……

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

Tanks tutorialをやった

これは「Survival Shooter tutorial」と同じような感じ。2015のボストンのトレーニングデイの内容なのかな? まあ詰まる所、プリメイドのアセットを使って行くパターン。

トランスクリプトがなくて、ほとんどの動画が長かったので辛かった(ヽ'ω`) まあ使用したスライドがPDFで用意されていたので、それを眺めたりして何とか最後まで頑張った。

ということでいつものようにあんまり内容は理解していない(ノ∀`)

長かったけれども、特に引っかかるというところはなかったかな?
バージョン違いによる修正点は幾つかあったようだけども。

参考:
【Unity】戦車が撃ち合うゲーム「Tanks!」はどのように作られてるのか
Unity「Tanks tutorial」メモ
三章まで?
TANKS!チュートリアルの手順まとめ Part1(PROJECT & SCRNE SETUP)

Physics.OverlapSphere
Rigidbody.AddExplosionForce


WebGLに出来たので、埋め込んでみたが、レイアウト崩れを起こしたのでリンクに変更(ノ∀`)

1P WASD space
2P cursor enter
(前と同じようにサウンドのON/OFFをつけたが、マウスクリックで変更した後、何処か他の部分をクリックするなどして、トグルをカレントではない状態にしておかないと、スペースキーを押した時にサウンドがOFFになってしまう(ノ∀`))

https://mole-kingdom.com/wpbl/unity_webgl/TanksTutorial/index.html


reiterateの発音

全然関係ないが、チュートリアル動画中に出てきた"reiterate"(何度も何度も繰り返す、反復して言う)という単語をぐぐって発音を聞いてみたがweblioで聞ける発音がリゲドレイトみたいに聞こえて悩む(´・ω・`)

更にぐぐってみると、

「リイタレイト」 「リイテレイト」 当の答えが出ていたのですが
どうもネイティブの音声とかけ離れている気がしてなりません

ウェブリオ等の音声サンプルを何度か聞いたのですが、
私には、強いて表記するなら「リエレレイト」と聞こえます
reiterateの発音について既出のようですが、あ…

とある。まあこれは発音記号から見ても納得が行く。

もしかしてそう言っているのに俺氏の耳が腐っててそう聞こえるのかなと思ったが、
“reiterate” 英語の発音のところの音声だと、知恵袋の答えにあるような感じで聞き取れる。

この違いは何なのか…(´・ω・`)ワカラン


文字化けで削除できないファイルの削除

teratermでWebGLのファイルを固めたzipを送信する時に、[SSH SCP]でやらずに、直接送信みたいな感じになってしまったので、それを中止しようとCtrl+cとかを連打したけど止まらなかったヽ(`Д´)ノ

その後ホームディレクトリを見てみたら、変な文字化けしたファイルが沢山発生していた(´;ω;`)

消し方がわからなかったのでぐぐったら、

ls -i

でファイルナンバーを表示し、

find . -inum nnnnnnn -exec rm -rf {} \;

みたいにファイルナンバーを指定して削除すれば良いらしい(・∀・)タスカッタ


次はアドベンチャーゲームかな。
そろそろ遊んでられなくなってきたので、これからはゆっくりペースで消化していくかな(´・ω・`)