2013-02-21 [C#] UnityEngine.Objectのbool型への変換演算子について

Unityの組み込みクラスであるUnityEngine.Objectには、bool型への暗黙の型変換が定義されています。
Object.operator bool
static implicit function bool (exists : Object) : boolean
Description
Does the object exist?// check if there is a rigidbody attached to this transform if (rigidbody) Debug.Log("Rigidbody attached to this transform");is the same as
// another way to check if a rigidbody is attached to this transform if (rigidbody != null) Debug.Log("Rigidbody attached to this transform");
オブジェクトのインスタンスがnullの場合はfalseを返し、nullでない場合はtrueを返す実装となっているようです。
なので、UnityEngine.Objectを継承したクラス(Unityの組み込みクラスのほぼ全部)は、if文などの判定式部分に、インスタンス変数を直接指定することができます。C/C++とかと同じように書けるってことですね。
こんな感じ。
Object o = new Object(); if (o) { //oがnullでない場合の処理 }
一応説明しておくと、暗黙の型変換とは、ある型Aが必要とされている箇所に、互換性の無い型を(キャスト無しで)指定した場合に呼ばれる変換処理です。キャストを指定して変換した場合は、明示的な型変換となります。
以下は、自作したMyComparableというクラスに、UnityEngine.Objectと同等の処理を行う、bool型への暗黙の型変換を定義した例です。
using System; class Test { public static void Main() { MyComparable obj = null; //obj = new MyComparable(); if (obj) Console.WriteLine("not null"); else Console.WriteLine("null"); } } class MyComparable { public static implicit operator bool(MyComparable obj) { return obj == null ? false : true; } }
ここまで紹介しておいて何ですが、暗黙の型変換のこういった使い方は、あまり好ましくないと思います。
そもそも暗黙の型変換自体、明示的なキャストが不要であるため、ユーザーの思いもよらぬ所で発動してしまう可能性があり、何も考えずに定義するのは危険です。
C#(とその源流であるJava)は、他言語のような条件式の簡易な書き方(bool型以外の変数をifの条件式として直接指定するような)をあえて捨て、型の厳密性にこだわることで、ミスが発生しにくくなることを狙った設計になっています。
今回のように、boolを返す暗黙の型変換を定義した場合、タイピングは少しだけ楽になりますが、暗黙の型変換を定義した型だけが言語設計に逆らうような挙動をしてしまうため、使う側からするとかなり意表を突かれます。
UnityEngine.Objectの例でいうと、暗黙の型変換の定義がどうなっているのかをドキュメントにあたって調べる必要がありますし、それくらいなら最初から "if (obj == null) 〜"と明示的にnullとの比較が行われていた方が、何も考えずに使う(読む)ことができて手間がかかりません。
C#で変換演算子をどのように定義するのか?という点について、MSがガイドラインを作ってくれているので、こちらを参考にすると良いかと思います。
クラス ライブラリ開発のデザイン ガイドライン:変換演算子
2012-11-27 新しいPC購入、そしてMacBook Pro 15インチ(mid 2012)のDVD換装

- CPU: Core i7-3770K
- Mother: ASUS P8Z77-V Pro
- MEMORY: 16GB (SanMax SMD-16G28NP-16K-D-BK DDR3-1600 16GB(8GB*2枚組)SET CL11 1.5Volt ELPIDA)
- CPU Cooler: Enermax ETS-T40-TB
ツクモで買ったので、ツクモたんのクリアファイルが付いてます。
さて、一通り組み上げた後で問題に気付いた。
このマザーにはIDEコネクタが無い...
これまで使っていたDVDドライブはIDE接続なので、そのままではWindows7のインストールメディアを使ってのインストールができない。
一応、玄人志向のIDEをSATAに変換するコネクタ(SERIALATA-DAT)は持っているので、これを使ってIDEのDVDドライブをSATAドライブとして接続、Windows7のインストールを試みたが、インストール途中でフリーズしてしまう。
どうするか
MacBook Proの内蔵DVDドライブを取り外し、USB接続の外付けDVDドライブにしてしまえば、それを使ってWindows7もインストールできるだろう、と考えた。
これにはMacBayを使う。
MacBayは、MacBook Proの内蔵DVDが入っているスペースに、2.5インチドライブ(HDDとかSSD)を装着するためのマウンタと、取り外したDVDドライブをUSB接続の外付けDVDドライブとして使うためのケースがセットになったもの。
MacBookを分解するために必要なドライバも付いている。
MacBookには普通の十時ネジとは違う、トルクスネジが使われている箇所があるので、分解するにはトルクスドライバが必要。
なのでこれがセットになっているのはすごく助かります。
ウチのMacBook Pro 15インチ(mid 2012)は、既にHDDの容量が一杯なので、内蔵DVDを取り外してSSDでも増設しようかと考えていた。
今回は、SSDの増設は行わず、内蔵DVDを外付けDVDドライブにする作業だけを行う。
早速買ってきた

これがMacBay。僕は秋葉館まで直接買いに行った。
MacBook Proの分解方法は、商品紹介ページからリンクが貼られているPDFに詳細が書かれている。
念のためURLを載せときます。
開腹したMacBook Pro15インチ。美しい...
左上に見えるのが、今回取り外すDVDドライブ。
MacBookのネジ、馬鹿みたいに小さなものがあるので、分解する時に紛失してしまわないように注意。
内蔵DVDドライブが外付けDVDドライブに

完全に組み上げる前に、Macに繋いで動作確認してみた。
CDのリッピングは問題なく動作する。ただ、キーボード上のイジェクトボタンが効かなくなっている。
イジェクトボタンは、あくまでMacBookが内蔵ドライブとして認識しているドライブのイジェクトを行うためのものなので、外付けDVDドライブとして接続されているドライブには効果がないのでしょう。
なので、メディアを取り出す場合は、FinderやiTunesから明示的に取り出し操作を行うことになります。
取り回し
USBバスパワーで動作するので、PCとの接続はUSBケーブル一本でよい。
(MacBayにはDVDドライブを動作させるためのACアダプタも付いているんだけど、今回は不要だった。)
外付けにしてしまうと、Mac標準のDVDプレイヤーでDVDが見れなくなるらしいのだが、それは未確認。
まあ僕はMacBookでDVDを見ることはほぼ無いので、よしとしましょう。
気になった点
外付けDVDドライブのケースはプラスチック製なんだけれど、これが少し歪んでいるせいか、ケースとドライブの機械部分が接触して、メディアが回転する時にカタカタと異音が発生する時がある。
個体差もあるんだろうけど、これはちょっと気になった。
強度的にも少々ヤワさを感じるので、気になる人はもう少し強度のある外付けケースを使ったほうがいいかも。
外付けDVDドライブを使ったWindows7のインストール
改めて、外付けDVDドライブをPCに接続し、Windows7のインストールメディアを入れ、インストール開始。
今度は止まることなく、正常にインストールが完了した!
*実は、この前に外付けDVDドライブをUSB3.0コネクタに挿入してしまい、Windows7のインストール中に「CD/DVDのドライバが見つからない」と言われ、インストールに失敗していた。USB2.0のコネクタにドライブを刺すことで、正常にインストールが完了した。接続するコネクタには気をつけよう。)
最後に
2012-08-23
Windowsでプロセスのトレース
WindowsでUnityのアプリを生成した場合、exeファイル(アプリ名.exe)と
データフォルダ(アプリ名_Data)が作られる。
exeはWin32のネイティブバイナリであり、.netのバイナリではない。
exeの実行にはデータフォルダが必須。というか、exeは単なるkickerで、
ゲーム本体や、MonoとUnityのライブリ(dll)はデータフォルダに入っている。
ここで、exeがデータフォルダ内の要素にどのようにアクセスしているのかを
知りたかったので、プロセスのシステムコール呼び出しと、dllの読み込みを
調べるためのツール(要はプロセスのトレース用ツール)を調べてみた。
Process Monitor
StraceNT - A System Call Tracer for Windows
API Monitor

