TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Unity: 「Unknown Assembly DOTween」というエラーが起きる

環境

  • Unity 2019.3.15
  • Addressables 1.8.3
  • DOTween 1.2.335

推測

AddressablesとDOTweenを使用するとこの現象が起きる気がします。(予想です。)

現象

Unknown Assembly DOTween
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

Unityを再生時に上記エラーが必ず出ます。ただ何も影響が無いように思われます。

解決策

2019.4.4にバージョンを上げたら勝手に直りました。
(Addressablesも勝手に1.8.4になりました)

感想

別に何も影響はなかったのですが、気になるので、直ってよかった!

UniRxのCombineLatestでReactivePropertyを合成する

ことの経緯

1つのReactivePropertyと変更対象のUIが1対1になっている時は問題ありませんが、2つのReactivePropertyが異なる条件で1つのUIを変更しようとしているときに困ったことになりました。

例えば
ゲージが貯まれば背景のグレー解除
マナが貯まれば背景のグレー解除

だとゲージとマナで2つの軸ができてしまいます。
仮にゲージが溜まっているのにマナが溜まっていない状態だと、ゲージの背景のグレー解除が行われてしまい挙動が不正となってしまいます。

CombineLatestで合成する

UniRxのReactivePropertyについて - Nobollel開発者ブログ

public static IObservable<TResult> CombineLatest<TLeft, TRight, TResult>(this IObservable<TLeft> left, IObservable<TRight> right, Func<TLeft, TRight, TResult> selector)
{
    return new CombineLatestObservable<TLeft, TRight, TResult>(left, right, selector);
}
var isMaxGaugeReactiveProperty = new ReactiveProperty<bool>();
var isMaxManaReactiveProperty = new ReactiveProperty<bool>();

IObservable<bool> IsMaxGaugeAndMaxManaReactiveProperty = Observable.CombineLatest(
    isMaxGaugeReactiveProperty, // ReactiveProperty<bool>
    isMaxManaReactiveProperty, // ReactiveProperty<bool>
    (isMaxGauge, isMaxMana) => isMaxGauge && isMaxMana // (bool, bool) => bool
); // IObservable<bool>

返り値の型はIObservable < TResult>となります。

2つのReactivePropertyを渡してあげることで、第3引数にReactivePropertyのT型を引数に持つメソッドを渡すことができます。
そして、2つのPropertyの値を判断したReactivePropertyが出来上がります。

上の例だと
ゲージが貯まりかつマナが貯まる状況を作り出せます。

感想

UniRxとても便利!

SourceTreeで特定のファイルだけStashする

stashは全部の追跡ファイルをstashしてしまうので割と一部分のファイルだけスタッシュしたい時があります。

それをSourceTreeでやってみたいと思います。
一発で行う方法ではないので数回の作業となります。
(やや邪道です)

流れ

  1. stashしたく無いファイルを仮コミット。
  2. スタッシュする
  3. 一つ前のコミットまで戻す。

  • main.rs
  • lib.rs

の2つのファイルがあって、main.rsはスタッシュしたくない場合です。

1. main.rsをコミットする (コミットメッセージは「たこ焼き」にしています。(なんでも良いです、真似しないでください。))

f:id:TAKOYAKING:20200711184224p:plain

2. スタッシュする (未追跡ファイルもスタッシュしたいならステージングにあげる)

f:id:TAKOYAKING:20200711184340p:plain

3. main.rsを戻すために1つ前のコミットまで戻す

履歴から一つ前のコミットで右クリック (例ではmain.rsは「たこ焼き」でコミットしたので、「たこ焼き」の一つ前を選択します)
f:id:TAKOYAKING:20200711184738p:plain

「このコミットまで戻す」を押す
f:id:TAKOYAKING:20200711184552p:plain

SoftかMixedを選んでOKで戻す(HARDはダメですよ!)
f:id:TAKOYAKING:20200711185131p:plain

  • softは変更状態を残しながらステージングに戻す (上段)
  • mixedは変更状態を残しながらインデックスに戻す(下段) (初期値)

コマンドで行う方法

コマンドで行う方法もついでに置いておきます。

git stash push
git stash push <ファイル名> -m <コメント>

これが一番便利

source treeの操作を愚直に表現

git stash pushがあるのでこちらの方法は意味を無しません。

git add ファイル名(stashしたく無いファイル)
git commit -m "たこ焼き"
git stash
git reset ~HEAD
git stash -p

こちらは差分を選択していく方法で、指定のものをstashするのにぴったりですが、ファイル丸ごとstashするという時はちょっと気持ち的に面倒に感じることがあります。(コマンドは短いですが、その後の選択していく作業が割と面倒です。)

git stash -p

感想

GUI操作も覚えておくと、右手一本だけで作業ができるので便利です。
気が向けばカスタムアクションを作ると思います。


関係ないですが、Source Treeには不満はありませんが、やっぱりRevertとResetの日本語の説明が見分け付きづらいので日本語の横にReverやResetの文字を入れて欲しいです。

UnityでAndroidビルドすると「This could be caused by a class being stripped from the build even though it is needed. Try disabling 'Strip Engine Code' in Player Settings.」

現象

05-17 19:19:48.076  4675  4713 E Unity   : This could be caused by a class being stripped from the build even though it is needed. Try disabling 'Strip Engine Code' in Player Settings.

原因

Addressables(Asset Bundle)を使っていると、手動で含めないといけないクラスがあるため。

対処法

必要なクラスをビルド対象に含めてあげる必要がありますが、だいたい以下の4つがあります。

  • link.xmlに書く(デメリットあり)
  • Resourceにダミーとして配置する
  • Sceneにダミーとして配置する
  • Player Settingの「Strip Engine Code」をoffにする (手軽)

4つ目のStrip Engine Codeをoffにするのが一番お手軽ですが、デメリットが無いか以下で検証してみました。

アプリサイズ (Android)

「Strip Engine Code」 OFF

アプリサイズ(「Strip Engine Code」 OFF 正しく動く)
42.41MB
ユーザーデータ
5.21MB
キャッシュ
94.21KB
合計
47.62MB

「Strip Engine Code」 ON

アプリサイズ (「Strip Engine Code」ON (animationはまだ動かない))
28.05MB
ユーザーデータ
4.97MB
キャッシュ
94.21KB
合計
33.02MB

アプリサイズ (「Strip Engine Code」ON (animatorControllerはResoucesに含めることで正しく動かせる)
28.12MB
ユーザーデータ
4.97MB
キャッシュ
94.21KB
合計
33.09MB

検証結果

Strip Engine Codeを手っ取り早くoffにして済まそうと思いましたが、約10MB異なっているので、無視できない数値となっているので、エラーが起こるたびに頑張るしかなさそうです。

link.xmlに書く方法のデメリット

link.xmlにビルドに含めたいものを記述すればビルド時に含めてくれるようですが、記述しても含めてくれないものもあるようです(とても残念)
【Unity】Unity 5.3からAssetBundleはどう変わるのか…まとめ - テラシュールブログ

ここに書いてある通り、エディタクラスはlink.xmlに定義しても意味が無いようです。
Animations.AnimatorController - Unity スクリプトリファレンス
公式Docで調べてAnimatorControllerはclass in UnityEditor.Animationと書いてあるので無理なようです。

animationControllerはlink.xmlに書いても動かないのでResourcesフォルダにいれたり、シーンに含めることで対応する必要がありそうです。

感想

resourcesフォルダに簡易prefabを作って入れておくのが今のところ手っ取り早いかなという気がします。
link.xmlの方を使いたかったのですが、書いても意味ないクラスとかあるのは辛いです。
Strip Engine CodeをOffにするのも良いですが、容量が結構違うので、僕はOffにしない方向で行きたいと思っています。

zsh print -z

ターミナル(コマンドライン)のバッファを編集する方法です。(zshのみ)
ちょっと日本語の意味がわかりづらいですが、以下のような画面に表示されている文字を編集したり、カーソルの位置を変えたりすることです。
f:id:TAKOYAKING:20200711173025p:plain

環境

やり方その1 (ショートカット登録必須)

ウィジェットに登録し、ショットカットを作る
Macがzshになるなら、ZLEを習得するっきゃない! | Developers.IO

zshの機能で以下のような機能があるのでこれらを使って、コマンドライン の表示を操作します。

  • BUFFER
  • CURSOR

このやり方は

2つの作業があり、ショートカットを必ず登録しないといけないのが欠点です。
登録しないと以下のようなエラーが出ます。

widgets can only be called when ZLE is active

やり方その2 (ショートカット必要無し)

zleを使わないでコマンドラインに値を入力した状態にする - Qiita

print -z

を使う
こちらはショートカットの登録をしなくても良いので便利です。
(カーソルはデフォルトで最後尾になる)

感想

fzfやpecoを使っていると出力の表示を操作したいことがちょくちょくあるのでこれを使っています。
おすすめは2番目の方法です。

Affinity Designer: 波線

波線を書きたいことがあってAffinity Designerでどうやって書けば良いのか調べていたら以下のサイトが参考になりました。
AffinityDesignerでの波線の描き方 | coneta.me

やり方

1. ペンツールでギザギザを書く
f:id:TAKOYAKING:20200711171242p:plain

2. コーナーツールで角をつける
f:id:TAKOYAKING:20200711171550p:plain
このツールを選択して、
コーナーを作りたいパスを選択して、コーナーを作ります。
f:id:TAKOYAKING:20200711171619p:plain

ウェーブを使ってみた

コーナーツールを使って砂のウェーブを作りました!(自分のゲーム内で使うもの)
f:id:TAKOYAKING:20200711171919p:plain

メモ

緩やかなウェーブにしたい時はギザギザの角度を緩やかにすれば緩やかウェーブになります。

感想

ウェーブ!

PixelPerUnitとCameraのSizeから背景の高さ計算する

高さいっぱいになるような背景画像を用意したい状況に遭遇したので、何pixel用意すれば良いかの考え方を調べました。

考え方

考える時は2つの要素が必要です。

  • カメラのsize
  • 背景画像のpixelPerUnit
例えば
  • 背景画像のpixelPerUnitが100
  • カメラのsizeが5

とした時に必要となる背景画像の高さは1000pixelとなります。

理由

カメラのsizeが5の時は高さが10Unitになります。(size * 2)
背景のpixelPerUnitが100(初期値)に設定してある時は画面全体の高さのpixel数は
100pixel * 10unit = 1000pixel
になります。

なので高さが1000pixelの画像を用意してあげるとぴったりと高さが一致します。

感想

わかってしまえば簡単ですが、sizeやpixelPerUnitに触れる機会がないと、どこから計算すればいいかわからないので、もしかしたら計算に苦労するかもしれません