

■現状  
PhotonCloudというマルチオンラインのしくみを使って  
マルチ対戦を作ろうとしています。  
  
PhotonEventManager.csのOnConnectedToPhotonは  
PhotonServerに接続されるとイベントが飛んできます。  
イベントが飛んで来た時に、ある処理が呼ばれるという仕組みを作りたいのですが  
呼ばれずに悩んでおります。  
OnConnectedToPhotonメソッドが呼ばれることは確認できています。  
イベントやデリゲートなどの基本的な事でできると思うのですができていません。

■やりたい事（C#3.0）  
タイトルのラムダ式にこだわっているわけではなく、  
あるメソッドが呼ばれたことを別のメソッドに通知するというような事が  
したいというのが意図になります。

■ソースと説明  
下記、PhotonEventManager.csのOnConnectedToPhotonと  
ConnectionPhase.csのSetManagerメソッド内でラムダ式内部が呼ばれるように  
紐づけているつもりなのですが、OnConnectedToPhotonメソッドが呼ばれますが  
ラムダ式内部は呼ばれないです。

●PhotonCloud.cs

[code]

    using UnityEngine;
    using System;
    
    public class PhotonEventManager : Photon.MonoBehaviour {
    
        /// <summary>
        /// 接続成功時に呼び出される。
        /// </summary>
        public void OnConnectedToPhoton()
        {
            Debug.Log("OnConnectedToPhoton");
        }
    
        //接続が切断されたときにコール
        public void OnDisconnectedFromPhoton()
        {
            Debug.Log("Disconnected from Photon.");
        }
    }
    
[/code]

●ConnectionPhase.cs

[code]

    using System;
    
    public class ConnectionPhase
    {
    
        public void SetManager(PhotonEventManager manager)
        {
    
            manager.OnConnectedPhoton = () => 
            {
                UnityEngine.Debug.Log("Success");
            };
        }
    }
    
[/code]

■環境  
Unity5.5.1f1  
C#3.0  
VisualStudio 2015 Community


CC BY-SA 3.0
2017-02-07T15:22:43.877
32467
2017-02-08T05:15:24.920
5261
question
c# unity3d
あるメソッドがコールされると紐づけたラムダ式内部を実行したい（別メソッドへ通知）


`OnConnectedToPhoton()`が呼ばれたときに実行する処理を`PhotonEventManager`の外部から登録できるようにしたい、と解釈しました。

`PhotonEventManager`クラスの中で

[code]

    public delegate void Action();       //////// 下のActionが未定義だと怒られるようなら追加(クラス外に書いても可)
    
    public event Action PhotonConnected; //////// 追加
    
    /// <summary>
    /// 接続成功時に呼び出される。
    /// </summary>
    public void OnConnectedToPhoton()
    {
        Debug.Log("OnConnectedToPhoton");
    
        //////// 以下追加
        Action action = PhotonConnected;
        if(action != null)
            action();
    }
    
[/code]

のようにイベント定義とそのハンドラを呼び出すコードを追加します。

登録する側は

[code]

        manager.PhotonConnected += () =>
        {
            UnityEngine.Debug.Log("Success");
        };
    
[/code]

のようにイベントハンドラを登録すればOKです。


CC BY-SA 3.0
2017-02-07T16:42:40.057
32471
2017-02-08T05:15:24.920
2017-02-08T05:15:24.920
4765
4765
32467
answer