C#の子Classから親Classのメソッドを呼び出す方法
System.EventHandler
を使用する Unityには他のグラフィカルな方法がある模様だがコードの範囲内で収めたかったので今回はC#のSystem.EventHandler
を使用。
備忘録的に書き残すので間違えているところがあったらご了承
コード的にはChild.StartToCall を出発して Parent.CalledFunction までEventが飛べばいい
class Child{
// イベントハンドラを定義 (今回はCustomArgsを送りたいため独自に定義)
internal delegate void TestEventHandler(object sender TestEventArgs e);
internal TestEventHandler testEventHandler;
void StartToCall(){
// 送信開始 ここから -> Parent.CalledFunctionが呼び出されれば成功
var testEventArgs = new TestEventArgs();
testEventArgs.valueToSend = value;
testEventHandler(this, testEventArgs);
}
}
// カスタムArgs valueを送る必要がない場合はもう少しかんたんに
class TestEventArgs: EventArgs{
// 送りたいValueを定義 GameObjectでもいいしIntでも...
internal Something valueToSend;
}
// 親のClass この中のCalledFunctionがChildのStartToCallから呼び出される
class Parent{
Child child;
Parent(){
child = new Child();
// Init ChildからHandlerを送る際の初期設定 ChildのHandlerにParentの呼び出されるFuncを登録しておく
child.TestEventHandler += new Child.TestEventHandler(CalledFunction);
}
void CalledFunction(object o, TestEventArgs args){
// このメソッドがChildから呼び出されたら成功
print(args.valueToSend);
}
}
くっそめんどくさいね。CustomArgsが必要ない場合はもう少し簡単になる模様
UnityをやるためにC#ならUnity謹製のEventがあってコードちょびっとでUIで弄れる。でも昔のXcodeのStoryboardでやらかした経験があるためあまりUI頼りにしたくないのだ。
以上
@ktz_alias様 @albireo様から訂正のコメントを頂いたのでモダンにしたバージョンも書いておく。
class Child{
// イベントハンドラを定義 (今回はCustomArgsを送りたいため独自に定義)
//*** 独自のHandlerは宣言しなくてもEventHandler<TEventArgs>が有るためこれを使用 ***
internal event EventHandler<TestEventArgs> testEventHandler;
void StartToCall(){
// 送信開始 ここから -> Parent.CalledFunctionが呼び出されれば成功
// *** モダンな書き方、VSによく注意されるやつだ... ***
testEventHandler(this, new TestEventArgs(){
valueToSend = value,
});
}
}
// カスタムArgs valueを送る必要がない場合はもう少しかんたんに
class TestEventArgs: EventArgs{
// 送りたいValueを定義 GameObjectでもいいしIntでも...
internal Something valueToSend;
}
// 親のClass この中のCalledFunctionがChildのStartToCallから呼び出される
class Parent{
Child child;
Parent(){
child = new Child();
// Init ChildからHandlerを送る際の初期設定 ChildのHandlerにParentの呼び出されるFuncを登録しておく
// *** new Child.TestEventHandler(CalledFunction)今はこれ書かなくてもOK ***
child.TestEventHandler += CalledFunction;
}
void CalledFunction(object o, TestEventArgs args){
// このメソッドがChildから呼び出されたら成功
print(args.valueToSend);
}
}
ググって一番上に有るやつの記事を鵜呑みにしてはイケナイ
こういう筆者のせいで昔の古文書コードがネット上で脈々と受け継がれるわけだ。反省しています...