SendMessageは返り値はないのでハマった。
B(BObject)にアタッチされたHogeスクリプト(HogeScript.cs)のBarメソッドを呼びたい
Barメソッドの返り値はboolとする。
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"が出るはず