1. 程式人生 > >Unity3d 失去獲取焦點,暫停

Unity3d 失去獲取焦點,暫停

焦點

目前在用tolua進行項目開發,C#與lua交互的部分消息使用了註冊監聽處理,監聽方法均放到Update方法裏面進行處理,問題在於失去焦點後Update方法將不繼續執行,這就導致了監聽方法未能及時調用。

例如:AB玩家進行紙牌遊戲,A接到電話並失去焦點,Update不執行導致消息未能及時通知服務器,此時B未能及時收到A的狀態誤以為A還在打牌狀態。

此外Android Plugins中的UnityPlayer.UnitySendMessage,經測試在強制暫停時,OnPause、OnStop周期中UnitySendMessage無效。(個人未測)

故要特殊處理這兩個方法,現改成C#直接調用lua方法,去掉監聽推送這一步。

   C#:
   /// <summary>
    /// 當程序獲得或者是去焦點時
    /// </summary>
    /// <param name="focus"></param>
    public void OnApplicationFocus(bool focus)
    {
        try
        {
            LuaManager.CallFunc_Void("MineMessageCenter.OnApplicationFocus", focus);
        }
        catch (System.Exception)
        {
            
            throw;
        }

        //Debug.logger.Log("焦點:" + focus);
        //if (focus)
        //{
        //    MessageCenter.GetInstance().PostEvent(EventNameDefine.GetFocusEvent);
        //}
        //else
        //{
        //    MessageCenter.GetInstance().PostEvent(EventNameDefine.LostFocusEvent);
        //}
    }
    
       /// <summary>
    /// 當程序暫停
    /// </summary>
    /// <param name="focus"></param>
    public void OnApplicationPause(bool isPause)
    {
        try
        {
            LuaManager.CallFunc_Void("MineMessageCenter.OnApplicationPause", isPause);
        }
        catch (System.Exception)
        {

            throw;
        }
       
        //Debug.logger.Log("暫停:" + isPause);
        //if (isPause)
        //{
        //    MessageCenter.GetInstance().PostEvent(EventNameDefine.GetPauseEvent);
        //}
        //else
        //{
        //    MessageCenter.GetInstance().PostEvent(EventNameDefine.LostPauseEvent);
        //}
    }
Lua:
--當程序獲得或者是去焦點時
function MineMessageCenter.OnApplicationFocus(focus)
print("焦點:"..tostring(focus));
end 

--當程序暫停
function MineMessageCenter.OnApplicationPause(isPause)
--print("暫停:"..tostring(isPause));
end


本文出自 “wo愛錢” 博客,請務必保留此出處http://mozhenrui.blog.51cto.com/11845221/1977067

Unity3d 失去獲取焦點,暫停