性懲りもなくUnityの闇と
戯れる
あると@twinkfrag
In 第二回 帰ってきたhojiroLT 2016/12/17
誰?
• あると@twinkfrag
• 普段11階の某研究室で表面上はニコニコしつつ顔本で准教授と
煽り合ってるように見えるがそれは仮の姿
本業は14階で研究をサボってtwitterをROMること
• 好きな言語はC#
• 元12FIのソフ研老害勢
過去のLT類
dendais; LT #1 発表するとは言っていない枠
dendai sie; LT #3 聞き専 (その上千住の授業により遅刻)
第1回
ソフ研おしゃべり会
「艦の「近代化改修」を 実施せよ!
(Windows8のススメ)」
dendai sie Talk Live! 2 「SchemeでGIMP動かしてみる」
Dendai FEN LT Mini 見てただけ
TDU FEN LT #2 「スクリーンショット撮ったはなし」
TDU FEN LT #3 「スケルトンってかっこいいよね」
TDU FEN LT #4 「Unityの光と闇」
元12(卒業したとは言っていない)
主催ばっかり
今日の話
Unity開発での長年の悩みのタネ
• Unityが使ってきたmono 2.10.xは古い
• C# 3.0, .NET Framework 3.5準拠
• Monoの最新版は4.xなので,既に直されたバグも含んでいる
• Visual Studio 2008相当のコードのためにC#5.0やC#6の機能が
使えない苦痛
一筋の光明
5.5.0f3 Release Notes
• Scripting: Upgraded C# compiler to Mono 4.4.
• やったぜ
しかし
• 使用できない
• 選択できない
• 参考: Unity5.4では認識すらできていないので一応進歩ではある
現実は非情
5.5.0f3 Release Notes
• Scripting: Upgraded C# compiler to Mono 4.4. The new
compiler still targets C# 4 and .NET 3.5, but provides better
performance and many bug fixes.
なぜそうなるか
• monoのバージョンを上げても対応できないのは理由がある
• 有名な問題点は
• Startなどをasyncにできる
• nullがnullじゃない
• だいたいUnityのAPIとスクリプト呼び出し構造が悪い
• 具体的にはUnityEngine名前空間が全て悪い
• Unity forumのC#6が動くテスト版を使って検証する
クラスを2つ用意して実験
public class Garbage : MonoBehaviour
{
public void LogDisposed()
{
Debug.Log($"This is {(this.gameObject == null ? "" : "not ")}null.");
}
}
public class Disposer : MonoBehaviour
{
public GameObject Garbage;
public void Push()
{
var g = this.Garbage.GetComponent<Garbage>();
g.LogDisposed();
DestroyImmediate(g);
Debug.Log("Destory");
if (g == null)
{
Debug.Log("g is null.");
}
else
{
Debug.Log("g is not null.");
}
Debug.Log("null conditional");
g?.LogDisposed();
}
}
nullチェック
してるのに
こんなことが起こる理由
• VSのオブジェクトブラウザーを見る
• 一番下はSystem.Object として,下から2番目は?
• ⇒UnityEngine.Object という諸悪の根源
• まず,名前からして邪悪
UnityEngine.Object (抜粋)
教訓
• Unityはその内部実装によって闇を増幅させる
• 「C#だけどC-Likeな書き方をできるようにしよう」
などとバカなことを考えてはいけない

性懲りもなくUnityの闇と戯れる