Edited at

UnityでC#を使う時に引っかかることリスト

More than 3 years have passed since last update.

何回か転んでるのでリスト化しておこうと思う。


命名部門


  • クラス名とファイル名が一致してないと死ぬ。


  • たぶん一般的なC#のプログラム(.NETクラスやMSDN的な書き方)だとPublicはUpperCamelCaseだけど、

    UnityではUnityScriptに合わせてかLowerCamelCaseになっている。

    共通のC#ライブラリ書くなら、UpperCamelCaseで書くべきだけど、Unity限定ならLowerCamelCaseの方が統一性があるかも。



プログラマー初心者部門


  • float/doubleの数値で等値演算しちゃう

  • nullチェックを忘れる

  • 0で割り算しちゃう


GameObject部門

もちろん抜け道はあるよ


  • Vector2/Vector3/Vector4にいれた小数点第4位未満の小さな値がmagnitudeとかで0に丸められる

  • positionで設定できる値に値域があるなんて知らなかったよ

  • Matrixでtransformを指定できない。

  • TransformについてTranslate, Rotate, Scaleがかかる順番についてはRotate=>Translate=>Scaleの順で掛かる

  • GameObjectを位置指定せずに生成すると原点に生成される。そのGameObjectを別のGameObjectの子にすると、親GameObjectのTransformの逆行列的なものが、子GameObjectに入力される(親を変える時に子Objectの世界座標は維持される)。

  • 上記について親を変更する時にLocalPosition,LocalRotate,LocalScaleをリセットするようなメソッドがほしいな。


Editor部門


  • EditorでScreen.widthとかを呼ぶとEditorWindowのサイズが帰ってくる。

  • Editorで何か値を変えた時にその変更をキャッチしたければOnValidateを使う。例えば下記のようなケース


public class HogeBehaviour : MonoBehaviour
{
[SerializeField]
protected int _hogeProperty; // 実際にInspectorで操作される値.
public int HogeProperty
{
get
{
return _hogeProperty;
}
set
{
updateHogeProperty(value); // Inspectorで直に変えた時はここは呼ばれない.
}
}

protected void updateHogeProperty(int value)
{
_hogeProperty = value;
// 以下HogePropertyに関する何かの処理.
}

void OnValidate() // Inspectorで値が変更された時に呼ばれる.
{
updateHogeProperty(_hogeProperty);
}
}


Coroutine部門

Coroutineは同一スレッド内で処理される。

具体的には次のフレームのすべてのGameObjectのUpdateが終わった後に呼ぶことを予約しているだけ。


  • Coroutineを別スレッドだと勘違いして再入意識せずに書いちゃう


初期化関連部門


  • MonoBehaviourのコンストラクタ、デストラクタは使用しない。デストラクタなら大丈夫だろうと思うと赤い例外メッセージがコンソールで暴れることになる。

  • 初期化に静的コンストラクタを呼ぶと死ぬ。エディタでは死ななくてもビルド後のiOSとかAndroidとかで死ぬ。

いろいろ略

public class HogeBehaviour : MonoBehaviour
{
public int aValue = StaticClass.StaticValue; // Boo!!
}

---

public static class StaticClass
{
static public int StaticValue;

static StaticClass()
{
StaticClass.StaticValue = 1;
}
}


  • Taskとか使おうとするとなくて死ぬ。


文字コード部門

Macとかでは問題なくてもWindowsで死ぬ。Windows向けHack。

基本的に海外製のソフトは2バイトコードの扱いで死ぬことが多い

(日本語FEP起動でクラッシュするアプリとかそうだよね)。

アルファベット圏の人は基本的に2バイトコードに無頓着と思っていい。


  • 2バイト文字を使う時、Unity(MonoDeveloper?)は2バイト文字をうまく扱えないので末尾に"."を必ずつける。

    (正確には行末がASCIIで終わっていれば安全なのだと思います。)


  • 文字コードはUTF-8BOM付きかUTF-16BEにする。


ここまで

他に思い出したら追記するかもしれないし、飽きて寝るかもしれない。というか寝かせてくださいウヒィ。

あと他にも罠があったりとかこれ違うぜとか回避方法とかあったらコメントとか、批判記事をお願いします(:D)TL