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の削除

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

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にあげたらいけましたが、他のエラーがまた出てきたので、長くなりそうなので、また別記事にします。

Unity: 2022.3.11fにアップデートしたら「'AndroidSdkVersions.AndroidApiLevel21' is obsolete: 'Minimum supported Android API level is 22」というエラーが出た。

状況

Unity: 2022.3.11fにアップデートすると以下のようなエラーが出て実行できなくなりました。

Library/PackageCache/com.google.android.appbundle@1.4.0/Editor/Scripts/Internal/AssetPacks/AssetDeliveryWindow.cs(139,56): error CS0619: 'AndroidSdkVersions.AndroidApiLevel21' is obsolete: 'Minimum supported Android API level is 22 (Android 5.1 Lollipop). Please use AndroidApiLevel22 or higher'

Library/PackageCache/com.google.android.appbundle@1.4.0/Editor/Scripts/Internal/BuildTools/BundletoolHelper.cs(133,46): error CS0619: 'AndroidSdkVersions.AndroidApiLevel21' is obsolete: 'Minimum supported Android API level is 22 (Android 5.1 Lollipop). Please use AndroidApiLevel22 or higher'

Failed to find entry-points:
Mono.Cecil.AssemblyResolutionException: Failed to resolve assembly: 'Assembly-CSharp-Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Exception: Failed to resolve assembly 'Assembly-CSharp-Editor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in directories:


Library/PackageCache関係のエラーと出ているのでPackageCacheを削除すれば解決するかと思いましたが、うまくいきませんでした。

環境

  • Unity 2020.3.0
  • Unity 2022.3.11
  • パッケージはPackage Managerからインストール

原因

com.google.play.review-1.4.0をUnity 2020.3で使っていたのですが、Unityを2022.3.11にあげると依存関係でエラーが出るようでした

Unity 2020.3にやっぱり一旦戻したい時

1. 動作前のUnityのversionに一旦戻す。
2. Library/PackageCacheとTempフォルダを削除してReimport Allを削除した。

解決策

com.google.play.reviewのパッケージにはcom.google.android.appbundleという依存パッケージたちがあるので、それらを最新にしてあげればOKです。
https://developers.google.com/unity/archive?hl=ja#play_in-app_review
このページに行ってアプリ内レビューの最新のパッケージをとってきて、依存関係のパッケージもとってきて、Package ManagerのPackages/manifest.jsonに記述すればOKです。記述順は大切なので、リンクの依存関係の順番に並べれば多分OK!