TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

「Curl error 56: Receiving data failed with unitytls error code 1048578」 がUnityででる

Curl error 56: Receiving data failed with unitytls error code 1048578

がでるようになりました。

https://forum.unity.com/threads/crashes-unity-with-curl-error-56-receiving-data-failed-with-unitytls-error-code-1048578.795066/

このフォーラムに同様の現象がありました。

環境

2019.2.16f

影響

特にエラーが出ても何も影響はありません。(実害なし)

解決方法

原因は不明なのですが、最近Unityを2019.3.5fに上げてから一回も見てませんのでUnityのバージョンアップで解決しました。

もやっとしますが、これで良しとします。

(定期的にこのエラーの現象が出現しているような気がします・・・)

Unity: RectTransformの変更を検知するためにUniRxのOnRectTransformDimensionsChangeAsObservableを使えば便利だった

特定のuGUIのRectTransformのサイズが変わった時に連動して何かしたい場合に、どうすればベストなのか調べていたら、UniRxのOnRectTransformDimensionsChangeAsObservableを使えば良いことたどり着きました。

RectTransformの値変更を検知する

[Unity]uGUIでRectTransfromが確定したときに何かしたい…みたいな話|杏z学習帳
このサイトによるとUniRxを使えば検知できるとのことだったので、早速調べてみると以下のようにすればOKでした
後述しますが、以下の2点が注目点です。

  • AddToは不要(自動破棄のため)
  • ObservableEventTrigger(uGUI用)なのでObservableTriggers系のAddComponentは必要
using UniRx;
using UniRx.Triggers;

void Awake()
    {
        var trigger = gameObject.AddComponent<ObservableRectTransformTrigger>();
        trigger.OnRectTransformDimensionsChangeAsObservable().Subscribe(
            Handler
        );
        void Handler(Unit unit) {
            // 何かの処理
        }
    }

ObservableTriggers

neue cc - UniRx 4.8 - 軽量イベントフックとuGUI連携によるデータバインディング
ObservableTriggersに色々イベントを検知できるみたいです。以下抜粋です。

  • ObservableMonoBehaviour は非推奨 (旧式)
  • Triggerは対象GameObjectがDestroyされると、OnCompletedを流してイベント発火を終了する
  • UniRx.Triggersをusingしている場合は、XxxAsObservableメソッドを直接拡張メソッドから呼べる (自動でAddComponetしてくれるのでAddComponentしなくても良い)
  • ObservableEventTrigger(uGUI用)とObservableStateMachineTrigger(Animation用)だけは自動付与がないので、これらの場合だけ自分で意識的に付与する必要がある

感想

Updateで監視するのは嫌だったので見つけれてよかった!

Rust: gitのincludeIfで設定したgitconfigがCargo newで生成されるCargo.tomlに反映されない

現象

includeIfをしようしてgitconfigを切り替えている場合に、cargo new <プロジェクト名>をするとCargo.tomlのauthorsに切り替えたgitconfigの情報が入らずに、globalで設定しているgitconfig情報が入ってしまう。

例えばglobalのgitconfigの設定が
username: global_takoyaki

includeIfで設定したgitconfigの設定が
username: local_takoyaki

とした場合に、切り替わるはずのディレクトリでcargo new <プロジェクト名>をするとglobal_takoyakiが設定されてしまう。
local_takoyakiにしたい!

追跡

GitHub - rust-lang/cargo: The Rust package manager
ここからCargoのRepoがあるので追跡してみる。
src/cargo/ops配下にCargoのコマンドのファイルがあります。
src/cargo/ops/cargo_new.rs
にはcargo newとcargo initのコマンド記述があります。

これらのメソッドは共通して

fn mk(config: &Config, opts: &MkOptions<'_>) -> CargoResult<()>

を呼び出しており、ここでgit initやCargo.tomlの一連の処理を行なっているようです。

特にgit initの処理は

fn init_vcs(path: &Path, vcs: VersionControl, config: &Config) -> CargoResult<()>

を呼び出しており、そこからバージョン管理のツールごとに場合分けを行なっています。

Gitの処理はsrc/cargo/util/vcs.rsのGitRepo構造体で管理されており、実態はlibgit2 for Rustが使用されているようです。

gitのincludeIfの仕様

対象のフォルダへ行ってgit config user.nameを実行しただけでは、globalのgitconfigが参照される。
git initをして、gitリポジトリが生成されてからgit config user.nameを実行するとincludeIfのgitconfigが参照される。

gitのincludeIfで指定したgitconfigが反映されない理由

原因はgitが生成されるディレクトリからgitconfigを取得しようとしていないためです。
例えば、takoyakiフォルダでCargo new <プロジェクト名>とした時の現在のディレクトリはtakoyakiなので、gitはtakoyakiフォルダにgitがないのでグローバルの設定を取得しにいこうとします。

かなり雑にCargoのソースコード修正

impl GitRepo {
    pub fn init(path: &Path, _: &Path) -> CargoResult<GitRepo> {
        let _ = env::set_current_dir(path).is_ok(); // <=====ここ
        git2::Repository::init(path)?;
        Ok(GitRepo)
    }
   // 省略
}
 let _ = env::set_current_dir(path).is_ok();

git initの処理される前に、現在の作業ディレクトリをgitが生成されるディレクトリに変更すれば、includeIfで設定したgitconfigが反映されます。

※ かなり雑です。何も考慮してません。

代替案

mkdir sample
cd sample
cargo init .

でcargo initを使用する方法ならgitの生成されるディレクトと作業ディレクトリが一致するので、想定のgitconfigの情報が反映されます。

修正すべきか?

微妙な気がします。
一応cargoのヘルプをみると以下のように記載されていて、

USAGE:
    cargo new [OPTIONS] <path>

OPTIONS:
    -q, --quiet                  No output printed to stdout
        --registry <REGISTRY>    Registry to use
        --vcs <VCS>              Initialize a new repository for the given version control system (git, hg, pijul, or
                                 fossil) or do not initialize any version control at all (none), overriding a global
                                 configuration. [possible values: git, hg, pijul, fossil, none]
        --bin                    Use a binary (application) template [default]
        --lib                    Use a library template
        --edition <YEAR>         Edition to set for the crate generated [possible values: 2015, 2018]
        --name <NAME>            Set the resulting package name, defaults to the directory name
    -v, --verbose                Use verbose output (-vv very verbose/build.rs output)
        --color <WHEN>           Coloring: auto, always, never
        --frozen                 Require Cargo.lock and cache are up to date
        --locked                 Require Cargo.lock is up to date
        --offline                Run without accessing the network
    -Z <FLAG>...                 Unstable (nightly-only) flags to Cargo, see 'cargo -Z help' for details
    -h, --help                   Prints help information

ARGS:
    <path>

と書いてあるので、大丈夫と言えば、大丈夫なのですが、意識しないと、うっかりとglobalの方のgitconfigがtomlに反映されてしまうので、個人的には自動でincludeIfで設定したgitconfigを参照してほしい気がします。

Unity: Animatorのアニメーションをリセットしたい

AnimatorのアニメーションのSetTriggerで発火したものをリセットしたいことがあったのですが、ResetTriggerを呼べば解除できるみたいなのがあったので、試してみたのですが、どうもうまくいきませんでした。

やりたいことはidleに戻せればよかったので、idle(Default State)に戻す方法を探しました。

やり方

how to restart mecanim state animation or play it from random position [SOLVED] - Unity Answers

ここに書いてありました。
オプションなどもありましたが、簡単に戻すだけなら、

var animator = GetComponent<Animator>();
animator.Play("idle");

だけでいけました。

感想

簡単にできてよかった!

Unity: ボタンやトグルはフォーカスがある時にスペースキーやエンターキーでクリックイベントが発火してしまう

ボタンやトグルはフォーカスがあると、スペースキーやエンターキーでクリックイベントが発火してしまうので、意図しないクリックイベントが発火してしまい、少々面倒でした。

やり方

調べてみるとありました。
Button is being triggered by spacebar after clicked once - Unity Answers

NavigationをNoneにすれば良いみたいです。

解説

ナビゲーション操作 - Unity マニュアル

Navigation Options は UI 要素のナビゲーションがプレイモードでどのように管理されるかを参照します。

【uGUI】Buttonの使い方 - Qiita
例えばNavigationをNoneにするとフォーカスしなくなるので、
Selected Colorの色は使われることはありません。

感想

プロトタイプ作って、面白いか検証している時に、scene移動のボタンとかのクリックイベントが発火してしまい、煩わしかったのですが、これで解決しそうです!

Visual Studioで保存時にUnityスクリプトのコンパイルをさせる

Unity 2019.3になってからコンパイル時間が長くなったような気がするので、とても面倒でした。
今まで回ることのなかったレイボーまで回り始めました。

Enter Play Mode Optionsを設定して、スクリプトを一切編集していないときはめちゃくちゃ速くなったのですが、コンパイル時間の解決にはなっていませんでした。

そこで出来るだけ簡単にコンパイル時間の長さの体感だけ下げようと思い、保存したらスクリプトコンパイルをするようにVisual Studioに設定しました。

環境

  • Mac 2019 (Macにしか対応していません)
  • Unity Hub

やり方

【Unity】ソースコード編集->エディタプレイの手間を減らす(Mac) - Flat Leon Works
こちらの記事に書いてありました。

スクリプトコンパイルさせる方法は

AssetDatabase.Refresh();

を行えば良いみたいです。

これをVisual Studioへ入力していきます。
f:id:TAKOYAKING:20200305170741p:plain
※パスはUnity2019.3.3を利用しているので3.3となります。(変更必要)

タイトル: Refresh
コマンド: open
引数(A): /Applications/Unity/Hub/Editor/2019.3.3f1/Unity.app -g --args -executeMethod AssetDatabase.Refresh
現在のファイルを保存: On

解説

コマンドラインからUnityへコマンド実行させるコマンドは以下になります。
(保存後以下のコマンドを手動で実行しても同じことになります)

open /Applications/Unity/Hub/Editor/2019.3.3f1/Unity.app -g --args -executeMethod AssetDatabase.Refresh

openはアプリを開くコマンドで色々optionがあります。
-g: 背面にあるアプリを前面にしない
これをつけていないと保存のたびにUnityの画面に切り替わってしまいます。
--args: 引数 (-executeMethod AssetDatabase.Refresh)

Unityのコマンドラインのオプション
-executeMethod: メソッドを実行できる(ここにAssetDatabase.Refreshを指定)

懸念事項

Visual Studioの設定にすでにある?

設定にこれと同機能があるように見えるのですが、なぜか動作していません。もしかするとUnityHubを使っているせいかもしれません。UnityHubとUnity単体のパスは違うのでそのせいかもしれません。(想像です。)

Unityのアップグレードのたびにパスを変更する必要がある

今の所Unityまでのパスの取得方法は直接書いてしまっているので、もし2019.4とかになるといちいち書き直す必要があります。

Visual Studioで今開いているUnityのパスが取得できたら良いのですが、全く調べていないので、わかりません。

コンパイル速度を速くするなら別の手段の方が良い

この方法はコンパイル速度を改善したわけではないので、根本的解決にはなっていません。ただ手軽に体感を改善できるので僕は気に入っています。

感想

保存した直後にすぐに切り替えると、やっぱり待たされる感はありますが、一呼吸置いて、切り替えた時は、設定していなかった時と比べ、イライラ度はかなり下がりました!

手軽に試せるので、コスパは良いです!

Rust: 型推論で型(タイプヒント)の部分省略

イテレーターの特定メソッドについて調べていたら、型を部分省略する方法があったのでメモします。

イテレータ

Rust 公式チュートリアルより抜粋

もしあなたが覚えているなら、 ::<> 構文で型ヒント(type hint)を与え、整数型のベクタが欲しいと伝えることができます。かといって常に型をまるごとを書く必要はありません。 _ を用いることで部分的に推論してくれます。

let one_to_one_hundred = (1..101).collect::<Vec<i32>>();
let one_to_one_hundred = (1..101).collect::<Vec<_>>();

Rustでは型は一部分だけ記述する記法も用意されていて、

Vecと書かずに
Vec<_>と書いて
「i32(T)」の部分は「_」で省略できるみたいです。

一応左辺verも用意

let one_to_one_hundred: Vec<_> = (1..101).collect();

感想

忘れそうなのでメモ。