Unity: UI Toolkit 勉強中(ざっくり概要まとめ)
参考
【Unity】【UI Toolkit】UXMLファイルをテンプレートとして使い回す方法まとめ - LIGHT11
UI ToolKitを導入して効率よくUIを構築する – Unity for Pro
UI Builderができないこと (= GUIではできず、手動でuxmlに直書きしないといけないこと)
- AttributeOverrides : (予定はある)
- イベント (スクリプトからのみ)
などがあり、記述方法はある程度覚えないといけないみたいです。
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のこと)
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を読み込むことができます。
検索する
- 別記事
イベントを付ける
- 別記事
Unity: VSCodeのC#のformatterの設定
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を自作する
状況
iMacのSSDが512GBしかないのですが、ほぼ一杯になって作業ができなくなったので、容量を拡張しないといけなくなりました。
外付けSSDで拡張しようと思ったのですが、普通のUSB経由の外付けSSDは転送速度が最大1000MB/sくらいしか出ないらしく、あまり使いたくありませんでした。
Thunderbolt経由の外付けSSDなら最大3000弱MB/sくらい出るらしいですが、4,5万くらいするらしく、高いので、自作することにしました。
自作のThunderbolt経由の外付けSSDのメリット
特に好きな種類、容量でM.2のSSDを選べるのが良いです。例えば、安売りしている時とかに買うことも可能ですし、2TBくらいのものを選んだ時の値段のコスパはすごく良いです。
自作のThunderbolt経由の外付けSSDの デメリット
- 失敗する可能性がある。
- 色々情報を下調べする必要がある。
- 熱対策が必須。
M.2 SSDはRead, Writeともにとても速いですが、その分熱も出ます。なので、ヒートシンク、サーマルパッドなどで熱を放熱してあげないといけません。SSDにも色々種類があるので、熱が出やすいものもあるので、そこら辺の情報もしっかりと調べてないといけません。
成功の保証はどこにもありません。
部品購入
部品購入は以下のサイトをすごく参考にして、ほぼこの通りに購入して、作業しました。
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
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
方針
付属のヒートシンクとサーマルパッドは使用せず、別途購入したサーマルパッドで、入れ物に当たるように、サーマルパッドを重ねて、貼り付けました。
測定
自作した外付け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リンクはアフィリエイトやってないので、一切お金は入ってきません。
この時以下のことを注意しました。
- 安いのは買わない。
- 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ケーブルの悪いところ
- 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に移行していくことにしました。
エラー (.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
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
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で動きました。
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を上げてしまったことでMacのpythonが削除されて、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にあげたらいけましたが、他のエラーがまた出てきたので、長くなりそうなので、また別記事にします。