naichi's lab

3日後の自分(他人)への書き置き

PlayFab Editor Extensionsにログインしているとエディタ実行時に「ArgumentException: The specified path is not of a legal form (empty).」というエラーが出る

よくわかんないエラーに遭遇したからメモ。

環境

  • Unity 2019.2.17f1
  • PlayFab UnityEditorExtensions version 2.79
    • GitHubから最新バージョンをインストールしたけどエディタ上の表示は2.67になってる...

症状

Unityエディタ上で実行するとこんなエラーが出て困った

ArgumentException: The specified path is not of a legal form (empty).

エラー全文

ArgumentException: The specified path is not of a legal form (empty).
System.IO.Path.InsecureGetFullPath (System.String path) (at <567df3e0919241ba98db88bec4c6696f>:0)
System.IO.Path.GetFullPathInternal (System.String path) (at <567df3e0919241ba98db88bec4c6696f>:0)
System.IO.FileInfo.Init (System.String fileName, System.Boolean checkHost) (at <567df3e0919241ba98db88bec4c6696f>:0)
System.IO.FileInfo..ctor (System.String fileName) (at <567df3e0919241ba98db88bec4c6696f>:0)
(wrapper remoting-invoke-with-check) System.IO.FileInfo..ctor(string)
Packages.Rider.Editor.ProjectGeneration.ShouldSyncOnReimportedAsset (System.String asset) (at Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs:211)
System.Linq.Enumerable.Any[TSource] (System.Collections.Generic.IEnumerable`1[T] source, System.Func`2[T,TResult] predicate) (at <351e49e2a5bf4fd6beabb458ce2255f3>:0)
Packages.Rider.Editor.ProjectGeneration.HasFilesBeenModified (System.Collections.Generic.IEnumerable`1[T] affectedFiles, System.Collections.Generic.IEnumerable`1[T] reimportedFiles) (at Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs:206)
Packages.Rider.Editor.ProjectGeneration.SyncIfNeeded (System.Collections.Generic.IEnumerable`1[T] affectedFiles, System.Collections.Generic.IEnumerable`1[T] reimportedFiles) (at Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/ProjectGeneration/ProjectGeneration.cs:195)
Packages.Rider.Editor.RiderScriptEditor.SyncIfNeeded (System.String[] addedFiles, System.String[] deletedFiles, System.String[] movedFiles, System.String[] movedFromFiles, System.String[] importedFiles) (at Library/PackageCache/com.unity.ide.rider@1.1.4/Rider/Editor/RiderScriptEditor.cs:229)
UnityEditor.CodeEditorProjectSync.PostprocessSyncProject (System.String[] importedAssets, System.String[] addedAssets, System.String[] deletedAssets, System.String[] movedAssets, System.String[] movedFromAssetPaths) (at /Users/builduser/buildslave/unity/build/Editor/Mono/CodeEditor/CodeEditorProjectSync.cs:35)
UnityEditor.AssetPostprocessingInternal.PostprocessAllAssets (System.String[] importedAssets, System.String[] addedAssets, System.String[] deletedAssets, System.String[] movedAssets, System.String[] movedFromPathAssets) (at /Users/builduser/buildslave/unity/build/Editor/Mono/AssetPostprocessor.cs:154)
UnityEditor.AssetDatabase:SaveAssets()
PlayFab.PfEditor.PlayFabEditorPrefsSO:Save() (at Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs:48)
PlayFab.PfEditor.<>c:<RefreshStudiosList>b__12_0(GetStudiosResult) (at Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs:205)
PlayFab.PfEditor.PlayFabEditorHttp:OnWwwSuccess(String, Action`1, Action`1, String) (at Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs:124)
PlayFab.PfEditor.<>c__DisplayClass2_0`2:<MakeApiCall>b__0(String) (at Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs:95)
PlayFab.PfEditor.<Post>d__7:MoveNext() (at Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs:179)
PlayFab.PfEditor.EditorCoroutine:Update() (at Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs:103)
UnityEditor.EditorApplication:Internal_CallUpdateFunctions() (at /Users/builduser/buildslave/unity/build/Editor/Mono/EditorApplication.cs:303)

スタックトレースの下の方みるとなんかPlayFabのEditorExtensionが悪さしてるっぽい。

// PlayFabEditorPrefsSO.cs
public static void Save()
{
    EditorUtility.SetDirty(_instance);
    AssetDatabase.SaveAssets(); //これが呼ばれてエラーしてる
}

やったこと

  • PlayFab UnityEditorExtensionsを更新
    • これ押すだけ
    • f:id:naichilab:20200129000019p:plain:w320
  • そうするとログイン情報が一度消える
    • f:id:naichilab:20200129000100p:plain:w320
  • この状態ならエディタ再生してもエラーしない。
  • 逆に一度ログインした状態( PlayFabEditorPrefsSO に値が入る)だとエラーする。
    • f:id:naichilab:20200129000354p:plain:w320

なーにこれ。

PlayFabEditorPrefsSOのSaveメソッド、7箇所から参照されてて実行時にどれが呼ばれてるのかもよく分からない。

あと空にしたままでも、実行してPlayFabログインとかは問題なくできるようだし、ログイン先の情報とかはどこに保存されているんだ・・・

追記

PlayFab Editor Extensionsの画面を開いているとこのエラー出るという情報を教えていただきました!

空にせずともウィンドウ閉じるだけで大丈夫なようです!!

#unity1week Meetup in Tokyo 2020 が開催されました!

概要

昨年に続き、 Unity1習慣ゲームジャム #unity1weekの展示交流会が開催されました。

イベントページ -> https://meetup.unity3d.jp/jp/events/1191

主催の青木ととさんいつもありがとうございます!!

昨年の様子

blog.naichilab.com

会場の様子

ブリーフィング会議

お手伝いの皆さん、ありがとうございました。

f:id:naichilab:20200119010838j:plain:w240

受付

unity1week全部遊ぶ実況でおなじみ、ぱふもどきさんが受付

f:id:naichilab:20200119011818j:plain:w240

名前入りシールを配布。分かりやすくて良かったです。

f:id:naichilab:20200119010912j:plain:w240

ととさんから分かりやすいイベント説明

f:id:naichilab:20200119011208j:plain:w240

おにぎり

今年もごはんとおともさんのケータリング。絶品でした。

f:id:naichilab:20200119011942j:plain:w240f:id:naichilab:20200119011926j:plain:w240f:id:naichilab:20200119011002j:plain:w240

座談会

はじめての取り組みとして座談会をやりました。

ととさんが司会、私とRyosukeさん、たアケイクさんが話しました。

はじまる前はめっちゃ緊張してましたが、はじまると楽しくてあっという間でした。

他の方の話とかも聞いてみたいのでまた機会があればやりたいですね。

展示会

前後半に分かれて展示。すごい盛り上がりでした。

tamtamさんのこちらの動画が雰囲気よく分かって最高です!

全部は回れませんでしたが私もいくつか遊びました〜。

集合写真

最後に集合写真をとってお開き。

写真は後日、Made with Unityのサイトに掲載されるそうです!

お礼

会場および費用のご支援をいただきました Unity Technologies Japan 様

全面的な準備と進行をしてくださった青木ととさん

お手伝い参加および一般参加いただいた約80名の皆さん

皆様のおかげで非常に楽しいイベントを無事終了することができました。

本当にありがとうございました。

次回のunity1week

会場でもお話しましたが、次回のunity1weekの日程を決めました!

ご都合合いましたらぜひご参加ください!

感想

前回より参加者が増えたのですが、ととさんの配慮により全体の流れはスムーズになっていました。さすがととさん。

普段お会いできない開発者の皆さんとお話しでき、とても楽しかったです。

モチベーションをもらって元気が出たので、皆さまに負けないよう私も開発がんばろうと思います。

f:id:naichilab:20200119012757j:plain

ありがとうございました!!

【Unity、Mac、Android】Failed to update Android SDK package list. (未解決)

環境

  • Mac OS X
  • Unity Hub 2.1.0
  • Unity 2019.2.1f1 (UnityHubでインストール)
  • ビルドターゲット:Android

症状

遭遇したエラー

久々に開いた過去プロジェクトをUnity2019.2.1f1に更新し、プラットフォームをAndroidに切り替えて、 Player Settings を開いたら以下のように何も表示されなかった。

f:id:naichilab:20190825033610p:plain:w320

コンソールを見るとなんか色々出てる。

f:id:naichilab:20190825033701p:plain:w320

なんかAndroid SDKの設定がうまくいってないっぽいですね。

エラー詳細

CommandInvokationFailure: Failed to update Android SDK package list.
/Users/naichi/Library/Android/sdk/tools/bin/sdkmanager --list

stderr[
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
    at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
    at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
    at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 5 more
]
stdout[

]
exit code: 1
// 以下スタックトレース

Unity Hubからインストールした Unity 2019.2.1f1を使ってます。

うまくAndroidSDKが設定できてないと思われます。

Android SDKの設定確認

Unity -> Preferences -> External Tools

f:id:naichilab:20190825034030p:plain:w320

なんか警告出てますね。

You are missing the recommended Android SDK Tools. Install the recommended version with Unity Hub.

推奨するバージョンのAndroidSDK入ってねーからUnityHubから入れろよーっと。

Unity Hub

どこから入れるんだ・・・って探したら見つけた。

Unity Hub起動 -> インストール -> 対象バージョンのメニュー -> モジュールを加える

f:id:naichilab:20190825034354p:plain:w320

Android Build Supportを 開き -> Android SDK & NDK Tools および OpenJDK にチェックを入れてインストール

f:id:naichilab:20190825034542p:plain:w320

ライセンス確認して同意したら実行

f:id:naichilab:20190825034637p:plain:w320

インストール待ち〜

確認

Unity -> Preferences

f:id:naichilab:20190825035356p:plain:w320

綺麗になりました。

Android Player Settings

f:id:naichilab:20190825035512p:plain:w320

ダメじゃん!!!

出てるエラーは一緒だけどパスは変わりましたねw

CommandInvokationFailure: Failed to update Android SDK package list.
/Applications/Unity/Hub/Editor/2019.2.1f1/PlaybackEngines/AndroidPlayer/SDK/tools/bin/sdkmanager --list

ググったの試す(これはダメだった)

エラーメッセージでググるとこの記事を見つけました。

qiita.com

書かれてる通り試してみたけど解決せず。

Android SDK Toolsのバージョン

Android Studio -> Configure -> SDK Manager

Android SDK LocationがUnityで入れたものと異なってる(Android Studio入れた時のまま)のでUnityのものと合わせる。(多少ダウンロードが走る)

f:id:naichilab:20190826012656p:plain:w320

Android SDK Tools 26.1.1なので最新っぽいですね。

SDK Tools release notes  |  Android Developers

古ければアップデートしようと思いましたが特に何もできず。

SDK Toolsダウングレード?

なんか似たようなことしたよなぁと過去記事検索したらありました。

blog.naichilab.com

2年前、Unity5.6のときにSDK Toolsを25.2.3にダウングレードして対応してます。

直りそうではあるけど2年も経って同じことするのもなんだかなぁ。

AndroidBuild、UnityCloudBuildで出来てるし一旦保留しよ・・・

Unity 2019 + Android SDK Tools 26.1.1でビルド出来てる方いらっしゃいましたら情報いただけますと嬉しいです。

【Unity】TextMeshProで太いアウトラインをつける(Padding)

環境

  • Unity 2019.1.5f1
  • TextMeshPro 2.0.1

やりたかったこと

TextMeshProを使っていて、アウトラインを太くしたら見切れてしまった。

f:id:naichilab:20190728014016p:plain:w320

これを綺麗に表示したいと思います。

TextMeshProでアウトラインをつける方法自体は説明を省きますが、こちらの記事が分かりやすいです。 【Unity】TextMeshProのアウトラインは、uGUIのと比べてとても良い - テラシュールブログ

結論

先に結論を書いておくと、FontAssetCreatorでアセットを作る際に、Padding の値を大きくしておくと綺麗にアウトラインが描けます。

例えば、Sampling Point Size = 64Padding = 16 だと下の図のようになります。

f:id:naichilab:20190728024526p:plain:w320

Sampling Point Size = 64(黄緑) に対して、Padding = 16(赤) がつくので、最大で黄色枠ぐらいのアウトラインがつけられます。

実際に描画してみるとこんな感じ。

f:id:naichilab:20190728025540p:plain

Padding のデフォルト値は5ですが、Sampling Point Size との比率によって見た目のアウトライン最大幅は変わってしまいます。(冒頭の画像はサイズ70に対してパディング5でした。)

大きな Sampling Point Size にする場合は Padding をいくつにするか事前に計算しておくと良さそうですね。

試す

せっかくなのでパディングを変えていくとどれくらいの見た目になるのか試してみたいと思います。

フォントアセットの生成

Sampling Point Size は64固定、Padding を0,2,4,8,16,32と変えて作ってみました。

パディングを大きくするほど生成に時間がかかり、64は終わる気配がなかったので中断しました。

P 作られたテクスチャ P 作られたテクスチャ
0 f:id:naichilab:20190728021233p:plain:w200 2 f:id:naichilab:20190728021244p:plain:w200
4 f:id:naichilab:20190728021256p:plain:w200 8 f:id:naichilab:20190728021309p:plain:w200
16 f:id:naichilab:20190728021322p:plain:w200 32 f:id:naichilab:20190728021335p:plain:w200

大きくするほどグラデーションがきめ細かくなっていることが確認できます。

アウトライン比較

作成したそれぞれのFont Materialについて、Face - DilateOutline - Thickness を同量ずつ変えてみます。

f:id:naichilab:20190728021848p:plain:w320

Outline = 0 0.2 0.4
f:id:naichilab:20190728023508p:plain:w200 f:id:naichilab:20190728023522p:plain:w200 f:id:naichilab:20190728023533p:plain:w200
Outline = 0.6 0.8 1.0
f:id:naichilab:20190728023542p:plain:w200 f:id:naichilab:20190728023550p:plain:w200 f:id:naichilab:20190728023557p:plain:w200

Outline = 0.4 を越えるとあまり変化ないように見えますね。最大サイズに向かって直線補間されてるわけではなさそう。

Padding 4か8、大きくても16ぐらいあれば良さそうですね。

4,8,16は Sampling Point Size に対する比率で言うと、 それぞれ 0.0625, 0.125, 0.25 です。

普通に使う分にはフォントサイズの5~10%程度。特に太いアウトラインを付けたい場合は20~30%のパディングを付けましょう。とごく当たり前な結論になりました。。。

リンク

【Unity】Cloud Buildにてエラー「File Library/Unused/xxxx couldn't be written.」

環境

  • 日付 2019/07/21
  • Unity Cloud Build
  • Unity 2019.1.5f1
  • プラットフォーム iOS / Android

症状

Unity Cloud Buildを使っているが、突然こんなエラーが出るようになった。

1053: [Unity] ERROR: File Library/Unused/775a7e455630141398aca2b3e53bc2bd couldn't be written. Because moving /BUILD_PATH/naichilab.metsa-vimaru2.android_development/Temp/UnityTempFile-fc0fb1c56e8e946cd929542144258939 to /BUILD_PATH/Library/Preferences/Unity/Editor-5.x/Layouts/LastLayout.dwlt failed.
1054: [Unity] ERROR: File Library/Unused/775a7e455630141398aca2b3e53bc2bd couldn't be written. Because moving /BUILD_PATH/naichilab.metsa-vimaru2.android_development/Temp/UnityTempFile-a18bb0cfc811b41938aa9ababbdaaa1d to /BUILD_PATH/Library/Preferences/Unity/Editor-5.x/Layouts/LastLayout.dwlt failed.

Android / iOS ともに同じメッセージ。

CLEAN BUILDとか試してみるも改善せず。

ローカルでのビルドは成功するし謎すぎる。

ググってみても解決に至りそうな情報は見つからなかった。

CloudBuildのFull Logをみても何が原因でこのエラーが出てるのか全く分からず。

対処

Cloud Build側の設定でどうにかなるかと思ったが埒があかないので、エラーが最初に出たコミットを確認した。

調べたところ、Odin というアセットの Sample - RPG Editor というサンプルを入れてからエラーが発生していた。(似たようなエディタウィンドウを作りたかったので参考に入れた)

assetstore.unity.com

  1. OdinのDemoファイルをgit管理から除外し、
    • git rm -r --cached Assets/Plugins/Sirenix/Demos/
  2. 今後git管理されないように .gitignore に追記
    • Assets/Plugins/Sirenix/Demos/*

原因不明の対処療法ではあるが、これで無事ビルド成功した。

【Unity】TextMeshProで特定文字の位置がずれる

環境

  • Unity 2019.1.5f1
  • TextMeshPro 2.0.1

症状

TextMeshProでUIを作っていたところ、特定の文字がズレて見えました。

下記画像の が下がって見える

f:id:naichilab:20190718012635p:plain:w320

ざっと調べてなぜズレるのか分かったのでまとめておきます。

再現手順

日本語フォントを用意

  • 使ったのは mojimo gameさんの UD丸ゴ_スモール-B
  • UnityのAssetsフォルダに入れておきます。
  • 事前にIllustratorで確認したのが下記画像です。
    • f:id:naichilab:20190718011953p:plain:w320
  • とても綺麗なフォントですね。

TextMeshProのフォントアセットを作る

  • Window -> TMPro -> Font Asset Creator
  • 設定はこんな感じ
    • f:id:naichilab:20190718010952p:plain:w320
    • Sampling Point Sizeは32にしました。
      • 2048*2048に日本語全部入れようとするとこのサイズが限界のため
    • (実際は漢字含む大量の文字を含みます)
  • Generate Font Asset して Save

TextMeshProTextを配置

  • HierarchyにてCreate -> UI -> Text
  • 作成したフォントアセットを選び、テキストに もちもの と記入
    • f:id:naichilab:20190718011411p:plain:w320
  • が下がってますよね。
    • f:id:naichilab:20190718011632p:plain:w320

原因

GlyphTableのBYによるズレ

  • このズレは作成した FontAssetGlyph Table にある、 BY の値が関係していました。
    • f:id:naichilab:20190718023034p:plain:w320
  • 適当に変えてみると文字が移動することが確認できます。
    • f:id:naichilab:20190718023749g:plain:w320

Sampling Point SizeBY の関係

  • Font Asset CreatorSampling Point Size を変えながらいくつか作ってみました。
    • Sampling Point Size Glyphサイズ BY
      32 27 * 29 26
      64 53 * 57 52
      128 105 * 112 103

BY自体には小数を入れて微調整できるものの、Font Asset Creatorで作られた直後のアセットでは必ず整数値が入ってしまうようです。

この小数から整数への丸め誤差がズレの原因と思われます。

対策

A. Sampling Point Sizeを大きくする

Font Asset作成時のフォントサイズを大きくすれば、小数から整数に変換される誤差は相対的に小さくなるので、ズレは目立たなくなります。

f:id:naichilab:20190718030026p:plain:w320

使用する文字種が少なければ、大きいサイズで作成しておけば良さそうです。

B. Font Fallbackを活用する

【Unity】TextMeshProにFont FallbackとDynamic SDF Systemが追加、日本語が使いやすくなった。 - テラシュールブログ

TextMeshPro 1.4から Font FallbackDynamic SDF という仕組みが使えるようになりました。

複数のFontAssetを組み合わせることができるので、

  1. UIなど、綺麗に表示したい限られた文字は大きめフォントサイズで作成しておく
  2. 漢字を含む日本語フォントなど、文字数が多いものはフォントサイズ小さめで作成しておく(ズレを許容する)

前者に存在しない場合のみ後者を使うようにすれば、UI上での文字ズレは目立たなくできそうです。

後者のフォントは Dynamic SDF System で生成してもよいかもしれません。

C. FontAssetCreatorに手を加える

最近のTextMeshProはPackageManager経由で導入されるので、ソースコードが同梱されてます。

FontAsset作成処理に手を加えればBYの値を整数ではなく小数値で作成できるのではと思います。(私は断念しました)

D. TextMeshProの更新を待つ

標準でズレなく表示できるようになるのを待つ。

(フォーラム検索しても同様の問題みつけられませんでした・・・誰も困ってない??)

おわり

ググっても全くと言っていいほど出てこなかったのですが、この症状は誰も困ってないんでしょうか?

なんらか情報お持ちでしたら教えていただけると嬉しいです。

【Unity】(未解決)Spriteの形状に合ったCollider2Dをランタイムで動的生成したい

環境

  • Unity 2018.3.0f2

やりたいこと

f:id:naichilab:20190114235525p:plain:w320

  • 動的に SpriteRenderersprite を差し替えている
  • 差し替えた sprite の形に合わせて Collider2D を作りたい
  • エディタでは AddComponent<PolygonCollider2D>() するとざっくりとした形でコライダ生成してくれる

iOSのランタイムだとエラー発生

Sprite outline generation failed - could not read texture pixel data. Did you forget to make the texture readable?

  • AddComponent<PolygonCollider2D>() したタイミングで上記エラー発生(XCodeでログ確認)
  • そうなると赤枠範囲でのコライダが作られちゃうようで、青枠タップしても低木を選択できなかった。
    • f:id:naichilab:20190115002640p:plain:w320

対応

  • エラーメッセージに書かれてる通り、Spriteの Read/Write Enabled を有効にする。
    • f:id:naichilab:20190115002943p:plain:w320
  • 今回はSpritePackerを使っていたので、Sprite個別ではなくPacker側を変えるだけでよかった。
    • f:id:naichilab:20190115001808p:plain:w320

解決!のように見えてなんかおかしい

  • 赤丸部分は反応するけど木の幹あたりが触れない
    • f:id:naichilab:20190115003237p:plain:w320

Colliderを可視化

kan-kikuchi.hatenablog.com

こちらを参考に見えるようにしてみた。kanさんいつもありがとうございます。

  • エディタ
    • f:id:naichilab:20190115010951p:plain:w320
  • iOS
    • f:id:naichilab:20190115011005p:plain:w320

やっぱりおかしい。低木にいたってはPolygonCollider2Dのデフォルト形状だ...

どうしよう

事前にコライダ形状もマスタデータとして用意しておくしかないのかな・・・

そもそもサボって動的に作ろうとしてるのが不味いかもしれない。 端末ごとで形状違うとかになったら目も当てられない。