TAKOYAKING’s blog 一覧

TAKOYAKING’s blog

たこ焼き系

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が死んではならない!

Rust: チルダを展開したい(ホームディレクトリ を取得したい)

パスにチルダ「~」を含んでいると展開してくれないのでcrateを利用してみました。

やりたいこと

チルダを展開する

サンプル

GitHub - netvl/shellexpand: A library for shell-like expansions of variables in strings

format!("{}", shellexpand::tilde("~"))

出力(ユーザー名がtakoyaki, OSがMacの場合)

/Users/takoyaki

戻り値がCowなのでformatを利用するのが良いみたいです。

備考

チルダを利用せずにホームディレクトを取得したいだけならhome_dirを使うのもありです。
ただし、

std::env::home_dir()

は非推奨で以下の非推奨メッセージがでます。

use of deprecated item 'std::env::home_dir': This function's behavior is unexpected and probably not what you want. Consider using the home_dir function from https://crates.io/crates/dirs instead.

代わりにクレートのdirを使ってくれとメッセージがでます。

dirのクレート
https://crates.io/crates/dirs

dirs::home_dir();

Rust: サブモジュール内でmacroをimportしたい

サブモジュール内でマクロをインポートしようとすると以下のエラ〜メッセージが出ました。

extern crate` loading macros must be at the crate root

解決方法

How do you import macros in submodules in Rust? - Stack Overflow
これにある通り、

#[macro_use]
extern crate takoyaki;

この記述を

  • lib.rs

に記述すればOKでした!

Rust: コンソールにダブルクォーツを表示させない「""」

consoleにダブルクォーツが表示されたり、表示されなかったりすることがあったので、気になったので、表示させない方法を調べました。

やりたいこと

コンソールにダブルクオーツを表示させない
f:id:TAKOYAKING:20200507114035p:plain
写真のようにlsが"ls"として表示されています。

解決方法

[Very Newb] Printing strings without quotes? : rust
こちらによると
{:?}
ダブルクォーツで囲まれる

{}
ダブルクォーツで囲まれない

ということでした。
{:?}はデバッグ用なのでダブルクオーツで囲まれてしまうという理由らしいです。

VSCodeで行頭へ戻る (Mac)

VSCodeで行頭へ戻ろうとしたときに他のエディタのようにCtrl + aを押して戻ろうとしたのですが、スペースを無視してくれず、行の先頭に戻ってしまいます。文字が書き始めの行の先頭に戻って欲しいです。

一応cmd + ← で意図したことはできるのですが、他のエディタのようにCtrl + aでも同じ挙動になるように設定してみました。

環境

やり方

キーバーンディングの設定を開いて (Cmd + Shift + p -> Keyboard Shortcuts)

Ctl + a
cursorLineStart
から
cursorHome
に設定してあげれば意図した挙動になります。

元々設定されているキーバインディングも残したかったので以下のやり方を参考にしてみました。
Visual Studio Code - multiple keyboard shortcuts? - Stack Overflow
完成形は以下です。
これをkeybiding.jsonに貼り付けます。

{
    "key": "ctrl+a",
    "command": "-cursorLineStart",
    "when": "textInputFocus"
},
{
    "key": "ctrl+a",
    "command": "cursorHome"
}

感想

Macキーバインドに慣れてしまっているので、これで悩み解決ですっきりしました!

unityのMonobehaviourの名前を変更する手順が以前と異なっている!?

unityのMonobehaviourの名前を変更する手順が以前と異なっているような気がします。

環境

Unity2019.3.9

手順

昔は

  1. UnityEditorからMonobehaviourの名前を変える
  2. テキストエディタで名前を変える

の手順だったのが、

  1. テキストエディタで名前を変える
  2. UnityEditorからMonobehaviourの名前を変える

になり逆になってました。

昔の手順で行ってしまうと、prefabのscriptがMissing状態になります。

感想

自分の記憶違いでしょうか?
Unityでスクリプトのクラス名を変更する手順 - Qiita
この記事によると記憶違いではなさそうです。
これが一時的な挙動なのかわからないので少し様子見です。