TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Unity: UI Toolkit 勉強中(ざっくり概要まとめ)

UI Builderができないこと (= GUIではできず、手動でuxmlに直書きしないといけないこと)

などがあり、記述方法はある程度覚えないといけないみたいです。

Templateの作り方

流れは

  • templateを読み込む
  • instance化

Templateを一度読み込めばあとは好きなだけInstance化できます

template

<ui:Template name="aaa" src="template uxml path" />

これをuxmlに書きます。

  • src属性: templateのUXMLのパス
  • name属性: 他の参照キーになる名前

templateをインスタンス

<ui:Instance template="aaa">
  • template属性: templateのname (Templateのnameがaaaの場合はInstanceのtemplate属性がaaa)

Template作ってAttributeをOverrideする

テンプレートの記述は省略
main.uxml

<ui:Instance template="aaa" name="ok" >
    <AttributeOverrides element-name="abc" text="Window name override"/>
</ui:Instance>

template.xml

<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
    <ui:Button name="abc" text="Button" />
</ui:UXML>

ポイントは<ui:Instance>タグの中に<Attribute>を作ります。
紐付けはelement-nameとtemplateの紐付けたい要素のnameが同じになっていればAttributeがOverrideされます。

例だと
element-name="abc" と name="abc" が同じになっています。

Classの付け方 (GUI)


Style Class Listの空白のところに好きなクラス名を入れて、Add Style Class Listを入れるとすぐ下に追加されていきます。btnSampleと入れると.btnSampleが追加されました。複数入れたい場合は一回一回追加していくようです。

インラインスタイルをUSSに書き出す (GUI)


空白の入力項目に好きなクラス名を入れて、Extract Inlined Styles to New Classを押すとOKです。
すでにクラスを追加している場合は、バッジ状態になっているクラス名をダブルクリックでUSSに書き出し可能です。(.btnSampleのところ)

USS (CSSのこと)

  • htmlのidはuxmlではname (指定方法はname="hoge" なら #hoge {}となる)
  • htmlのclassはuxmlではclassで一緒 (指定方法はclass="hoge"なら .hoge {}となり、cssと同じ)

USSの読み込み方法

<Style src="USS PATH" />

をUXMLに書きます。srcにはUSSのパスを記述します。

USSの読み込み方法(GUI)


UI Builderの左上のStyleSheetsのプラスボタンを押すと

  • Create New USS
  • Add Existing USS

から好きな方を選択すればUSSを読み込めます

UXMLをUIBuilderに読み込む(GUI)


左上のところからFile > Openで既にあるUXMLを読み込むことができます。

検索する

  • 別記事

イベントを付ける

  • 別記事

VSCodeの補完

  • 補完は効かないので厳しい!
  • USSをCSS、UXMLをXMLとして扱うようにすればある程度補完は効きますが、やっぱりちゃんとしたものが欲しい!
  • Riderなら補完が効くらしい。(でも高い!)

Unity: VSCodeのC#のformatterの設定

Format On Save

VSCodeのsettings.jsonに以下を追加して、保存時にフォーマットされるようにします。

"editor.formatOnSave": true

EditorConfig

xrdnk.hateblo.jp
昔はomnisharp.jsonを設定していたらしいですが、古いやり方になってしまったので、EditorConfigを設定する方法が最新のやり方のようです。

.editorconfigを作ります。ルートプロジェクトで以下を実行します。

dotnet new editorconfig

お好みで設定する

.editorconfigをお好みで設定します。

うまく動かない時

  • VSCodeを再起動
  • EditorConfig for VS Codeが必要と書いてありますが、いらないみたいです? (これのせいで最初動かなかったです。)
  • C# Language Serverがおかしくなった時 -> C#とかC# Devkitとか関連のプラグインを一旦無効にして再度有効にすると直りました。
  • usingとusingの間に何故か空行が入ってしまう -> dotnet_separate_import_directive_groups = falseにしました
  • indent_sizeを変更しても、その通りにインデントしてくれない -> わかりません!(VSCodeの方で右下のspaceから手動で変更すれば一応回避できるけど・・・)

未解決

  • 不要な行の削除
  • usingの並べ方
  • 不要なusingの削除

などが動かない(元々そのような機能はないのかもしれない)ので、一旦疲れたので諦めました!

SSDエンクロージャーを使って、Thunderbolt経由の外付けSSDを自作する

状況

iMacSSDが512GBしかないのですが、ほぼ一杯になって作業ができなくなったので、容量を拡張しないといけなくなりました。
外付けSSDで拡張しようと思ったのですが、普通のUSB経由の外付けSSDは転送速度が最大1000MB/sくらいしか出ないらしく、あまり使いたくありませんでした。
Thunderbolt経由の外付けSSDなら最大3000弱MB/sくらい出るらしいですが、4,5万くらいするらしく、高いので、自作することにしました。

自作のThunderbolt経由の外付けSSDのメリット

  • メーカーのThunderbolt経由の外付けSSDよりも自作する方が値段が安い!
  • SSDの容量を気軽に2TBとか自由に選べる。

特に好きな種類、容量でM.2のSSDを選べるのが良いです。例えば、安売りしている時とかに買うことも可能ですし、2TBくらいのものを選んだ時の値段のコスパはすごく良いです。

自作のThunderbolt経由の外付けSSDの デメリット

  • 失敗する可能性がある。
  • 色々情報を下調べする必要がある。
  • 熱対策が必須。

M.2 SSDはRead, Writeともにとても速いですが、その分熱も出ます。なので、ヒートシンク、サーマルパッドなどで熱を放熱してあげないといけません。SSDにも色々種類があるので、熱が出やすいものもあるので、そこら辺の情報もしっかりと調べてないといけません。
成功の保証はどこにもありません。

iMacのスペック

  • iMac 2019
  • Thunderbolt 3
  • 内臓SSD 512GB

部品購入

部品購入は以下のサイトをすごく参考にして、ほぼこの通りに購入して、作業しました。
www.mikantabenagara.com

※ 以下のAmazonリンクはアフィリエイトやってないので、一切お金は入ってきません。

SSD エンクロージャ

M.2 SSD 外付けケース40Gbps USB4.0 NVMe M.2 SSDケース 高放熱 Thunderbolt 3/4 ポータブル SSD外付けケース アル アルミニウム製 エンクロージャ シルバー

SAN ZANG MASTER

SSD

Monster Storage 2TB NVMe SSD PCIe Gen 4×4 最大読込: 7,400MB/s 最大書き:6,600MB/s PS5確認済み M.2 Type 2280 内蔵 SSD 3D TLC メーカー5年保証 MS950G75PCIe4-02TB

サーマルパッド

Rongdeson サーマルパッド 経済型15パック 3種類の厚さ 熱暴走対策 冷却ラジエーターフィン 両面放熱シリコーンパッド 熱伝導性6.0 W/mk 軟らか材質 SSD CPU GPU LED ICチップセット冷却用 ブルー



お値段はトータル ¥25,294となりました。
2万5千くらいで高速の外付け2TBのSSDが手に入ると思うと安いんじゃないかと思います。

SSDについて

M.2 SSDはMonster Storageを購入しました。
こちらのSSDを調べてもらうとわかると思うのですが、中国と米国の貿易摩擦がなんとかかんとかで在庫が余ったハイスペック激安中華系SSDらしく、Amazonブラックフライデーで安くなってたので、2TBを購入しました。
このSSDは以下の特徴があるようです。

  • PCIe 4.0 x4
  • 読込: 7,400MB/s 最大書き:6,600MB/s
  • 低発熱
  • 片面実装
  • キャッシュなし
  • PS5確認済み

このSSDは以下のサイトの情報を参考にしました。
www.mikantabenagara.com

Thunderbolt3で40Gb/sまでなので、 7,400MB/s のスピードを最大限まで活かすことはできないので、PCIe 3.0 x4 でも十分らしいです。

キオクシア(KIOXIA) 内蔵 SSD 2TB NVMe M.2 Type 2280 PCIe Gen 3.0×4 (最大読込: 3,400MB/s) 国産BiCS FLASH搭載 5年保証 EXCERIA PLUS G2 SSD-CK2.0N3PG2/N 【国内正規代理店品】
¥14,980

キオクシアは上のようなスペックで¥14,980なので、Monster StorageはPCIe Gen 4.0×4で読込: 7,400MB/sで ¥12,733なのでMonster Storageに賭けました。

激安中華系SSDはサイレントパーツ修正のリスクがありますが、最悪失敗してもPS5に回せば良いかなぐらいの気持ちで買いました。

Monster Storageは片面実装なのでSSDエンクロージャーに合わせやすいと思いました。両面実装だともしかしたら、入らないかもしれません。

SSDにキャッシュはなく、その分最大速度の安定性が低くなりますが、その分発熱することもなさそうですし、良いかなと思いました。

他の同スペック帯のSSDよりも発熱が少ないという前情報もありました。

作業

作業は上であげた以下のサイト通りです。
www.mikantabenagara.com

方針

付属のヒートシンクとサーマルパッドは使用せず、別途購入したサーマルパッドで、入れ物に当たるように、サーマルパッドを重ねて、貼り付けました。

製品







SSDSSDを載せる基盤の間は1.5mmと0.5mmを使用しました。

SSDをはめるときになかなか入らなくて、20分くらい格闘してしまいました。
基盤にネジが4つあるのですが、3つはうまく外れましたが、1つはとても硬くて、ネジ穴が潰れてしまいました。外すことはできたのでギリギリ良かったです。

測定

iMacの内臓SSD

※ ほぼ容量一杯の時の速度です。

自作した外付けSSD

この結果は期待はずれです。
予想では2000 ~ 3000MB/sくらいを期待していましたが、1800MB/sくらいしか出ていません。
1800くらいでも十分速いので、ここで手打ちにしても良いのですが、ロマンを追い求め、2000~3000MB/sになるように原因を突き止めて行きます。

また、温度に関しては常時、人肌くらいの温度っぽかったです。

調査


設定 > 一般から下にスクロールするとシステムレポートがあるので、Thunderbolt/USB4を確認します。
すると最高速度が20Gb/sとなっており、Thunderbolt3の最高速度は40Gb/sなので期待値とは異なっています。

想定では以下のサイトのように40Gb/sになると思っていました。
M2 MacでUSB4.0,Thunderboltのエンクロージャーはどれくらい高速なのか !?

20Gb/sだと1800MB/sくらいしか読み取り速度が制限されるのかなと思いました。

予想: 付属のThunderboltが悪い説

付属のThunderboltのせいで速度が出ていないんじゃないかと思いました。
Thunderbolt3は仕様が少し曖昧で、20GbでもThunderboltを名乗れるようです。
予想では、付属のThunderboltはThunderbolt4の時は40Gbで、Thunderbolt3の時は20Gbになるように設計されているんじゃないかと勝手に思いました。

なのでAnkerの40Gb/sと表記されているThunderbolt3を買ってみました。
※ 以下のAmazonリンクはアフィリエイトやってないので、一切お金は入ってきません。

Anker USB-C & USB-C Thunderbolt 3 ケーブル (0.5m ブラック)【100W出力 / 40Gbps / 高速データ転送 / 4K対応 / 5K対応】MacBook/iPad Pro/iPad Air 他対応

この時以下のことを注意しました。

  • 安いのは買わない。
  • 40Gb/sが出るものを買う。
  • Thunderboltはすごく短くてもそれが普通。長いのは変なのがある。

本物のThunderboltケーブル、偽物のThunderboltケーブル | HanpenBlog
このサイトにもある通り、変なのは買わない方が良いようです。サイトで推奨しているメーカはCable Mattersでしたが、Thunderbolt3で20Gbのが売っていたので、やめました。
代わりにAnkerの40Gbものを選びました。

結果:別途購入したThunderbolt3で接続

結果は予想した通り、付属のThunderboltが原因で速度が頭打ちになっていたようです。
システムレポートでは最高40Gbにちゃんとなっています。(付属のものでは20Gbになっていました。)

速度は以下です。

Anker Thunderbolt3

Read: 3098.24 MB/s, Write: 1783.3.8MB/s

付属のThunderbolt

Read: 1892.85 MB/s, Write: 1694.16MB/s


ただ、Readは予想値以上ですが、Writeが上がりましたが、2000を下回っているので、期待値を下回りました。
他の方達の検証結果では2000MB/s以上出ているものがあるので、そこは少し残念でした。

ただ、SSDエンクロージャーの説明では「テスト読み込み:2700MB/s、書き込み:1400MB/s」と買いてあるので、十分と言えば十分かなと思います。

付属のThunderboltケーブルの悪いところ

  • Thunderbolt3接続だと20Gbに制限されてしまう。
  • 長時間繋いでいると勝手に接続が切れてしまう。
  • 2 in 1ケーブルが少し邪魔になってしまう。

Thunderbol4接続だとどうなるかは試していないので、わかりませんが、iMacのThunderbolt3接続だと上のようなデメリットになります。

2時間くらいスリープモードが続くと接続が切れます。何回か実験しても同じように接続が切れてしまうので、間違いないと思います。
確定ではありませんが、今のところ、AnkerのThunderbolt3ケーブルでは何回か実験しても、長時間のスリープ後に接続が切れることはありませんでした。

感想

とても速く、大容量で低価格な外付けSSDが完成して、満足です。
Writeの伸びがもう一押し欲しいところでしたが、Readが改善されたので一旦これで満足です。
Thunderbol3を別で購入したため、3000円ちょっとほどの追加費用がかかりましたが、それに見合うだけの価値だったので良かったです。

発熱は期待通りの温度で維持しているので、高温になることはありませんでした。
安定性に関してはまだこれから長く使っていって、検証して行きます。

Unity: MacでVisual StudioからVisual Studio Codeに移行してみた

状況

zenn.dev
ここによるとMacではVisual Studio For Macがサポート終了になるらしいので、順次VSCodeに移行していくことにしました。

環境

Mac 2019 (Intel)

VSCodeにインストールしたもの (最小構成)

Unity Code Snippets

marketplace.visualstudio.com

エラー (.NET Core SDK インストールされていない)

The .NET Core SDK cannot be located: Error running dotnet --info: Error: Command failed:

www.orionn.silver-fruit.com
ここを見ながらVSCode上のエラー出てたダイアログからダウンロードページへ遷移します。
.NET7.0 SDKが出てきましたが、

  • x64
  • Arm64

の2つが出てきました。

自分のMacがどっちのバージョンが必要かはお使いのMacによるので、
x86_64 か arm64 かをコマンド1つで確認する方法
ここによると

uname -m

を実行すれば良いです。
僕のMacIntel製なので

x86_64

と出てきましたので、x64をダウンロードしてインストールしました。

インストールが完了したか確認するために、

dotnet

と打ってみましたが、パスが通ってないようなので、パスを通します。
公式の「ダウンロードありがとうございました」の画面では

mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-7.0.403-osx-x64.pkg -C $HOME/dotnet
export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

のように書いてあったので、公式は$HOMEディレクトリにインストールする想定のようです。
公式の「手動でダウンロードしてインストールする」の項目でもそのようになってました。
macOS に .NET をインストールする - .NET | Microsoft Learn

実際には以下のフォルダにインストールされるようです。

/usr/local/share/dotnet

「?」と思いましたが、以下のパターンのどれかで良さそうです。

  • 公式の手動でインストールする方法にやり直す
  • シンボリックリンク貼る
  • .zshrcなどにパスを追加する

パス追加(.zshrc)
参考は以下です。
Mac + VSCode + .NET 5 SDK + C#拡張 で omnisharp がうまく動かない時のたったひとつのcoolな答え

# dotnet用のパス
export PATH=/usr/local/share/dotnet:$PATH

パスの再読み込み

source ~/.zshrc
dotnet -h

dotnetのヘルプメッセージが出てきてたらOKです。

VSCodeを完全に終了させて、VSCodeを再起動させればOKです。

# VSCodeのAccounts
VSCodeの左下のところにAccountsがあり、そこにMicrosoftのログインが求められましたので、とりあえず、ログインしときました。

使用感はどんなものか?

元々Visual Studio for Macには不満点(git周りなど)もいくつかあって、VSCodeに移行できなるなら移行したいと思っていたのですが、この機会に移行してみました。

Visual Studio for Macよりもすごく良いです。参照も補完もOnTriigerEnter2Dとかのスニペットもちゃんと出てくれるし、不満点は特にないです。
差分やgitもVSCodeなので、申し分ないです。
移行してよかったです。

C#スタイル、自動整形など細かい点は後々設定してくことにします。
デバッガーとかはまだ試してないです。

Unity: 「currentFileSystemTime.ticks != 0 using check file Temp/FSTimeGet-1938f0a485be842559ab99e8c24e87d2 => /Temp/FSTimeGet-1938f0a485be842559ab99e8c24e87d2 (file exists no, folder exists no)」

状況

Unityを2020.3からあげると以下のようなエラーが定期的に出てくるようになりました。

currentFileSystemTime.ticks != 0 using check file Temp/FSTimeGet-1938f0a485be842559ab99e8c24e87d2 => /Temp/FSTimeGet-1938f0a485be842559ab99e8c24e87d2 (file exists no, folder exists no)

エラーが出ているのですが、ビルドもできるし、再生ボタンも押せるし、問題なく動作するので害はなさそうです。

原因

Unityをアップデートしたときに、TempやLibraryフォルダを削除したので、その影響かもしれません。

解決策

How Do I Know If My Unity Project is Corrupted? - Questions & Answers - Unity Discussions
この記事にある通り、以下を実行しました。

  • Libraryフォルダを削除
  • Unity再起動

これで解決しました!

Unity: FirebaseでGradleでのビルドが通るまで

状況

Unity2020.3 -> Unity2021.3.31にアップデートしたときにFirebase関連のGradleでのビルドがうまく通らなくなりました。

環境

  • Unity2020.3.0
  • Unity2021.3.31
  • Firebase 11.3
  • Gradle

エラー1

WARNING: The option 'android.enableR8' is deprecated and should not be used anymore.
It will be removed in a future version of the Android Gradle plugin, and will no longer allow you to disable R8.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1.1/userguide/command_line_interface.html#sec:command_line_warnings
69 actionable tasks: 66 executed, 3 up-to-date

forum.unity.com

android.enableR8が非推奨となっていていますというエラーが出ていたので、gradleTemplate.propertiesから

android.enableR8=**MINIFY_WITH_R_EIGHT**

これをコメントアウトしておきます。

R8については以下の記事が参考になりました。
qiita.com

エラーその2

???がいっぱい出たエラー

????????????????????????????????????????????(1.8.0-adoptopenjdk)???Bug Database (http://bugs.java.com)?????????????????????????????????????????????Java bug????????????????????????(http://bugreport.java.com)???Java???????????????????????????bug??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)
/Applications/Unity/Hub/Editor/2021.3.31f1/PlaybackEngines/AndroidPlayer/OpenJDK/bin/java -classpath "/Applications/Unity/Hub/Editor/2021.3.31f1/PlaybackEngines/AndroidPlayer/Tools/gradle/lib/gradle-launcher-6.1.1.jar" org.gradle.launcher.GradleMain "-Dorg.gradle.jvmargs=-Xmx4096m" "assembleRelease"
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.

エラー祭りとなりました。

とりあえずGradleのバージョン関係というところにあたりをつけた以下の記事を参考にしてみました。

UnityのAndroidビルドでAPIレベル31にしたらGradle地獄だった話 #Android - Qiita
【Unity】Admob導入後Androidビルドエラーが発生した際の対処法 - ゲーム作るためのこと学ぶdevろぐ(’ー’)/チャラン

どうも上の記事によるとbaseProjectTemplate.gradleの

            classpath 'com.android.tools.build:gradle:3.6.0'

をUnityの2021.3からは4系に書き直す必要があるようです。

UnityのGradleとGradleプラグインの関係は以下の記事にありました。
Gradleプラグインの方のバージョンはclasspathに指定する方です。

Unity公式
Unity - Manual: Gradle for Android

Unity version Gradle version Android Gradle Plug-in version
2021.3 6.1.1 4.0.1

Android公式
Android Gradle プラグインのリリースノート  |  Android デベロッパー  |  Android Developers

大丈夫そうなので書き直していきます。
色々書き直すのが面倒なので、

  • baseProjectTemplate.gradle
  • launcherTemplate.gradle
  • mainTemplate.gradel

を一旦削除して、ProjectSettings > Player > Publishing Settingsでもう一度カスタムGradle系のチェックを入れ直します。そうすると再度2021用の書き方に再生成してくれます。
その後 AndroidResolver > Force Resolveします。

これでbaseProjectTemplate.gradleが

            classpath 'com.android.tools.build:gradle:4.0.1'

ちゃんと4系になってくれてました。
あとは古いのと差分を見て、必要だったらつけたしすればオッケーです。

これでビルドが通り、無事Androidで動きました。

感想

本当は2022.3にしたかったのですが、そちらはgradleの書き方も大きく変わっていて、同じやり方をしてもビルドは通るのですが、起動するとエラーが発生してしまって、一旦断念しました。
Googleの最新API対応の期日がもうないので、2021に対応して、Firebaseも新しくしたので、一旦これでOKとしておきます。

Unity: Firebaseでエラーが出た「Unable to find command line tool python required for Firebase Android resource generation. python is required to generate the Firebase Android resource file google-services.xml from Assets/FirebaseConfig/GoogleService-Info.plist. Wi

状況

Unable to find command line tool python required for Firebase Android resource generation.
python is required to generate the Firebase Android resource file google-services.xml from Assets/FirebaseConfig/GoogleService-Info.plist. Without Firebase Android resources, your app will fail to initialize.
python was distributed with each Firebase Unity SDK plugin, was it deleted?

のようなエラーが出てしまい、
/Assets/Plugins/Android/FirebaseApp.androidlib/res/values/google-services.xml
が生成できなくなってしまいました。

環境

  • Firebase 7.2.0
  • Mac Ventura 13.4.1
  • Unity 2020.3.0f
  • Unity 2021.31f

原因

[Unity]Unable to find command line tool python required for Firebase Android resource generation.

この記事によるとMacのOSを上げてしまったことでMacpythonが削除されて、python3がデフォルトになったため、Firebase側からpythonというコマンドを実行できなくなってしまうことが原因のようでした。

失敗策

上の記事ではFirebaseのライブラリを修正したものを上書きすると書いてあったのですが、package managerからインストールする形式にしているので、上書きというのはできなさそうです。(残念ながら断念)

なので、pythonをインストールしてみます。

元々pyenvでpythonの環境はあったのですが、動かなくなっていたので以下の記事を参考にしました。
zenn.dev
~/.zshrc に以下を追加してあげれば動くようになりました。

eval "$(pyenv init --path)"

~/.zshrcを反映

source ~/.zshrc

Unityに戻って動くか試してみると、generate_xml_from_google_services_json.pyは動いてないようです。
失敗ですw

解決策

kingmo.jp
Firebaseをアップデートしてみます。
どうやら9.0.0以上ならOKなようです。
11.3.0へアップデートしました。

Android buildすると以下のメッセージが出ました

java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.tools.javac.util.UnsharedNameTable$NameImpl)

qiita.com
この記事を参考にするとgradleのバージョンが古いので、Unityのバージョンをあげると、gradleのバージョンも上がるとのことだったので、Unity 2022.3.11にあげたらいけましたが、他のエラーがまた出てきたので、長くなりそうなので、また別記事にします。