TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

Rust: getterとsetter

Rustでgetterとsetterを作りたかたったので調べました。


oop - Writing getter/setter properties in Rust - Stack Overflow
↑のサイトから拝借して、単純化してみると以下になりました。

#[derive(Default)]
struct Person {
    first_name: String,
}

impl Person {
    // Immutable access.
    fn first_name(&self) -> &String {
        &self.first_name
    }
    // Mutable access.
    fn first_name_mut(&mut self) -> &mut String {
        &mut self.first_name
    }
}

setterは関数内では値を代入せずに、&mutを返していて、受け取り元で値変更ができるようになっていました。
rustではこういうのはパターンの一つとしてあるようです。

疑問

setterで何かsetする前に値に応じて処理を行いたい場合はできないのではないでしょうか?

Rust:selfは糖衣構文

Rustのself引数まとめ - 簡潔なQ


selfは糖衣構文で&が付いていようがついてなかろうが、引数を使う時はself。
&selfで定義して、使う時は&をとったselfで使うことに少しもやっとしていたので、理解できてよかった
(&selfで定義するとselfが&selfとして利用できる糖衣構文)

struct ReactiveProperty<T> {
    value: T,
}

impl<T> ReactiveProperty<T> {
    fn value(&self) -> &T {
        &self.value // (self.valueの&)
    }

    fn value_mut(&mut self) -> &mut T {
        &mut self.value // (self.valueの&mut)
    }
}

Unityをアプデしたらエディタコンパイルが速くなっていた

環境

  • Unity 2019.3.15 -> 2019.4.4
  • iMac 2019

推測される原因 (予想です。)

Enter Play Modeが実装されてからソースコードを変更した時に行われるコンパイルが異常に遅くなっていました。昔なら3から5秒くらいだったのが、30秒以上かかることがざらになっていました。

推測ですがEnter Play Modeが実装されたせいで何か影響が出たのではないでしょうか?
Enter Play Modeで設定することで再生する速度はめちゃくちゃ速くなりましたが、エディタのコンパイル速度がとても遅くなったので、モヤモヤしていました。

2019.4.4に上げた

バージョンをあげると昔のようなコンパイル速度に戻っていました。

感想

いろいろ試しても全然元に戻らなく、開発効率が悪かったのですが、元に戻ってとても嬉しいです!
Enter Play Modeのおかげで再生のスピードも上がったし、コンパイル速度も元に戻ったので今のUnityのバージョンはとても嬉しいです。

デザイン:ナイトを描いた時の思考の備忘録

デザインスキルがないので、いつもデザインは気合と根性で描いています。

今回描いたのは「ナイト」です
f:id:TAKOYAKING:20200720144046p:plain
(自作ゲームで使います)

自分的にはぱっと見良さげな感じに見えるのでとても満足しています。

精神状態

デザインはとても疲れるので、やる気も出ず、進捗も出ないので、なかなか進みません。
ナイトを描こうとした時、色々描かないといけない部分が想像できるので、気分が凹みます。(「1時間程度では終わらないだろう」など)

うまくいかないので、ココナラなどでデザイン依頼をいっそのことしてしまおうかと、色々検索してしまいました。(心が半分折れる)

心が折れる原因

  • 時間がかかるのが容易に想像できる
  • 完成が想像できない
  • 序盤で詰まる

ナイトを描いた時の思考の備忘録

民族

全体的に中世の騎士というよりも少し民族風の色合いにしたかったので肌は赤褐色にしました。

おもちゃ

リアルよりもおもちゃのようなイラストにしたいので、ポンコツ感をだしました。

装備

頭だけ中世風の甲冑を装備させました。全体に装備させないのは工数カットと民族感を出すためです。

馬の色

全体的にかわいいイラストになるので、少し強くみせるために、青黒い色にして、強さを表現しました。
青黒い色と赤のコンビはとても引き締まった雰囲気が出ます。

キャラには影をつけていませんが、馬や装備には影をつけました。
なんか適当につけただけです。それっぽくなっていれば嬉しいです。

足の数

2Dなので本当に4本いるのかどうか、2本でも良いのでは? (一応4本にしました。)

感想

案外描いてみるとうまく行く時もあれば、うまくいかない時もあるので、気合と根性で進めれば、なんとかなりました!

続ければなんとかなる!(たぶん)

Unity: Addressable.LoadSceneAsyncとEnter Play Modeの時は一回しかCompletedが呼ばれない

環境

  • unity 2019.3.15
  • Addressables

現象

Enter Play Modeを設定していると、Addressable.LoadSceneAsyncを呼ぶと一回しかCompletedが呼ばれません。
どういうことかと言いますと
再生し、停止して再生すると呼ばれません。
Hierachyを見てもsceneがloadingと表示されたままになっており、完了しません。
statusもずっとNoneのままになります。
async awaitの構文を使っても変化は見られませんでした。

ただ、enter play modeをoffにしたり、ソースコードを変更するとちゃんと呼ばれます。(コンパイルされるため)
開発上この現象が起こると大変不便です。

回避

Addressable.LoadSceneAsyncを使わずに
SceneManager.LoadSceneAsyncを使って回避しました

感想

Enter Play Modeはまだ出たところなので、今後直るのではないでしょうか?

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とても便利!