TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Affinity Designer ブレンドモードスクリーン

ブレンドモードでよく使う「スクリーン」について調べてみました。

以下のサイトが

  • 加算
  • 乗算
  • スクリーン

について分かりやすくまとまっていました。
加算とスクリーンを正しく使い分けて綺麗な光を描くヒント - コンポジゴク

スクリーンとは

スクリーンは乗算の逆で
乗算はA*Bなのに対し1 - ( (1-A) × (1-B) )で反転しています。

なので効果は加算と似たようなものになりますが、加算は足し上げていくので、やがては白になりますが、スクリーンは掛け算なので白に近づいていくだけになります。

つまり「いい感じの加算」ということでしょうか?

Affinity Designer

f:id:TAKOYAKING:20200704165316p:plain
レイヤーの不透明度の横にコンボボックスがあるのでこれで設定できます。

スクリーンを使ったサンプル

スクリーンとぼかしを使ったよくある真ん中だけ白っぽく色あせたものの作り方です。
完成
f:id:TAKOYAKING:20200704165834p:plain

サンプルの作り方

1. 土台を用意します。
f:id:TAKOYAKING:20200704165936p:plain

2. ぼかし用のオブジェクトを用意します。(色は黒に近づくと土台の色になっていきます。)
f:id:TAKOYAKING:20200704170040p:plain

3. ぼかしを入れます。
f:id:TAKOYAKING:20200704170213p:plain

4. ブレンドモードをスクリーンにします。
f:id:TAKOYAKING:20200704170305p:plain

感想

スクリーンとぼかしは結構使う便利技です。

Affinity Designer オブジェクトの均等な整列

オブジェクトを均等に整列したい時のやり方です。

やり方

水平に均等に配置します。
整列させたいオブジェクトを選択します。
f:id:TAKOYAKING:20200704162542p:plain

次に上のちょっと右あたりに整列するためのボタンがあるのでここを押します。
f:id:TAKOYAKING:20200704162940p:plain

水平に揃えるために「垂直方向に揃える」から「上下中央揃え」を選択します。
水平方向に揃える」から「水平方向に等間隔に配置」を押して、あとは好きな等間隔に調整します。


出来上がりです。
f:id:TAKOYAKING:20200704163309p:plain

affinity designer スライスの時にスライスサイズを手動で指定する

目的

スライスが自動で期待のものにならなかった時に、手動でスライスのサイズを指定する方法です。

方法

1. 書き出しペルソナ
2. いつものようにスライスを作成する
3. スライスタブからスライスのサイズを指定したいものを選択して、右下の変換ウィンドウから好きな数値をいれて、書き出し
f:id:TAKOYAKING:20200704162023p:plain

Unity: Rotationを指定する

角度指定をとりあえず雑に指定する方法のメモです。

Unity InspectorのRotationでx, y, zを指定して角度を入力する方法です。(Quaternionから逃げたい!)

float angle = 90;
transform.eulerAngles = new Vector3(0, 0, angle);
// or
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));

感想

プロトタイプを作っているときに角度を指定したい場面に出会すといっつも忘れてしまうのでメモです!

角度指定は「ユーラー」と覚えておけば今度こそ覚えているはず!

utf8jsonのUtf8Json.UniversalCodeGeneratorをDockerでビルドしてMacで動かす

背景

GitHub - neuecc/Utf8Json: Definitely Fastest and Zero Allocation JSON Serializer for C#(NET, .NET Core, Unity, Xamarin).

utf8jsonを使おうとしたところAndroidでは事前に自動生成したファイルが必要になるらしいです。その自動生成するバイナリ(Utf8Json.UniversalCodeGenerator)も提供されているのですが、Macでは動かないらしく、ソースコードから自分でビルドしてあげる必要があるみたいです。

Utf8Json を macOS で動作させるまでの記録 - もんりぃ is undefined.

Docker

上記の問題を解決するためにdockerにしてしまいました。
macにdocker hubがインストールされていれば、動くと思います。

github.com

内容は以下の2点です。

  • ソースコードからビルドしてUtf8Json.UniversalCodeGeneratorを作る
  • Utf8Json.UniversalCodeGeneratorを実行する

感想

utf8jsonは速いらしい!

Unity: Script Execution Orderを変更すると不明なエラーがでる

script Execution orderを変更したら以下のような大量のエラーが出ました。
特に悪いことはしていないので、とりあえず回避できる方法を載せておきます。

MissingReferenceException: The object of type 'MonoScript' has been destroyed but you are still trying to access it.
GUI Error: You are pushing more GUIClips than you are popping. Make sure they are balanced.
ArgumentException: GUILayout: Mismatched LayoutGroup.repaint
Scope was not disposed! You should use the 'using' keyword or manually call Dispose.

環境

  • Unity 2019.3.9f1
  • Mac
  • Enter Play Modeを使用

原因

Enter Play Modeを使っていて、Script Execution Orderを変更して、再生すると発生します。

解決策

f:id:TAKOYAKING:20200524185451p:plain
設定するときにこの画面を表示していますが、設定完了した後に、Script Execution Orderの画面を違う画面に表示させるとエラーは起きなくなります。例えば一つ上のQualityを表示させてみるとエラーが消えるはずです。

感想

Script Execution Order画面だけではなく、他の画面でも昔はたまに画面を表示させているだけでエラーが起こる現象が起こっていたような気がします。(例えば分析画面とか・・・)

なので悪いことしていないのにエラーが大量に出た場合は画面を切り替えてみると良いかもしれません。

Rust: temporary value is freed at the end of this stat

現象

struct Note {
    name:String,
}
let name = note.name.trim();
println!("{}", name);

こういうコードを書いたら以下のようなエラーがでた。

Rust: temporary value is freed at the end of this stat

原因

rust - Temporary value is freed at the end of this statement - Stack Overflow
こちらに書いてありました。
原因は&strはStringの参照であり、&strはStringが生きている限り参照可能なのに、Stringが死んでしまったため、エラーが起こりました。

note.nameはStringですが、それをtrimすると&strになります。note.nameはどこにも変数束縛されていないので、trim後の値である&strは参照先がわからずエラーとなります。

  • note.nameはString
  • trimの値は&strでnote.nameの参照
  • note.nameはどこにも束縛されていないので一時的な値で消える
  • trimの値はnote.nameの参照なのに、note.nameがない -> エラー

解決方法

一旦変数にする
let tmp_name = note.name;
let name = note.name.trim();
所有権を持つ
let name = note.name.trim().to_string();
or
let name = note.name.trim().to_owned();
など

(デメリットは調査中・・・)

どちらが良いのでしょうか・・・?
パフォーマンス差はないのでしょうか?

要約

&str使うときは大元のStringが死んではならない!