FC2ブログ
    05 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 07

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】BroadcastMessageって使ってますか?使い方を軽く紹介。複数のオブジェクトの処理を一斉にする場合に使うみたいです。 

    こんにちは。3月ももう終わろうとしています。
    早いですね・・・・つらいっす。坂内っす。

    ポケガ3も少しずつですが形になってきてはいます!


    さて、Unityのお話。

    BroadcastMessageって使ってますか?
    私は使ってません。


    オブジェクトの全子供の特定のメソッドを一斉に実行するといったもの。
    SendMessageのブロードキャスト版ですね。

    SendMessage自体使わないと思うのですが(重い)、そのブロードキャスト版とか、さらに重そうですもんね。

    ただ、使い方の紹介だけしときますね。



    こんな感じでCubeを3個並べました。
    ボタンを押したら動く感じにしようかなと。

    それぞれのCubeには以下のコンポーネントを付けています。

    [Blog0328.cs]

    using UnityEngine;

    public class Box0328 : MonoBehaviour
    {
    Vector3 targetPosition;
    private Vector3 velocity = Vector3.zero;
    public float time = 1F;

    private void Start() {
    targetPosition = transform.position;
    }

    public void MoveY() {
    targetPosition = new Vector3(transform.position.x, 2f, transform.position.z);
    }

    private void Update() {
    transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, time);
    }
    }



    MoveYを呼べば動く感じですね。

    さっそくBroadcastMessage使ってみましょう。

    シーンに空のオブジェクトを作って、以下のコンポーネントを付けます。

    [Blog20220328.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220328 : MonoBehaviour
    {
    [SerializeField] Button btnMove;
    [SerializeField] GameObject rootObj;

    void Start()
    {
    btnMove.onClick.AddListener(MoveCube);
    }

    void MoveCube() {
    rootObj.BroadcastMessage("MoveY");
    }
    }



    ボタンとRootになるオブジェクトをアサインします。



    これで、実行。



    ちゃんと全部のCubeのMoveYを呼んでくれたらしいです。


    ただ、SendMessageと同様BroadcastMessageも以下のような問題があります。

    1.オブジェクトに対象のメソッドがない場合でもコンパイルが通ってしまうため、エラーが追いにくい。
    2.おもい

    ということで、上記処理を行うならば、以下のようにした方がよさそうですね。

    [Blog20220328.cs]

    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20220328 : MonoBehaviour
    {
    [SerializeField] Button btnMove;
    [SerializeField] Box0328[] boxs;

    void Start()
    {
    btnMove.onClick.AddListener(MoveCube);
    }

    void MoveCube() {
    foreach (Box0328 box in boxs) {
    box.MoveY();
    }
    }
    }



    Rootのオブジェクトを使わず、Cubeのクラスの配列等にアサインし、それぞれMoveYを呼ぶ。

    たぶんこれが正解でしょうか。

    ということで、BroadcastMessageはそれはそれで便利ではあるが、問題も多いので使うところを考えて使いましょう。

    どこで使うのがいいとかあれば教えてくださいませ。

    では、あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/874-505f1b03
    この記事にトラックバックする(FC2ブログユーザー)