こんにちは.
私も同じ疑問を抱いていました.
調べても特に回答を得られなかったので,私の中で至った結論は
「Unityは独自のコンパイラを使用しているので,特定のイベント関数のみエンジンから呼べるようにしている」
ということです.
仮想関数はオーバーヘッドがかかりますからね.
C++ならまだしもC#ですし,エンジンの根幹部分で多大なオーバーヘッドによる負荷を生じさせてしまってはゲームどころではなくなってしまうため,コンパイラレベルで根本的に手を入れているのではないかと思っています.
さらに言うとpublicさえ付けさえない(付けなくて良い)のはイベント関数が不用意に他のクラスから呼ばれる事を防ぐためと,下記の点を実現するためではないかと.(長いので別段落にしました)
なお,継承した場合に基底クラスのイベント関数(例えばUpdate)にpublicを付けない場合は言語仕様通り継承されず,派生クラスでUpdateを定義しない場合は基底クラスのUpdateさえ呼ばれないので,クラスだけ継承してもオブジェクトの動作を決定するイベント関数は完全に別個になります.
それが Mono(単一の)Behaviour(動作)の名前の由来と考えると繋がります.
(BehaviourからではなくMonoBehaviourからイベント関数が定義されていますよね)
publicにすると言語仕様上必ず継承されてしまうので,子側で空の関数を定義しない限り親の動作を引き継いでしまい,このような動作は実現できません.
継承されようとも動作定義をクラス単位で別個にするには,publicを付けない状態で呼び出せる方法(=コンパイラ拡張)が必要になります.
前述のパフォーマンスのためか,MonoBehaviourの設計思想のためか,理由はどちらにせよ根本的に手を入れている線は間違いないのではないかと.
いまひとつ文章がまとまっていなくてすみません.
あくまで推測なので鵜呑みにしないで頂ければ幸いです.
※追記
誤った情報がありますが訂正しておりませんので,
後々ご覧になる方はコメント欄を見て補完して下さい.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/01 11:12
2016/06/01 23:56