MonoBehaviourのAwake、Start、Updateという関数が呼ばれる仕組み

MonoBehaviourを継承してAwake、Start、Update等という関数を作るとUnity側で勝手に呼んでくれますが、これがいったいどういう仕組で動いているのかが謎でした。

最初、MonoBehaviour側にvirtualな関数、もしくはabstractな関数で定義されているのかとも思ったのですが、overrideしなくても書けますし、定義を書かなくてもコンパイルエラーにもなりません。

C#にはReflectionという機能があり、これを使うと実行時にクラス名やメンバ名などが取得できます。これを使っているのではという説もあったのですが、どうもそうではないようです。

答えは、ここにありました。

blogs.unity3d.com

一部引用すると、

任意の型のMonoBehaviourが初めてその基底のスクリプトにアクセスしたときに、スクリプティングランタイム(MonoもしくはIL2CPP)によって何かのマジックメソッドが定義されているかを調査され、この情報がキャッシュされます。もしMonoBehaviourが特定のメソッドを持っていたら所定のリストに追加されます。例えばスクリプトがUpdateメソッドを持っていたら「毎フレームUpdateを呼ぶべきスクリプトのリスト」に追加されるわけです。


ゲーム中は、Unityは短にこのリストをイテレーションしてメソッドを呼んでいきます – シンプルです。また、これがUpdateメソッドのアクセス権がpublicであろうとprivateであろうと関係ない理由でもあります。

ということです。言い方は悪いですが、Unityのコンパイラが言語規約に無いことを勝手にゴニョゴニョやっているということみたいです。

これは無駄な仮想関数呼び出しを避けるためのようです。

例えば、もしMonoBehaviour の中身が

public abstract class MonoBehaviour {
    protected virtual void Update() {}
}

というものであった場合、Updateをoverrideしていないクラスに対しても空のUpdateを呼び出すことになってしまい、結構な処理時間を食います。

これを避けるための仕組みなわけですね。ゲーム作っている人としては非常にありがたい仕組みです。

しかし、Unityが.Net Foundationに参加したことで、この辺りももしかしたら変わってくるかもしれませんね。

Unity+iOSでitunes connectにアップロードする際にERROR ITMS-90086が出た時の対処

先日、itunes connectにアプリをアップロードしようとしたら以下の様なエラーが出ました。

ERROR ITMS-90086: "Missing 64-bit support. iOS apps submitted to the App Store must include 64-bit support and be built with the iOS 8 SDK or later. We recommend using the default "Standard Architectures" build setting for "Architectures" in Xcode, to build a single binary with both 32-bit and 64-bit support."

64bitもサポートせなあかんよと言われているようです。

Unityの方で、

Player Settings -> Other Settings -> Scripting Backend を IL2CPP に、
Player Settings -> Other Settings -> Architecture を Universal に変更することで対処できました。

f:id:wkpn:20160810084127p:plain

Make 10 by using 4 numbers

Make 10 by using 4 numbers

  • Ken Watanabe
  • ゲーム
  • 無料
play.google.com

ゲームビューでの見え方を確認しつつシーンビューでパラメータ調整する方法3つ

1, シーンビューとゲームビューを並列に並べて作業する

f:id:wkpn:20160807150333p:plain
一番シンプルな方法。編集画面が狭くなりがちなのが難点です。

2, シーンビューの見え方をゲームビューと同じにする

  1. Cameraを選択する
  2. 「GameObject」->「Align View to Selected」を選択する

f:id:wkpn:20160807150500p:plain

こちらはシーンビュー自体がプレビュー代わりになるので、好きな位置にビューを動かして編集する、ということができないのが難点です。

3, Camera Previewを出しっぱなしにする

f:id:wkpn:20160807151005p:plain
直接的にCamera Previewを出しっぱなしにするような方法はないようなのですが、

1. HierarchyからCameraを選択する
f:id:wkpn:20160807150601p:plain

2. Inspectorと書かれたところ右クリックしてLockする
f:id:wkpn:20160807150734p:plain

3. Inspectorと書かれたところ右クリックして、「Add Tab」でもう一個Inspectorタブを追加し、そっちで編集する
f:id:wkpn:20160807150656p:plain

という方法で実現可能です。
個人的にはこの方法が一番使い勝手が良いですね。

Make 10 by using 4 numbers

Make 10 by using 4 numbers

  • Ken Watanabe
  • ゲーム
  • 無料
play.google.com

UnityのInputFieldでちょっとハマったこと

文字を入力するUIとして便利なInputFieldを使っていてちょっとハマったのでメモ。

入力された文字は、InputField以下のTextオブジェクトに入り表示されます。
しかしTextオブジェクトが十分に大きくない場合は、最初に入力した文字が削られたものしか入っていません。

下画はInputFieldに"123456789"という文字列を入れたところですが、Textには56789しか入っていません。

f:id:wkpn:20160807125521p:plain

実際に入れた文字列"123456789"を取得するには、InputField自体が持つtextプロパティにアクセスすれば取得できます。

つまり

inputField.text != inputFieldの子供のText.text;

ということです。

後から考えると当たり前みたいな話ですが、ちょっとハマったのでメモしておきます。


Make 10 by using 4 numbers

Make 10 by using 4 numbers

  • Ken Watanabe
  • ゲーム
  • 無料
play.google.com

Hierarchyに、オブジェクトのアクティブを変更するチェックボックスと、オブジェクトの編集可能不可能を変更するアイコンと、無効なコンポーネントがアタッチされているかどうかを表示。

長いタイトルですいません。

下記のスライドの中でHierarchyに関数エディタ拡張の例がいくつか紹介されていたのですが、
http://www.slideshare.net/shotababa359/unity-49731764

この中から自分的に使いそうだった

  • オブジェクトのアクティブを変更するチェックボックス
  • オブジェクトの編集可能不可能を変更するアイコン
  • 無効なコンポーネントがアタッチされているかどうかを表示

の3つをピックアップしてまとめただけです。。。

こんな感じになります。

f:id:wkpn:20160807083502p:plain

以下、ソース。


Make 10 by using 4 numbers

Make 10 by using 4 numbers

  • Ken Watanabe
  • ゲーム
  • 無料
play.google.com

Unity5.4.0にしたら、Pluginが重複してるっていうエラーがでた

Unity5.4.0にしてiOSのビルドをしようと思ったら以下の様なエラーが、

Plugin 'GoogleMobileAds.framework' is used from several locations:
 Assets/Plugins/iOS/GoogleMobileAds.framework would be copied to <PluginPath>/GoogleMobileAds.framework
 Assets/Plugins/Android/GoogleMobileAds.framework would be copied to <PluginPath>/GoogleMobileAds.framework
Please fix plugin settings and try again.

どうも、GoogleMobileAds.frameworkが重複しているよーとのこと。

おかしいな。Plugin以下のiOSフォルダには、GoogleMobileAds.frameworkは一個しか無いのに...

他にもあるのは、Androidフォルダ以下だし...

っと見てみると、Androidフォルダ以下のGoogleMobileAds.frameworkの設定はAny Platformになっていた。

f:id:wkpn:20160805135349p:plain

どうも、これが原因らしい。

Anyのチェックを外してAndroidにチェックを入れるようにしたら無事ビルドできました。

Unity5.4.0になって、この辺りをよりしっかりチェックするようになったみたいですね。

Unity(5.3.5)で丸影がちゃんとでない件 〜解決済み〜

皆さん、丸影好きですか?僕は好きです。ShadowMapよりたいてい処理が軽いし、ジャギらないし。

Unity version 5.3.5f1 で丸影(ProjectorのShadow)を使ってみてたのですが、下の画像の様にちゃんと影が出なくなっていました。

f:id:wkpn:20160804143608p:plain

Planeには影も形もなく、Cubeには変な位置に影がでます。

ネットで調べると報告している人がいました。
issuetracker.unity3d.com

Reproduced with: 5.2.4f1, 5.3.5p7.

Not reproduced with: 5.4.0b25.

とのことで、5.4からは発生していない模様。

5.4になったばかりなので移行を渋っていたのですが、この機会に5.4へ移行しました。

f:id:wkpn:20160804143659p:plain

ちょっと分かりにくい画像ですが、ちゃんと直ってました。