TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Enter Play Mode Optionsを設定した時にDoTweenがうまく動作しない時

先日、2019.3の機能のEnter Play Mode Optionsを設定しました。
Unity 2019.3 Enter Play Mode Optionsを設定すると爆速になった (条件あり) - TAKOYAKING’s blog
めちゃくちゃ速くなったのですが、使っていると、DoTweenが描画されないことに気づきました。

animationが2回目の時はなぜか描画されないことに気がつきました。
Enter Play Mode Optionsの設定をOffにすると正しく描画されるので、原因はEnter Play Mode Optionsを設定したことであることは明らかでした。

直し方

DoTweenをv1.2.335へアップデートする

注意点

アップデートする時に問題が発生したのですが、DoTweenが特定のバージョンよりも古いバージョンから更新する場合は更新手順にきっちり従う必要があるみたいです。

あとPreferencesの設定がリセットされているみたいですので、設定し直す必要があるかもしれません。

やり方

DOTween - Support
ここより抜粋(翻訳)

  • 新しいバージョンを古いバージョンと同じフォルダに上書きする (たくさんエラーが出るけど心配しないで!)
  • Unityを再起動
  • DOTween's Utility Panel を開いて「Setup DOTween...」を押して設定する

ここまでが公式の手順なのですが、これを行ってもうまくいきませんでした。
うまくいった方法は、上記に加えて

  • 「Create ASMDEF」を押して作るでした。

もしかしたらリセットされているかもしれないので

  • Preferencesの設定(任意)

「Create ASMDEF」

f:id:TAKOYAKING:20200301004315p:plain
作業は簡単で、このボタンを押して、OKをポンポンと押していくだけです。
これを行わないと、以下のようなDebugger何とかかんとかエラーが出続けることになります。

Assets/Demigiant/DOTween/Modules/DOTweenModuleUnityVersion.cs(90,30): error CS0117: 'Debugger' does not contain a definition for 'logPriority'

結果

これでEnter Play Mode Optionsを設定してもバッチリDoTweenしてくれました!

Unity 2019.3 Enter Play Mode Optionsを設定すると爆速になった (条件あり)

blogs.unity3d.com

こちらの記事でEnter Play Mode Optionsを設定すると速くなると書いてあったので試してみました!

環境

  • 2019 iMac
  • Unity 2019.3.2

機能

2019.3から Enter Play Mode Optionsが設定できるようになり、

  • スクリプトの状態のリセット(Domain Reload)
  • シーンの再ロード(Scene Reload)

の2つが設定できるようになりました。

それぞれの詳細機能はドキュメントに書いてありました。 (英語しかなかった・・・)
Unity - Manual: Configurable Enter Play Mode

注意事項

Domain Reloadの設定はstatic変数がリセットされないので気をつけないといけないみたいです。
回避方法はここに載ってました (英語しかなかった・・・)
Unity - Manual: Domain Reloading

Scene Reloadの設定はプロファイルとかビルドとかで計測する場合には当然ですが、正確な時間が計測できないとのことでした。
Unity - Manual: Scene Reloading


あと両者に共通することですが、まだ実験段階の機能なので、どのように変更が将来加えられるかわかりません。

設定方法

Edit > Project Settingから
Editor > Enter Play Mode Settings
f:id:TAKOYAKING:20200224141726p:plain

一番速くておすすめ設定

f:id:TAKOYAKING:20200224141726p:plain
Scene Reload設定のみチェック入れた状態がとても速くておすすめです。
シーンのリロードにチェックをいれないと、シーンのリロードが行われないので、途中から始まるので結構不便です。(個人の感想)
Domain Reloadは行わず、シーンのリロードは行う設定が、とても速くて、使い勝手がよかったです。(今までの操作感と同じ)

ただドキュメントにある通り、速くなる条件はscriptを編集していない時です。
scriptを編集してしまうと、コンパイルが実行されるので、そのコンパイル時間は省略できません。

速くなる状況は例えば

  • UnityEditorでGUIを編集して、確認する (scriptを編集していないため)
  • 停止したあともう一回再生する (scriptを編集していないため)

のような状況が考えられます。

注意点

Domain Reloadのチェックをoffにしているとスクリプトの状態のリセットが行われないので、static変数を初期化する処理を自分でつけないといけないです。

そして、ライブラリについても、アップデートして、対応しているversionに更新しないといけないです。
Enter Play Mode Optionsを設定した時にDoTweenがうまく動作しない時 - TAKOYAKING’s blog

感想

もう速すぎでびっくりしました。最大で 50% ~ 90%短縮と書いてありましたが、体感は99%短縮と言っても過言ではないくらいでした。
とりあえず速すぎたので、再生ボタンを連打しまくるということも、この設定をOnにしていれば楽勝です。
よく再生ボタンを2回連続で押してしまって、微妙にイラっとくることもこれで無くなりそうです。

Unity 2019.3に上げてから少し遅くなり、困っていましたが、これでかなり解決しそうです。

Unityがめちゃくちゃ遅くなるとき

Unityがめちゃくちゃ重くなる時があったのでその解決方法を残しておきます。

環境

  • iMac 2019
  • Unity 2019.2.16f

現象

  • Unity Editorの再生ボタンを押すと始まるまで異様に時間がかかる。(1分以上)
  • ユニットの生成がものすごく時間かかることがあった

解決方法

iMacを再起動する
困った時はPCを再起動・・・

感想

原因がUnityにあるのかiMacにあるのかわかりませんが、再起動するとあれだけ遅かったのが、嘘みたいに速くなりました!
もしかして、PCのメモリがおかしい・・・!?

Unity 2019.3にあげると再生のたびにImport Assetsが実行される現象

Unity 2019.3にあげたのはよかったのですが、再生するたびに、Import Assetsが実行され、毎回鬱陶しいので調査しました!

環境

  • Unity 2019.3.1
  • iMac 2019

現象

再生ボタンを押すたびにImport Assetsが実行される。
タイトルはAsset Progressと表示されていた。
f:id:TAKOYAKING:20200215203403p:plain

注意事項

作業前にgit推奨

調査

調べてみるとこちらのUnity Forumに似たような現象が上がっていたので、こちらを参考にしました
https://forum.unity.com/threads/unity-constantly-importing-iteration-problem.732788/

もう一回手動でpackageをimportし直す

とうまくいくみたいです。

再生の時に対象のパスが一瞬だけ表示されるので、ここで原因となっているpackageがあるので、これを瞬時にとらえます。(結構素早いので、スクショとってみた方が良いかもです。)
f:id:TAKOYAKING:20200215203403p:plain

自分の場合はAnima2D packageが原因となっているようでした。
特に原因となっているのはsprite.pngでした。(一つの画像にキャラクターのパーツを全部まとめて入れる画像)

なのでAnima2dのexampleのUnitychanとTrexのフォルダを削除しました。(exampleなので使っていない)
すると起動時にImport Assetsダイアログが出なくなりました。

追記
と思ったけど、ダイアログは出続ける模様です。ただ一瞬になりました。(モヤっとする!)

まとめ

  • 対象のPackageを特定し、削除
  • もう一回そのpackageをimportし直す

感想

sprite.pngが直接の原因みたいなので、(<-自分の場合)なんかmetaがおかしくなっている気がします。
Anima2dではない、自分が作成したspritesheetもImport Assetsされていましたが、Anima2Dを削除すると何もしなくても解決されました!
勝手な想像ですが、UnityはAnima2Dの代わりに2D SpriteShapeを新たに機能として追加したので、それ関連でおかしくなったのかもしれません・・・よくわかりません

起動の時に毎回表示されているのがとても面倒だったので直ってよかった

Rustのライフタイムはスコープとは同じものではない

ライフタイムとは

ライフタイム | Rust by Example

コンパイラ(借用チェッカーと呼ばれる場合もあります)が、全ての借用に問題がないことを確認するために使用する仕組み

ざっくりライフタイムの使い所

  • 借用するときに使える (&とほぼペア)

ライフタイムの例

ライフタイムで参照を有効化する - The Rust Programming Language
ここによると以下の例の時、スコープ終了した後なのに参照しようとしているのでエラーとなる

{
    let r;

    {
        let x = 5;
        r = &x;
    }

    println!("r: {}", r); // error
}

ライフタイム VS スコープ

ライフタイム | Rust by Example

ライフタイムとスコープは同時に語られることが多いですが、同じものではありません。

今までは同じようなものかと思っていたし、スコープ外だから参照持ってたらいけないのは当たり前なのではと思っていのですが、ライフタイムを明示することで、生存期間を伸ばすことが可能みたいです。
上のコードにライフタイムを明示してあげると、xのライフタイムが伸び、rが参照できるようになりました。

fn takoyaki<'a>() {
    let r: &'a i32;
    { 
        let x: &'a i32 = &5;
        r = x; 
    } 
    // println!("x: {}", x); // error: cannot find value `x` in this scope
    println!("r: {}", r); // ok! ライフタイム伸びた!
}

xは外側からは参照できないので、「ライフタイム ≠ スコープ」という図式になりました。

余談

let r: 'a i32;
ができると思って書いてたらエラーが出て、かなりの時間困っていました!
ライフタイムは借用とセットなので&がいることに気づかなかった・・・

SourceTreeのコミット欄にプロフィール画像を表示する (Gravatar)

f:id:TAKOYAKING:20200213204439p:plain
こんな感じでSource Treeにプロフィールアイコンを表示させたかったので
git - How to set up your avatar in SourceTree.app? - Stack Overflow
ここを参考にして表示させました。

環境

iMac2019

やり方

  1. Gravatar - Globally Recognized Avatars ここでプロフィール画像を設定
  2. Source Treeを一旦閉じる
  3. ~/Library/Application Support/SourceTree/ImageCacheの中にあるファイルを削除(rm RepoAvatarURLCache)

感想

今回BitbucketからGithubに移行したときに、新しいメールアドレスが必要だったので、ついでに設定してみました。

Unityを2019.31f1にアップデートするとエラーが出た (ArgumentException: Requested value 'X86' was not found)

Unityを2019.31f1にアップデートすると以下のようなエラーが出ました

ArgumentException: Requested value 'X86' was not found.
ArgumentException: Requested value 'X86' was not found.
System.Enum+EnumResult.SetFailure (System.Enum+ParseFailureKind failure, System.String failureMessageID, System.Object failureMessageFormatArgument) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.TryParseEnum (System.Type enumType, System.String value, System.Boolean ignoreCase, System.Enum+EnumResult& parseResult) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.Parse (System.Type enumType, System.String value, System.Boolean ignoreCase) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Enum.Parse (System.Type enumType, System.String value) (at <437ba245d8404784b9fbab9b439ac908>:0)
GooglePlayServices.AndroidAbis.EnumValueStringToULong (System.Type enumType, System.String enumValueString) (at <0ea28fee5338451fbecc93319b91e068>:0)
GooglePlayServices.AndroidAbis.get_Current () (at <0ea28fee5338451fbecc93319b91e068>:0)
GooglePlayServices.PlayServicesResolver.PollAndroidAbis () (at <0ea28fee5338451fbecc93319b91e068>:0)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Delegate.DynamicInvokeImpl (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.MulticastDelegate.DynamicInvokeImpl (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Delegate.DynamicInvoke (System.Object[] args) (at <437ba245d8404784b9fbab9b439ac908>:0)
UnityEditor.EditorApplication.Internal_CallUpdateFunctions () (at /Users/builduser/buildslave/unity/build/Editor/Mono/EditorApplication.cs:310)

環境

  • iMac 2019
  • Unity 2019.2.16f -> Unity 2019.31f1

解決方法

android - ArgumentException: Requested value 'X86' was not found - Stack Overflow
ここに書いてありました。
google play serviceが古いようなので最新にする必要があるみたいです。

  1. PlayServicesResolverを丸ごと削除
  2. Releases · googlesamples/unity-jar-resolver · GitHub ここから最新のをダウンロード (Download hereと書いているのでそこのリンクに行きます。)
  3. Importする

これでいけるかなと思ったのですが、timeline がなんとかかんとかのエラーが出ました。
Window > Package Mangerを開くとtimelineの所に赤いビックリマークが付いていたので
timelineをupdateしました
エラーは消え去りました。

感想

2019.3は結構UIのデザインが変わって、慣れるまで時間がかかりそう・・・