const int TOASTNOTICE_TYPE_INFO_ID = 00; const int TOASTNOTICE_TYPE_WARNING_ID = 10; const int TOASTNOTICE_TYPE_ERROR_ID = 20; // トースト通知システム // コンポーネントとして独立すべし。 component TNManager{ const string TOASTNOTICE_LAYER_NAME = "ToastNotice"; const int _maxNotice = 5; list _noticeActorList; // 溢れてる時用 list _stackToastNoticeList; bool _isWorldLoadEnd; // 通知を出した回数 int _noticeCounter; public TNManager(){ if(_noticeActorList === null){ _noticeActorList = new list(); } if(_stackToastNoticeList === null){ _stackToastNoticeList = new list(); } _isWorldLoadEnd = false; _noticeCounter = 0; hsAddEventListener("send-notify-message", AddNoticeFromJS); } private bool WorldLoadChecker(){ LayerBundle layer = hsLayerGet(TOASTNOTICE_LAYER_NAME); return IsGetLayerBundle(layer); } private void Initialize(){ LayerBundle layer = hsLayerGet(TOASTNOTICE_LAYER_NAME); layer.SetShow(true); } public void Update(){ // ワールドの初期読み込みチェック if(_isWorldLoadEnd == false){ if(WorldLoadChecker()){ Initialize(); _isWorldLoadEnd = true; } }else{ for(int i = 0; i < _noticeActorList.Count(); i++){ _noticeActorList[i].Update(); // 通知アクションが終了した時 if(_noticeActorList[i].IsEndNoticeAction()){ _noticeActorList[i].OnDelete(); _noticeActorList.RemoveAt(i); // 後ろに控えている通知がある場合 if(_stackToastNoticeList.IsEmpty() == false){ // 一番最初に追加されたものを追加する。 _noticeActorList.Add(_stackToastNoticeList[0]); _stackToastNoticeList.RemoveAt(0); } if(_noticeActorList.IsEmpty()){ break; } --i; RefleshNoticeActionViewID(); } } } } // Canvasの読み込み完了チェッカー private bool IsGetLayerBundle(LayerBundle layerbundle){ bool isNull = layerbundle.ToString() == "LayerBundle(portrait: null, landscape: null)"; bool isNonLoded = layerbundle.ToString() == "LayerBundle(portrait: , landscape: )"; return (isNull == false) && (isNonLoded == false); } void AddNoticeFromJS(string data){ Json noticeJson = hsLoadJson(data); // 種類 int noticeTypeID = TOASTNOTICE_TYPE_INFO_ID; noticeJson.FindValueInt("noticeTypeID", noticeTypeID); // 通知メッセージ string noticeText = ""; noticeJson.FindValueString("message", noticeText); // 表示時間 float viewTime = 5; noticeJson.FindValueFloat("viewTime", viewTime); // 通知識別キー string identifyKey = "default"; noticeJson.FindValueString("identifyKey", identifyKey); // 通知識別キー string optionData = ""; noticeJson.FindValueString("optionData", optionData); AddNotice(noticeTypeID, noticeText, viewTime, identifyKey, optionData); } // 通知を追加する public void AddNotice(int noticeTypeID, string noticeText, float displayTime, string identifyKey, string optionData){ TNActor notice = new TNActor(); notice.Initialize(_noticeCounter, TOASTNOTICE_LAYER_NAME, noticeTypeID, noticeText, identifyKey, optionData); notice.SetDisplayTime(displayTime); if(_noticeActorList === null){ _noticeActorList = new list(); } if(_stackToastNoticeList === null){ _stackToastNoticeList = new list(); } if(_noticeActorList.Count() < _maxNotice){ _noticeActorList.Add(notice); RefleshNoticeActionViewID(); }else{ _stackToastNoticeList.Add(notice); } _noticeCounter ++; } private void RefleshNoticeActionViewID(){ if(_noticeActorList.IsEmpty()){ return; } int viewSortId = 0; int lastIndex = _noticeActorList.Count() - 1; for(int i = lastIndex; i >= 0 ; i--){ _noticeActorList[i].ChangeNoticeViewID(viewSortId); viewSortId ++; } } // 画面サイズが変わった場合 public void OnResize(int _width, int _height){ } public void OnClickedButton(string _layerName, string _buttonName){ if(_layerName != TOASTNOTICE_LAYER_NAME){ return ;} string noticeBaseGUITempName = "NoticeBase_button_"; if(_buttonName.IndexOf(noticeBaseGUITempName) == -1){ return; } int uuidArea = _buttonName.Length() - noticeBaseGUITempName.Length(); int noticeUUID = _buttonName.SubString(noticeBaseGUITempName.Length(), uuidArea).ToInt(); NoticeForceQuit(noticeUUID); } private void NoticeForceQuit(int noticeID){ for(int i = 0; i < _noticeActorList.Count(); i++){ if(noticeID == _noticeActorList[i].GetNoticeUUID()){ _noticeActorList[i].NoticeForceQuit(); } } } }