万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    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"が出るはず