ホームページ >ウェブフロントエンド >htmlチュートリアル >サーバーとクライアント間のカスタム インタラクション イベントまたは Unity ゲーム開発のページ フロー Development_html/css_WEB-ITnose
紹介:
1. ゲームページ間のインタラクション
(1) 装備バックパック
(2) 装備情報ページ
ゲーム開発では、時々ありますゲームのバックパック システムなど、2D ページ間の相関関係は不可欠です。プレイヤーはバックパック システムに入り (上の図の装備バックパックと装備情報ページを参照)、装備をクリックして装備情報ページを表示します。カードゲーム全般の情報ページです。例えば「解放三國志」ではプレイヤーが一定のゲーム通貨を消費すると装備の属性値が上昇する機能が付いています。機器に応じて、機器情報ページの機器属性が更新されます。しかし、装備情報ページを閉じると、バックパック システム
ページの対応する装備の説明も変更されます。しかし、バックパック システムは、装備情報ページで元の属性値が変更されたことをどのようにして知るのでしょうか?イベントは登録の監視とディスパッチに使用されます。つまり、装備が強化されている場合、装備情報ページを閉じる際にバックパックシステムのページにメッセージを送信する必要があり、バックパックシステムは開いたときに送信されたメッセージを処理するメッセージ処理関数を登録しています。情報ページからメッセージ
を受信したら、メッセージ処理機能でバックパック システム ページを更新します。これでデータの整合性が完成します
2. クライアントとサーバー間の対話
前述したように、装備強化機能には、プレイヤーが強化ボタン をクリックすると、クライアントとサーバー間の対話が含まれます。サーバーに強化リクエストを送信する必要があります。送信する前に、クライアントはサーバーが正常に強化されるのを待った後、強化が成功したかどうかを示すメッセージをサーバーからクライアントに受信する必要があります。メッセージを受信した後、クライアントは成功の特殊効果ブロードキャストとページ更新を強化します。
上記 2 つの状況はどちらもゲーム要素のインタラクティブ性に関係しますが、Unity 独自のメッセージ処理メカニズムはページ間のメッセージ送信を処理できますが、サーバー データ層と UI 層の間の相互作用は少し異なります。データはデータであり、UI は UI であり、UI は単なるデータの表示であるため、不十分です。そこで、UI 層のページ間およびクライアントとサーバー間の対話を処理する一連のメッセージ パッシング処理メカニズムがここで定義されています
1. 各イベントは、EventID という固有のイベント ID によって識別されます。各 EventID は、コード EventID.as によって処理されます。
public sealed class EVENTID{ // public const int EID_WEAPON_STRONG = 1;//武器强化事件ID public const int EID_WAIT_SERVER_MSG = 2;//等待服务器消息传送事件ID }
public class CoreEvent { protected int m_iEventId = 0; //消息处理码,比如m_iEventCode = 0,表示接受服务器消息成功,m_iEventCode = 1,服务器交互失败,当晚间游戏货币不足的时 //候,不能完成装备强化等功能,UI层根据不同的m_iEventCode,做相应的处理----强化成功或者失败的处理 protected int m_iEventCode = 0; protected Object m_EventParam = null; public CoreEvent(int eventId, int eventCode = 0) { m_iEventId = eventId; m_iEventCode = eventCode; } public CoreEvent(int eventId, int eventCode, Object eventParam) { m_iEventId = eventId; m_iEventCode = eventCode; m_EventParam = eventParam; } public int EventID { get { return m_iEventId; } } public int EventCode { get { return m_iEventCode; } } public Object EventParam { get { return m_EventParam; } set { m_EventParam = value; } }}
public class CoreEventDispatcher { /*消息处理委托,每一个事件id,对应一个或多个消息处理函数*/ public delegate void EventHandler(CoreEvent evt); private Dictionary<int, EventHandler> mEventHandlerPool = new Dictionary<int, EventHandler>(); /*消息注册函数*/ public void AddEventListener(int eventId, EventHandler handler) { EventHandler evtHandler = null; if(mEventHandlerPool.ContainsKey(eventId)) { evtHandler = mEventHandlerPool[eventId]; evtHandler += handler; mEventHandlerPool[eventId] = evtHandler; } else mEventHandlerPool.Add(eventId, handler); evtHandler = null; } /*消息移除函数*/ public void RemoveEventListener(int eventId, EventHandler handler) { EventHandler evtHandler = null; if(mEventHandlerPool.ContainsKey(eventId)) { evtHandler = mEventHandlerPool[eventId]; evtHandler -= handler; mEventHandlerPool[eventId] = evtHandler; if(evtHandler == null) mEventHandlerPool.Remove(eventId); } evtHandler = null; } /*消息派发函数*/ public void DispatchCoreEvent(CoreEvent evt) { if(evt != null && mEventHandlerPool.ContainsKey(evt.EventID)) { EventHandler evtHandler = mEventHandlerPool[evt.EventID]; if( evtHandler != null) { evtHandler(evt); } } }}