万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

SendMessageは返り値はない Unity

SendMessageは返り値はないのでハマった。
B(BObject)にアタッチされたHogeスクリプト(HogeScript.cs)のBarメソッドを呼びたい
Barメソッドの返り値はboolとする。

Hogeスクリプトの中身

using UnityEngine;
using System.Collections;

public class Hoge : MonoBehaviour {
	bool Flg;

	public bool Bar() {
		return Flg;
	}
	
	void OnCollisionEnter(Collision collision) {
		Flg = true;
	}
	void OnCollisionExit(Collision collision) {
		collide = false;
	}
}
if (BObject.SendMessage("Bar")) {
    // so something
}

→これは無理

if (BObject.GetComponent<HogeScript>().Bar()) {
    // so something
}

→これでよさげ

別のメソッドの返り値のやり方のサンプル
http://answers.unity3d.com/questions/119829/sendmessage-return-value.html

これはおそらく「ショットガン」のオブジェクトに「Shotgun.cs」をアタッチして
「ショットガン」のオブジェクトにアタッチされている別のスクリプトから「GetAmmo」メソッドを呼んだ返り値のテストだと思う。

スクリプトが見にくいのと、バグは修正した。

・Shotgun.cs

using UnityEngine;
using System.Collections;

public interface IWeapon {
    int GetAmmo(); // C#の言語仕様では常にインターフェイスのメンバは必ずpublicなので可視性をかかない。(※書くとバグ)
}

public class MyBaseClass : MonoBehaviour {
}

public class Shotgun : MyBaseClass,IWeapon {
    public int GetAmmo() {
        return 5; // :D implement it as you need it
    }
}

・やり方1(Bunny83氏案?)
「ショットガン」のGameObjectへ記載

IWeapon weapon = fakeObj.GetComponent(typeof(IWeapon)) as IWeapon;
if (weapon != null) {
    print(weapon.GetAmmo());
}

・やり方2(Make氏提案?)
「ショットガン」のGameObjectへ記載

MyBaseClass[] list = fakeObj.GetComponents<MyBaseClass>();
foreach(MyBaseClass O in list) {
    if (O is IWeapon) {
        // 武器なら
        IWeapon weapon = (IWeapon)O;
    	print(weapon.GetAmmo());
    }
}

→ ログにGetAmmo()メソッドの返り値"5"が出るはず