久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Unity設(shè)計(jì)模式實(shí)戰(zhàn):狀態(tài)機(jī)、對(duì)象池與事件中心解決商業(yè)項(xiàng)目痛點(diǎn)

Unity設(shè)計(jì)模式實(shí)戰(zhàn):狀態(tài)機(jī)、對(duì)象池與事件中心解決商業(yè)項(xiàng)目痛點(diǎn) 1. 項(xiàng)目概述Unity程序員為什么繞不開“模式”這個(gè)坎干了這么多年Unity開發(fā)我越來(lái)越覺得設(shè)計(jì)模式不是面試八股文而是商業(yè)項(xiàng)目里真刀真槍解決問(wèn)題的工具箱。你接手一個(gè)項(xiàng)目Leader甩過(guò)來(lái)一句“用狀態(tài)機(jī)重構(gòu)一下BOSS戰(zhàn)斗邏輯”或者策劃滿嘴跑火車地要求“每種敵人都有三種攻擊形態(tài)后續(xù)還要加新種類”這時(shí)候如果你腦子里沒(méi)有一套成熟的“模式”體系代碼就會(huì)從第三天開始失控。標(biāo)題里說(shuō)的“模式相關(guān)的開發(fā)需求”我理解下來(lái)大概分兩層。狹義上是指設(shè)計(jì)模式在Unity中的落地比如單例、狀態(tài)、觀察者、工廠、對(duì)象池、命令模式這些廣義上還包括Unity引擎自帶的“模式化”機(jī)制比如Animator的有限狀態(tài)機(jī)、協(xié)程和異步模型、腳本生命周期回調(diào)甚至Addressables的資源加載模式。這兩層你得融會(huì)貫通才能在商業(yè)項(xiàng)目里游刃有余。這篇文章不是教科書式的理論復(fù)述而是把我這些年從中小型團(tuán)隊(duì)、獨(dú)立Demo到線上運(yùn)營(yíng)項(xiàng)目的實(shí)踐總結(jié)一遍什么場(chǎng)景用哪個(gè)模式、為什么選它而不是另一個(gè)、核心代碼長(zhǎng)什么樣、以及我在真實(shí)項(xiàng)目中踩過(guò)哪些坑。無(wú)論你是剛轉(zhuǎn)Unity兩三個(gè)月的初級(jí)程序員還是在做中大型項(xiàng)目想梳理代碼架構(gòu)的資深開發(fā)這篇文章應(yīng)該都能給你一點(diǎn)可落地的參考。我始終有個(gè)觀點(diǎn)設(shè)計(jì)模式是為了解決特定問(wèn)題而存在的不是為了炫耀技術(shù)。脫離業(yè)務(wù)場(chǎng)景談模式是耍流氓具體怎么理解下面拆開講。2. 需求拆解與方案選型模式不是越多越好而是越準(zhǔn)越好2.1 先看清“模式化需求”到底長(zhǎng)什么樣展開寫方案之前得先把需求看清楚。我總結(jié)了商業(yè)項(xiàng)目里最常見的幾類“模式相關(guān)需求”你對(duì)照一下基本不會(huì)跑偏第一類對(duì)象狀態(tài)切換類需求。典型的就是角色行為——待機(jī)、移動(dòng)、攻擊、受擊、死亡或者戰(zhàn)斗流程——回合開始、玩家行動(dòng)、敵方行動(dòng)、回合結(jié)束。這類需求的特點(diǎn)是狀態(tài)之間切換邏輯復(fù)雜條件判斷散落在各處用一堆if-else寫到最后連自己都改不動(dòng)。第二類對(duì)象創(chuàng)建與管理類需求。比如怪物波次生成、子彈發(fā)射、UI彈窗、飄字特效。這類需求的核心矛盾是對(duì)象數(shù)量動(dòng)態(tài)變化創(chuàng)建銷毀頻繁直接new和Destroy會(huì)導(dǎo)致性能抖動(dòng)和GC壓力同時(shí)不同種類對(duì)象的創(chuàng)建流程差異大代碼容易重復(fù)。第三類模塊間通信類需求。比如戰(zhàn)斗模塊打掉一個(gè)怪UI界面要刷新任務(wù)進(jìn)度音效模塊要播放擊殺音效成就系統(tǒng)要累計(jì)計(jì)數(shù)。如果每個(gè)模塊都直接互相引用耦合度會(huì)瞬間爆炸改一個(gè)功能牽扯一片。第四類流程控制與管理類需求。比如新手引導(dǎo)、副本流程、登錄流程這些流程有嚴(yán)格的先后順序且每一步都可能被突發(fā)事件打斷——玩家斷線、點(diǎn)擊跳過(guò)、強(qiáng)制退出。普通寫法是嵌套回調(diào)寫到最后就是傳說(shuō)中的“回調(diào)地獄”。2.2 方案選型背后的取舍邏輯針對(duì)上面四類需求對(duì)應(yīng)的模式選型其實(shí)有相對(duì)成熟的組合。這里直接給結(jié)論附上我的理由需求類型推薦模式組合為什么不選其他方案狀態(tài)切換狀態(tài)模式State 有限狀態(tài)機(jī)FSM用EnumSwitch寫狀態(tài)切換新加一個(gè)狀態(tài)要改原方法違背開閉原則對(duì)象創(chuàng)建管理對(duì)象池Object Pool 工廠模式Factory直接Instantiate頻繁操作性能和內(nèi)存都不穩(wěn)工廠類把創(chuàng)建邏輯收斂配合池子批量管理模塊通信觀察者模式Observer/ 事件中心模塊之間互持引用整個(gè)項(xiàng)目變成蜘蛛網(wǎng)沒(méi)法做熱更和單元測(cè)試流程控制命令模式Command或異步狀態(tài)機(jī)嵌套回調(diào)邏輯不直觀出錯(cuò)后堆棧全亂而且中途打斷很難處理這個(gè)選型邏輯本質(zhì)上是在回答三個(gè)問(wèn)題這個(gè)需求的變化點(diǎn)在哪里這段代碼的復(fù)用點(diǎn)是哪里改動(dòng)頻率最高的地方能不能被隔離2.3 為什么我建議“先做減法”我在早期帶項(xiàng)目的時(shí)候犯過(guò)一個(gè)典型錯(cuò)誤剛學(xué)完設(shè)計(jì)模式恨不得把二十三種模式全塞進(jìn)項(xiàng)目里。結(jié)果就是代碼抽象層級(jí)過(guò)多一個(gè)簡(jiǎn)單的攻擊邏輯繞了五六個(gè)類新來(lái)的同事根本看不懂調(diào)試起來(lái)想罵人。后來(lái)我學(xué)乖了。設(shè)計(jì)模式在項(xiàng)目里應(yīng)該按“成本收益比”來(lái)取舍。比如一個(gè)功能可能寫死不再改那直接用最簡(jiǎn)單的方式實(shí)現(xiàn)就好沒(méi)必要硬套模式。但如果需求文檔里明確寫了“后續(xù)會(huì)新增角色種類”、“可能有多種攻擊方式”那就值得花一天時(shí)間把模式設(shè)計(jì)好。記住一句話模式是應(yīng)對(duì)變化的手段沒(méi)有變化需求就蒸蒸日上不需要模式。這個(gè)行業(yè)很多項(xiàng)目的代碼腐爛不是因?yàn)槌绦騿T不懂設(shè)計(jì)模式恰恰是因?yàn)檫^(guò)度設(shè)計(jì)導(dǎo)致沒(méi)人敢改、沒(méi)人能懂。3. 核心技術(shù)點(diǎn)解析五個(gè)高頻Unity設(shè)計(jì)模式實(shí)戰(zhàn)詳解這五個(gè)模式是我從業(yè)以來(lái)使用頻率最高的幾乎每個(gè)商業(yè)項(xiàng)目都會(huì)用到。我分別從“它解決什么問(wèn)題”、“核心原理長(zhǎng)什么樣”、“Unity環(huán)境下的實(shí)現(xiàn)細(xì)節(jié)”三個(gè)角度講透。3.1 單例模式服務(wù)管理器的利與弊單例大概是Unity開發(fā)者最早接觸的模式因?yàn)樗鉀Q了一個(gè)很現(xiàn)實(shí)的問(wèn)題有一些對(duì)象全局唯一而且到處都要訪問(wèn)——音頻管理器、UI管理器、網(wǎng)絡(luò)管理器、存檔管理器。每個(gè)地方都傳引用太麻煩不如搞個(gè)全局訪問(wèn)點(diǎn)。C#里最典型的實(shí)現(xiàn)就是你經(jīng)常見到的public class AudioManager : MonoBehaviour { private static AudioManager _instance; public static AudioManager Instance { get { if (_instance null) { _instance FindObjectOfTypeAudioManager(); if (_instance null) { var go new GameObject(AudioManager); _instance go.AddComponentAudioManager(); DontDestroyOnLoad(go); } } return _instance; } } }這段代碼把幾個(gè)要點(diǎn)都覆蓋了懶加載、場(chǎng)景中自動(dòng)查找、沒(méi)有則自動(dòng)創(chuàng)建、跨場(chǎng)景不銷毀。很多初學(xué)者抄完就完了但有幾個(gè)坑你得注意。第一個(gè)坑是單例的銷毀時(shí)機(jī)。游戲退出時(shí)Unity會(huì)銷毀所有場(chǎng)景對(duì)象靜態(tài)字段不會(huì)自動(dòng)置空。如果此時(shí)有異步回調(diào)訪問(wèn)單例會(huì)出現(xiàn)“對(duì)象已銷毀但靜態(tài)引用還在”的詭異錯(cuò)誤。我的習(xí)慣是重寫OnDestroy時(shí)把_instance置空并加一個(gè)_isQuitting標(biāo)志位在回調(diào)里判斷。第二個(gè)坑是單例的初始化順序。A單例在Awake里訪問(wèn)B單例如果B還沒(méi)初始化結(jié)果就是空引用。我踩過(guò)這個(gè)坑之后項(xiàng)目里統(tǒng)一規(guī)定所有單例的初始化放在Start或者另一個(gè)管理器的Init流程里禁止在Awake里互相訪問(wèn)。第三個(gè)坑也是最關(guān)鍵的認(rèn)知——單例不是萬(wàn)能的。它在小型項(xiàng)目里好用但當(dāng)你有一堆單例像“音效管理”、“任務(wù)管理”、“背包管理”、“成就管理”它們內(nèi)部還在互相調(diào)用你就等于把全局耦合穿了一條線。所以現(xiàn)在業(yè)界更推薦用依賴注入或服務(wù)定位器來(lái)替代單例至少讓訪問(wèn)關(guān)系顯式化。Unity新版本的Dependency Injection包就是干這個(gè)用的。注意如果項(xiàng)目里單例數(shù)量超過(guò)5個(gè)而且存在互相調(diào)用關(guān)系你就要考慮用服務(wù)定位模式或者DI容器重構(gòu)了。否則后期維護(hù)成本會(huì)指數(shù)級(jí)上升。3.2 狀態(tài)模式與有限狀態(tài)機(jī)角色AI和戰(zhàn)斗流程的最佳搭檔狀態(tài)模式在Unity里的應(yīng)用數(shù)量我敢說(shuō)排第二沒(méi)人敢排第一。Animator Controller本質(zhì)就是一個(gè)可視化有限狀態(tài)機(jī)但代碼層面的狀態(tài)機(jī)依然不可或缺因?yàn)閺?fù)雜的戰(zhàn)斗邏輯、AI邏輯單靠動(dòng)畫層根本表達(dá)不了。我常用的狀態(tài)機(jī)基類設(shè)計(jì)長(zhǎng)這樣public abstract class StateBase { protected StateMachine machine; public StateBase(StateMachine machine) { this.machine machine; } public virtual void OnEnter() { } public virtual void OnUpdate() { } public virtual void OnExit() { } } public class StateMachine { private StateBase _currentState; private DictionarySystem.Type, StateBase _states new DictionarySystem.Type, StateBase(); public void AddState(StateBase state) { _states[state.GetType()] state; } public void ChangeStateT() where T : StateBase { var next _states[typeof(T)]; _currentState?.OnExit(); _currentState next; _currentState.OnEnter(); } public void Update() { _currentState?.OnUpdate(); } }這套設(shè)計(jì)的核心思路是每個(gè)狀態(tài)是一個(gè)獨(dú)立的類狀態(tài)之間的切換通過(guò)ChangeState觸發(fā)新加一個(gè)狀態(tài)不影響已有邏輯只需要AddState并調(diào)用切換即可。舉個(gè)例子一個(gè)普通的近戰(zhàn)單位AI一般就這幾個(gè)狀態(tài)待機(jī)、巡邏、追擊、攻擊、受擊、死亡。用狀態(tài)機(jī)的寫法每個(gè)狀態(tài)的自邏輯內(nèi)聚在一個(gè)類里邏輯邊界非常清晰。如果你需要新增一個(gè)“狂暴”狀態(tài)只需要寫一個(gè)RageState類然后在滿足條件的地方調(diào)用ChangeState ()完事。但這里有個(gè)實(shí)戰(zhàn)中非常重要的細(xì)節(jié)狀態(tài)機(jī)里的狀態(tài)切換條件不能散落在Update里到處判斷。我見過(guò)很多同學(xué)把切換條件寫在每個(gè)狀態(tài)的OnUpdate里結(jié)果狀態(tài)一多切換關(guān)系變成一張亂七八糟的網(wǎng)你根本理不清誰(shuí)是誰(shuí)的上級(jí)。我的做法是把切換條件的判斷集中在一個(gè)地方比如狀態(tài)機(jī)的“Update”里先收集外部事件再做統(tǒng)一裁決?;蛘哂脦А斑^(guò)渡條件”的狀態(tài)機(jī)框架每個(gè)狀態(tài)聲明自己能過(guò)渡到哪些狀態(tài)以及對(duì)應(yīng)的條件委托。另外如果你的需求只是動(dòng)畫切換不是復(fù)雜邏輯切換優(yōu)先用Animator Layer和動(dòng)畫參數(shù)不要用代碼狀態(tài)機(jī)重造輪子。只有邏輯復(fù)雜度超過(guò)動(dòng)畫表達(dá)范圍時(shí)才值得引入代碼狀態(tài)機(jī)。3.3 觀察者模式與事件中心解耦通信的神兵利器模塊通信耦合這個(gè)事是項(xiàng)目規(guī)模上來(lái)之后第一個(gè)爆發(fā)的問(wèn)題。我記得有一段時(shí)間項(xiàng)目里所有系統(tǒng)都持有其他模塊的引用UI要直接調(diào)戰(zhàn)斗模塊的方法戰(zhàn)斗模塊要直接改玩家的血條UI網(wǎng)絡(luò)模塊又要回調(diào)戰(zhàn)斗模塊……有一次改背包上限崩了三個(gè)UI界面排查了半天最后發(fā)現(xiàn)是背包模塊在Awake里調(diào)用了UI模塊的方法而UI模塊還沒(méi)初始化。觀察者模式就是為了解決這種“廣播-訂閱”關(guān)系誕生的。Unity里最直白的實(shí)現(xiàn)就是C#的event或者一個(gè)全局事件中心。我?guī)ы?xiàng)目時(shí)習(xí)慣用后者因?yàn)閑vent在多模塊解耦的同時(shí)也帶來(lái)一個(gè)問(wèn)題監(jiān)聽者的生命周期管理極其麻煩。你訂閱了事件如果忘了退訂或者對(duì)象銷毀了但event列表里還留著引用輕則內(nèi)存泄漏重則調(diào)用已銷毀對(duì)象的委托直接拋異常。我這里提供一個(gè)簡(jiǎn)化版事件中心的思路核心點(diǎn)在于支持“帶參事件”以及“弱引用或安全移除”public class EventCenter { private static Dictionarystring, System.Actionobject _listeners new Dictionarystring, System.Actionobject(); public static void Subscribe(string eventName, System.Actionobject callback) { if (!_listeners.ContainsKey(eventName)) _listeners[eventName] null; _listeners[eventName] callback; } public static void Unsubscribe(string eventName, System.Actionobject callback) { if (_listeners.ContainsKey(eventName)) _listeners[eventName] - callback; } public static void Broadcast(string eventName, object data null) { if (_listeners.TryGetValue(eventName, out var callbacks)) callbacks?.Invoke(data); } }你用的時(shí)候打怪模塊只需要廣播一個(gè)“OnMonsterKilled”事件附帶怪物ID和擊殺坐標(biāo)UI的成就監(jiān)聽者訂閱它音效的監(jiān)聽者訂閱它任務(wù)的監(jiān)聽者訂閱它。模塊之間完全不知道對(duì)方的存在這解耦效果立竿見影。但觀察者模式也有它的軟肋——你很難從代碼里直觀地看出來(lái)“誰(shuí)在聽這個(gè)事件”。有時(shí)候一個(gè)事件被改了參數(shù)所有監(jiān)聽的模塊都要跟著測(cè)一遍漏掉一個(gè)就是線上事故。所以我的建議是事件名不要用模糊的字符串盡量定義一個(gè)靜態(tài)常量類集中管理所有事件名。事件參數(shù)不要用一個(gè)裸的object這樣接收方每次都要強(qiáng)轉(zhuǎn)還容易錯(cuò)。定義一個(gè)事件參數(shù)基類每個(gè)事件有明確的參數(shù)類型。訂閱行為盡量在OnEnable里做在OnDisable里退訂確保生命周期安全。3.4 對(duì)象池模式性能優(yōu)化的必修課對(duì)象池的原理你在leetcode上刷題也見過(guò)——預(yù)先創(chuàng)建一批對(duì)象用的時(shí)候取用完了還回去避免反復(fù)創(chuàng)建銷毀。在Unity里的價(jià)值尤其大因?yàn)镮nstantiate和Destroy的成本不只是CPU還會(huì)造成內(nèi)存碎片和GC壓力在移動(dòng)端上表現(xiàn)非常明顯。我的經(jīng)驗(yàn)是凡是頻繁生成且生命周期短暫的對(duì)象必須進(jìn)對(duì)象池。典型的有子彈、粒子特效、飄字、小怪、掉落物。但也不是所有對(duì)象都需要池化比如一次游戲只創(chuàng)建一次的UI面板池化的收益基本可以忽略。這里給一個(gè)比較通用的對(duì)象池實(shí)現(xiàn)思路public class ObjectPoolT where T : Component { private StackT _pool new StackT(); private T _prefab; public ObjectPool(T prefab, int preloadCount 0) { _prefab prefab; for (int i 0; i preloadCount; i) { var obj CreateNew(); obj.gameObject.SetActive(false); _pool.Push(obj); } } private T CreateNew() { var obj Object.Instantiate(_prefab); obj.gameObject.SetActive(false); return obj; } public T Get() { T obj _pool.Count 0 ? _pool.Pop() : CreateNew(); obj.gameObject.SetActive(true); return obj; } public void Return(T obj) { obj.gameObject.SetActive(false); _pool.Push(obj); } }用起來(lái)也簡(jiǎn)單射擊的時(shí)候從池子里Get一顆子彈設(shè)置位置和方向子彈擊中或者飛出邊界后把自身Return回池子。整個(gè)過(guò)程中不會(huì)產(chǎn)生GC壓力幀率穩(wěn)定很多。不過(guò)有幾個(gè)細(xì)節(jié)得提醒你注意池子里的對(duì)象不要跨場(chǎng)景殘留。項(xiàng)目里如果有場(chǎng)景切換池里的對(duì)象如果掛在DontDestroyOnLoad節(jié)點(diǎn)下場(chǎng)景A的對(duì)象跑到場(chǎng)景B就會(huì)出問(wèn)題。我的做法是場(chǎng)景切換時(shí)清空池子或者為每個(gè)場(chǎng)景維護(hù)獨(dú)立的池子。對(duì)象池不要設(shè)置得太大。預(yù)創(chuàng)建太多對(duì)象會(huì)拖慢啟動(dòng)時(shí)間太少又頻繁創(chuàng)建。我一般取項(xiàng)目里的峰值并發(fā)數(shù)量的1.2倍左右具體數(shù)值靠性能測(cè)試調(diào)。必須做“回收不徹底”的自查。有些對(duì)象被池化后內(nèi)部的協(xié)程、動(dòng)畫、Shader屬性沒(méi)有重置就會(huì)出現(xiàn)“第二發(fā)子彈沒(méi)有特效”“第三次使用后位置不對(duì)”的詭異問(wèn)題。給每個(gè)池化對(duì)象寫一個(gè)統(tǒng)一的Reset方法Get時(shí)強(qiáng)制調(diào)用。3.5 工廠模式對(duì)象創(chuàng)建邏輯的“封裝大師”工廠模式和對(duì)象池天生一對(duì)。對(duì)象池負(fù)責(zé)“復(fù)用”工廠負(fù)責(zé)“創(chuàng)建”。但在Unity項(xiàng)目中工廠模式真正的價(jià)值是——隱藏對(duì)象創(chuàng)建的細(xì)節(jié)屏蔽不同類型的構(gòu)造差異。舉個(gè)例子假設(shè)游戲里有近戰(zhàn)怪、遠(yuǎn)程怪、精英怪、BOSS四種敵人它們的預(yù)制體不同、初始屬性不同、掛載的AI組件也不同。如果每次都在戰(zhàn)斗模塊里寫GameObject go Instantiate(meleePrefab); go.GetComponentMeleeEnemy().Init(level);那么戰(zhàn)斗模塊就要知道所有敵人的細(xì)節(jié)一旦新增一個(gè)“法師怪”你就得跑到戰(zhàn)斗模塊里加一條邏輯這違反了開閉原則。用工廠模式改一版public interface IEnemyFactory { EnemyBase CreateEnemy(EnemyType type, Vector3 position, int level); } public class EnemyFactory : IEnemyFactory { private DictionaryEnemyType, GameObject _prefabMap; public EnemyBase CreateEnemy(EnemyType type, Vector3 position, int level) { GameObject prefab _prefabMap[type]; var enemyObj Object.Instantiate(prefab, position, Quaternion.identity); var enemy enemyObj.GetComponentEnemyBase(); enemy.ReInit(level); return enemy; } }用工廠模式的好處是新增敵人類型時(shí)只需要注冊(cè)對(duì)應(yīng)的預(yù)制體到字典里或者在工廠里加一個(gè)case分支調(diào)用方波次系統(tǒng)的代碼完全不用動(dòng)。這個(gè)設(shè)計(jì)在“系統(tǒng)持續(xù)擴(kuò)展”的場(chǎng)景下省下的維護(hù)成本相當(dāng)可觀。在我合作的某公司項(xiàng)目中他們的怪物系統(tǒng)就是這個(gè)思路策劃在表格里配置怪物類型ID工廠根據(jù)ID從配置表加載預(yù)制體、屬性、AI模塊程序完全不需要為每個(gè)新怪物寫創(chuàng)建代碼。這就是工廠數(shù)據(jù)驅(qū)動(dòng)結(jié)合的威力。實(shí)戰(zhàn)心得工廠模式很容易和對(duì)象池模式混用創(chuàng)建邏輯放工廠復(fù)用邏輯放池子。二者組合后的完整流程是工廠Get對(duì)象時(shí)先嘗試從池子拿拿不到再走Instantiate。歸還時(shí)主動(dòng)回池。這套組合拳打出來(lái)性能和擴(kuò)展性就都有了。4. 商業(yè)項(xiàng)目實(shí)踐記錄從需求到落地的完整過(guò)程拆解4.1 真實(shí)需求場(chǎng)景復(fù)盤某跨平臺(tái)項(xiàng)目曾遇到一個(gè)典型的“模式化開發(fā)需求”我拿這個(gè)案例做一次全流程復(fù)盤。需求背景游戲中有一種資源副本玩法玩家每天可以挑戰(zhàn)三次副本中有若干波怪物怪物死亡后掉落道具副本結(jié)束彈出結(jié)算界面。乍一看這是個(gè)稀松平常的玩法但如果你往深處想會(huì)發(fā)現(xiàn)里面嵌套著好幾層設(shè)計(jì)問(wèn)題第一層波次怪物的生成機(jī)制。每一波的怪物種類和數(shù)量由策劃配置表動(dòng)態(tài)決定有些波次會(huì)混合出三種以上的怪物有些波次會(huì)出現(xiàn)精英怪。而且玩家在打怪過(guò)程中副本內(nèi)部可能會(huì)觸發(fā)“暴走”事件額外生成一波怪。第二層怪物行為的狀態(tài)機(jī)。怪物的行為要區(qū)分待機(jī)、追擊、攻擊、受擊、死亡。每種怪物攻擊方式還不一樣近戰(zhàn)怪近身攻擊遠(yuǎn)程怪保持距離釋放技能。第三層系統(tǒng)通信。怪物被擊殺時(shí)副本計(jì)時(shí)器要更新、任務(wù)系統(tǒng)要計(jì)數(shù)、UI要飄字、音效要播放、成就系統(tǒng)要檢查進(jìn)度。這些模塊之間不能相互硬引用。第四層結(jié)算流程。副本打完之后需要按順序播放勝利動(dòng)畫——發(fā)放獎(jiǎng)勵(lì)——刷新界面——彈出結(jié)算UI期間還有可能被玩家點(diǎn)擊跳過(guò)打斷。4.2 模式選型與架構(gòu)設(shè)計(jì)根據(jù)需求我用一張表把方案的選型邏輯列出來(lái)模塊選擇理由怪物生成工廠模式 對(duì)象池怪物種類差異大但是創(chuàng)建流程統(tǒng)一生成頻率高必須池化怪物行為狀態(tài)模式 FSM行為邏輯復(fù)雜且后續(xù)會(huì)加新怪、新行為狀態(tài)機(jī)天然抗擴(kuò)展跨模塊通信事件中心觀察者模式戰(zhàn)斗、UI、音效、任務(wù)系統(tǒng)互不引用全靠事件解耦副本流程狀態(tài)機(jī)或用UniTask寫流程編排順序邏輯清晰方便插入打斷點(diǎn)這個(gè)架構(gòu)的漂亮之處在于每個(gè)模塊只關(guān)心自己的事。波次系統(tǒng)根據(jù)配置調(diào)工廠生成怪物不用關(guān)心怪物內(nèi)部邏輯怪物死亡時(shí)廣播一個(gè)事件不用關(guān)心誰(shuí)在聽UI和音效各自訂閱事件不用關(guān)心戰(zhàn)斗流程。4.3 核心代碼落地拆解以怪物生成為例我先把關(guān)鍵的生成器簡(jiǎn)化一下。這里要注意的是代碼層面做了兩件很重要的事讀配置表驅(qū)動(dòng)創(chuàng)建以及把業(yè)務(wù)實(shí)體和預(yù)制體解耦。public class MonsterSpawner : MonoBehaviour { [SerializeField] private MonsterFactory _factory; [SerializeField] private ObjectPoolMonsterBase _pool; public void SpawnWave(WaveConfig waveConfig) { foreach (var item in waveConfig.monsterItems) { for (int i 0; i item.count; i) { MonsterBase monster _factory.CreateMonster(item.monsterId); monster.transform.position GetSpawnPosition(); monster.OnDeath HandleMonsterDeath; } } } private void HandleMonsterDeath(MonsterBase monster) { monster.OnDeath - HandleMonsterDeath; _pool.Return(monster); EventCenter.Broadcast(OnMonsterKilled, monster.Data); } }這段代碼的含金量在哪里首先創(chuàng)建怪物交給了工廠把生成邏輯收斂到一個(gè)點(diǎn)其次怪物死亡后自動(dòng)回池不需要業(yè)務(wù)方關(guān)心“回收”這件事最后還有通過(guò)事件廣播把“怪物死亡”這一信息廣播出去UI、任務(wù)、成就自己決定要不要訂閱。代碼整潔度和可擴(kuò)展性都在線。再貼一段怪物狀態(tài)機(jī)的簡(jiǎn)化框架你看下狀態(tài)類內(nèi)部是怎么組織的public class MeleeAttackState : StateBase { private MonsterBase _monster; public MeleeAttackState(StateMachine machine, MonsterBase monster) : base(machine) { _monster monster; } public override void OnEnter() { _monster.PlayAnimation(Attack); } public override void OnUpdate() { if (_monster.Target null || !_monster.Target.IsAlive) { machine.ChangeStateIdleState(); return; } if (!_monster.IsInAttackRange) { machine.ChangeStateChaseState(); } } }這套狀態(tài)機(jī)在實(shí)際戰(zhàn)斗中被驗(yàn)證過(guò)效果近戰(zhàn)怪的“追擊-攻擊-追擊”來(lái)回切換遠(yuǎn)程怪的“保持距離-蓄力-釋放”組合全都靠不同狀態(tài)類的組合實(shí)現(xiàn)邏輯清晰調(diào)試時(shí)用Log打一下狀態(tài)切換就能定位問(wèn)題。4.4 上線后復(fù)盤模式設(shè)計(jì)的收益與成本這個(gè)副本玩法上線后我做過(guò)一次復(fù)盤。收益非常明顯第一后續(xù)加了三種新怪物沒(méi)有改任何戰(zhàn)斗模塊代碼只新增狀態(tài)類和在工廠里注冊(cè)預(yù)制體第二性能抖動(dòng)消失了怪潮生成時(shí)幀率穩(wěn)定第三UI和邏輯徹底解耦策劃調(diào)UI布局不碰邏輯代碼。但成本也有。狀態(tài)類和工廠類的數(shù)量增多文件查找變得困難。為了緩解這個(gè)問(wèn)題我們制定了文件夾組織規(guī)范狀態(tài)類按角色分文件夾工廠類按業(yè)務(wù)模塊分文件夾公共組件放在共享目錄。這些規(guī)范不是設(shè)計(jì)模式教的是項(xiàng)目經(jīng)驗(yàn)沉淀出來(lái)的。5. 常見問(wèn)題排查與避坑技巧實(shí)錄這部分內(nèi)容是我最想分享的因?yàn)樵O(shè)計(jì)模式的書里和文章不會(huì)寫這些全是實(shí)戰(zhàn)踩出來(lái)的血淚。5.1 狀態(tài)機(jī)陷入“狀態(tài)抖動(dòng)”怎么辦最常見的問(wèn)題是所謂狀態(tài)抖動(dòng)State Jitter兩個(gè)狀態(tài)之間的切換條件同時(shí)滿足導(dǎo)致同一幀內(nèi)反復(fù)切換。比如追擊狀態(tài)切攻擊狀態(tài)的時(shí)候攻擊距離判斷邊緣正好抖動(dòng)角色就會(huì)瘋狂抽搐。我的解法加一個(gè)“最小切換間隔”狀態(tài)機(jī)內(nèi)部記錄上一次切換的時(shí)間如果距離上次切換小于一定幀數(shù)直接忽略切換請(qǐng)求。另外狀態(tài)進(jìn)入時(shí)把條件“鎖住”一幀避免OnEnter內(nèi)部立刻觸發(fā)條件判斷。5.2 事件中心導(dǎo)致的對(duì)象泄漏前面用了事件中心后還有個(gè)經(jīng)典的坑UI面板關(guān)閉時(shí)如果忘了退訂事件閉包會(huì)一直持有面板的引用。這時(shí)候你在場(chǎng)景里隱藏了面板但內(nèi)存里它永遠(yuǎn)活著重復(fù)打開關(guān)閉十幾遍內(nèi)存飆到爆炸。排查思路很直接注冊(cè)中心在Subscribe的時(shí)候記錄訂閱對(duì)象的TypeUnsubscribe檢查一次?;蛘咧苯訉懸欢未a在Editor模式下定期掃描所有事件監(jiān)聽器的引用對(duì)象是否已被銷毀。我現(xiàn)在的項(xiàng)目里甚至上線了一個(gè)“事件泄漏報(bào)警器”開發(fā)模式下打印警告。5.3 對(duì)象池“回收不干凈”導(dǎo)致數(shù)據(jù)錯(cuò)亂池化的對(duì)象復(fù)用后如果內(nèi)部有上次使用殘留的數(shù)據(jù)就會(huì)產(chǎn)生各種幽靈Bug。比如怪物的血量沒(méi)重置第二次出來(lái)只有50%血子彈的方向還是上一次的發(fā)射角度全錯(cuò)。解決方式是強(qiáng)制約定一個(gè)IReset接口所有池化對(duì)象必須實(shí)現(xiàn)。Get的時(shí)候調(diào)用一次ResetReturn的時(shí)候調(diào)一次。這個(gè)接口不能省省了就是給自己埋雷。5.4 過(guò)度設(shè)計(jì)的邊界感最后想聊一個(gè)和設(shè)計(jì)模式本身關(guān)系不大但又密切相關(guān)的實(shí)操問(wèn)題怎么判斷當(dāng)前需求值不值得應(yīng)用設(shè)計(jì)模式。我的判斷標(biāo)準(zhǔn)有三個(gè)如果這個(gè)功能寫死就再也不改直接用最簡(jiǎn)單的方式別上模式。如果需求文檔里明確出現(xiàn)“后續(xù)會(huì)有多種…”“未來(lái)要支持自定義…”那值得上模式。如果團(tuán)隊(duì)里其他人對(duì)這套模式不熟悉你需要先花半天時(shí)間做一個(gè)培訓(xùn)分享否則代碼寫出來(lái)沒(méi)人能維護(hù)。設(shè)計(jì)模式是團(tuán)隊(duì)的溝通語(yǔ)言不是個(gè)人炫技的資本。一個(gè)人寫得飛起全組看不懂這個(gè)成本比代碼本身的結(jié)構(gòu)問(wèn)題更致命。6. 最后分享我的幾個(gè)習(xí)慣項(xiàng)目做多了其實(shí)能沉淀下來(lái)的方法論就那么幾條。我個(gè)人的體會(huì)是設(shè)計(jì)模式的運(yùn)用不是靠背而是靠一次次重構(gòu)練出來(lái)的。你第一次寫一個(gè)戰(zhàn)斗系統(tǒng)可能全是if-else第二次寫的時(shí)候發(fā)現(xiàn)相同邏輯出現(xiàn)多處自然而然就抽出了狀態(tài)機(jī)第三次再遇到類似需求你會(huì)直接開始規(guī)劃狀態(tài)接口——這個(gè)過(guò)程就是“模式化思維”的養(yǎng)成。另外一個(gè)很實(shí)用的建議每次做技術(shù)方案選型的時(shí)候把你選擇的模式名稱寫進(jìn)代碼注釋里。比如在類注釋上寫“Class: MonsterStateMachine此處使用狀態(tài)模式管理怪物行為便于后續(xù)擴(kuò)展新狀態(tài)”。這能幫你和后來(lái)的維護(hù)者快速建立上下文比單獨(dú)寫一份文檔有用得多。對(duì)了還有一個(gè)小技巧Unity的新版本內(nèi)置了部分設(shè)計(jì)模式的官方實(shí)現(xiàn)思路比如Addressables里的資源句柄思想和對(duì)象池思路是互通的。你學(xué)設(shè)計(jì)模式的時(shí)候如果能跟引擎底層的實(shí)現(xiàn)方式對(duì)上號(hào)理解會(huì)深很多。比如協(xié)程本質(zhì)上是一個(gè)迭代器模式ResourceManager的資源加載本質(zhì)上是一個(gè)代理模式AssetBundle的依賴關(guān)系本質(zhì)上是組合模式。最后回答一個(gè)很多人會(huì)問(wèn)的問(wèn)題設(shè)計(jì)模式要學(xué)到什么程度才能進(jìn)商業(yè)項(xiàng)目我的答案很簡(jiǎn)單——不要求你會(huì)背二十三種模式的全部定義但以下六種必須能熟練寫出且講清原理狀態(tài)、觀察者、單例、工廠、對(duì)象池、命令。這六種覆蓋了我遇到的大概80%的業(yè)務(wù)場(chǎng)景。其他模式遇到了再學(xué)帶著問(wèn)題學(xué)得更快。就寫到這里希望對(duì)正在做Unity開發(fā)的你有點(diǎn)幫助。模式這東西用起來(lái)才是你的光看文章永遠(yuǎn)都是別人的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91精品无码人妻系列| 亚洲欧美在线丝袜| 色色色五月婷婷| 国产91美女视频| 69精品在线| 777琪琪午夜免费A片| 91黑丝操| 国产女人9999| 天天日日本| 探花精品视频| 18禁无码永久免费无限制| 少妇三P| 日韩女模中文造逼| 性色AV蜜色av色欲av| 骚人妻少妇视频| 黑丝内射一区二区三区| 国产精品激情久久久久久久| 美女被啪到深处抽搐视频| 久久综合女优| 青青青操| 中文字幕在线观看视频www| 97久久综合网| 天天日美女的B| 搡老女人老91妇女熟女| 久久久久久久久九九久孕交| 91美女丝袜诱惑视频| 亚洲欧美高清无码| 久久久一区二区| 日本精品88888888| 色香阁在线| 欧洲熟妇xxXx欧美老妇裸体 | 91欧美高清| 爽极品影院| 中文操逼字幕| 亚洲精品九九九| 综合网97| 99re在线视频这里只有精品| 97超碰这里只有精品| 精品国产72| 日本不卡三级网在线播放| 亚洲综合色网| www.婷婷六月天| 乱伦系列一区二区| 亚洲操逼无码| 日韩av影片在线观看| 91搞逼视频| 蜜臀久久99精品久久久久久酒店 | 99自拍视频在线观看| 国产自产一区视频在线| 国产操偷| 亚洲成人免费电影| 亚洲va综合va国产va中文| 久久久久国产精品片区无码直播| 家庭乱伦国产精品| 八戒午夜福利理论片| a片自拍直播视频| 热99这里有精品综合久久| 色噜噜狠狠色综无码久久合欧美| 精品传媒在线一区| 一区二区视频在看| 亚洲精品97久久| 校园激情狠狠四射| 先锋影音av先锋一区| 91人妻熟女| 另类天堂| 欧美v亚洲v日韩v最新在线二区| 国产亲戚伦亲在线| 五月婷婷丁香六月| 91模特在线观看| 懂色AV网| 美国精品国产精品| 国产免费永久精品无码| 婷婷五月天av| 欧美91网站| 超碰色美女| 东京热大香蕉| 91处女在线观看| 91久久| 蜜乳视频网站| 久久人妻精品| 性色av一区二区| 蜜区区视频79| 88xx成人精品视频| 久热69九色熟妇97| 五月开心久久AV官网| 97网站在线观看| 日韩97在线| 黄色av网站在线播放| 亚洲成人久久一区二区| 2020视频1区2区3区| 国产有码一区| 久9爱经典视频| 欧洲人妻视频| 最新日韩黄片| 国产福利夜| 婷婷丁香人妻| 福利在线黄片| 后入内射蜜桃臀| 色偷偷综合91久久噜噜| 国产精品嫩草久久久久| 欧美极品女人的天堂| 97视频900| 五月婷亚洲精品天堂| 国产又粗又长又爽又色| 九九九九九九成人| 99999re| 欧美性爱十八禁| 日本免费不卡二区| 91日韩| 最近的最新的中文字幕视频| 精品国产国产AV| 91亚州| 亚洲国产日韩欧美熟妇在线| 欧美色图91p| 日本性爱视频一级| 欧美天堂日韩三级国产传媒| 9Ⅰ超碰| 美女国产一区二区久久| 日韩av电影网站| 日韩黄色av中文字幕| 黄色乱论网站| 97亚洲欧美| 国产亚洲色婷婷久久99精品91| 韩日精品福利视频一区不卡在线免| 久久这里只有精品9| 国产精品自产拍在线观看社区| 欧洲乱码视频| 伊人网青青| 久久综合日韩亚洲欧美| 婷婷在线视频在线观看| 欧美综合第一| 98人妻精品一区二区色欲| 欧美综合骚| 五月天日日操夜夜操| 黄色AV免费| 欧亚在线视频| 欧美色视| 91人人看| 操逼逼福利视频| 中文字幕久久亚州无码| 成人一道本免费视频| 91蜜臀在线久久久久| 99热精品在线观看| 久久99热这里只频精品6学生| 99日免费视频中文字幕| 蜜乳AV色欲AVAV无码| 另类老少妇| 日本在线激情一区二区三区| 日韩内| 午夜免费视频1000| 成人性爱电影一区二区| 五月丁香激情四射| 精品美女在线视频| 熟女五十路一区二区三| 亚洲综合色在线| 亚洲砖码砖专无区2023| 九九九九AV| 91精品国产综合久久久蜜臀| 老熟女乱伦片| 亚洲激情欧美色图| 啪啪啪大香蕉| 青娱乐亚洲自拍| 九九九九九九免费视频| 久99热| 大JI巴好深好爽又大又粗视频| 午夜福利久久久噜久噜久久综合 | 亚洲色图超碰在线| 无码国产Av| 日本一级不卡一二区| 强奸乱亚洲| 亚洲色图A| 国产精品九9| 一级@啪啪视频| 久久精品人妻一区二区三区| 人人喜人人妻| 欧美系列在线一区二区| 欧美亚洲激情| 亚州国产成人精品女人久久 | 亚洲精品丝袜| 亚洲Av无码成人精品国产| 超碰97伊人| 亚洲AV乱码专区国产噜噜亚洲 | 啊…啊…操我用力操我| 亚洲欧洲综合成人av一区| 超碰到97情色| 四虎国产成人精品免费一女五男| 日韩成人电影AV| 日本高清免费一本视频在线观看| 久久99草| 中文字幕在线观看网页| 亚洲第一综合| 激情啪啪拍91| 国产乱伦亚洲| Av手机版天堂网| 亚洲综合色图欧美| 91高跟美女在线播放| 久久婷婷视频| 色伊人91| 天堂v无码免费视频| 91亚洲网站| 日日摸日日碰| 国外91| 久久超碰、| 欧美丰满熟妇XXXX性ppX人交| 人人搞人人插人人操| 欧美九一精品久久久熟妇| 99re不伦| 亚洲美欧999| 91蜜臀在线久久久久| 人妻99p| 一牛影视成人片免费| 91AV入口| 色黄污美女啪啪啪免费网站| 91视频精品| 亚洲欧美清纯| 五月丁香激情四射| 亚洲男人天堂av| 亚洲欧美黄| 日韩十八禁| 综合色欧美| 91青青在线| 黄页网站成人免费| 新怡红院| 91操熟女视频| 好涩综合| 一起草欧美| 日本三级A片网站com| 香蕉国产精品麻豆亚洲欧美日韩| 亚洲日韩人妻中文字幕一区| 精品无码久久久久久久杏吧| 少妇厨房愉情理伦片bd在线观看| 69少妇一区二区| 精品高清av中文字幕| 1000部熟女视频在线观看| 无遮挡男女激烈动态图| 中国农村熟妇毛片视频| 无码日韩网站| 欧美日韩国第一区| 伊人 俄罗斯 a v| 是还免费视频1727我| 激情小说亚洲图片| 99国产精品久久久在线播放| 久久精品99久久久久久| 99福利社| 好爽免费视频| 亚洲AV成人精品网站在AV| 人妻少妇久久中文字幕一区二区 麻豆| 欧美高清18A片| 午夜乱轮操逼视频免费看| 日韩乱伦AⅤ| 国模少妇一区二区三区| 校园春色制服丝袜中文字亚洲 | 一本色道久久天天射天天干| 亚洲一区二区性爱电影| 婷婷激情五月| 久久精品无码熟妇一区二区三区视频导航 | 把腿张开老子CAO烂你| 国人欧美精品一区二区| 人妻少妇蜜桃视频欧美一区| 久久伊人青青草| 亚洲天堂久| 亚州欧美色图| 动漫爆乳3D奶水一区在线观看| 亚洲激情网一二三四区| 欧美日韩大陆黑人少妇99| 麻豆区久久久久亚| 男女啪啪啪18禁网站| 亚洲 日韩 丝袜 熟女 变态| 色乱二区| 日本少妇va7777| 欧美精品,四区。五区| AV中亚| 亚洲成熟国产精品美女| 一区二区三区四区五区高清无码永久视频| 欧美黑人日韩少妇色情| 久久在线观看免费视频| 九色婷婷| 欧美色综合图片| 日本女人久久久| 高清无码 国产精品| 狠狠狠狠狠| 国产AV人人夜夜澡人人爽麻豆| 又大又大又大又粗爽高潮观看 | 国内精品a| 久久精彩免费视频| 久久久久白虎| 欧美日韩国产色图在线| 殴美日韩m| 日韩九九九| 丰满人妻一区二区三区大胸懂色| 久久久久七视频| 偷拍盗拍亚洲色图图片| 操逼网站视频漫画国产| 91激情网| 欧美一级久久久久久久大片动画| 欧美狠狠弄| 啊啊啊在线观看| 九九黄色网| 超碰97首页| 中文字幕乱在线伦视频中文字幕乱码在线 | 中文有码第五页| 高清无码人妻久久久一区二区三区aⅴ| 亚洲最大的综合性av| 久久只有精品一区二区三区| 蜜乳AV.COM| 夜夜操天天肏| 国产福利视频精品视频| 9精品久久| 久草视频观看视频在线| 色欧洲97| 激情四射五月天| 99久在线精品99re8蜜桃| 亚洲一本色道中文无码aV天美| 97 国产一区| 日韩三级在线观看网站| 91网亚洲| 欧美十八禁网站| 东北操逼| 婷婷丁香六月| a片自拍直播视频| 久草资源在线视频官方总站日韩丝袜美腿 | k频道色撸撸| 成人麻豆av电影网站| 久久同城AV| 黄网色一区二区三区四区精品| 亚洲日韩黑丝| 一区二区三区在线资源| 亲子敌伦对白在线播放| 综合天天网| 人妻一区视频| 制服丝袜第二页| 国产亚洲日本精品在线| 日韩99999| 美腿色图| 干干干天天| a片亚洲一本通视频| 国产成人免费观看在线视频| 深喉吞精| 99啪啪视频| 亚洲暴力强奸AV| 大香蕉中文网| 美女91在线观看| 欧美强奸乱能| WWW.操逼.COM| 91操熟妇| 9久久美女首页| 成人在线视频网| 91天天看| 亚洲综合草草| 尤物av网站| 日本三级R| 夜草网站| 精品国产乱码久久久久久久久久毛片 | 亚洲av强奸乱伦| 欧美牲| 免费超碰97久久| 成人 日韩欧美一区| 欧美躁死她一区二区| 一级性爱视频免费观看 | 久久曰曰| 亚洲色图激情小说| 一本一道vs波多野结衣| 亚洲欧美黄| 国产精品在线一区二区| 国产精品免费日韩| 校园春色综合网| 欧美九一精品久久久熟妇| 久久老子无码午夜伦不卡| 性色AV网站| 91天堂丝袜美腿| 性性久久| 97干天天| 黑丝91视频| 精品区国产区一区二区三区| 亚洲小电影免费涩涩成人在线高清 | 超碰色97| 裸体1区| 九九热免费国产视频婷婷伊人| 日韩性爱免费视频在线网站| 亚洲资源一区| 人妻蜜桃臀| 99精品伊人| 殴美性色a级欧美| 91久| 人人扣人人操| 亚洲欧洲久久天堂| 久久禁| 久久99干一本高清| 日韩精品-原创伙伴| 超碰在97| 日日噜噜夜夜久久亚洲一区二区| 亚精品无码毛片一区二区三区| 国产久久日韩网站导航| 久久精品免费| 99999国产| 亚洲在线a| 色网1| 可乐操亚洲蜜911| 亚洲av性爱电影| 尤物网址| 日本精品无码三级网站| 午夜福利精品| 国产美女高潮| 日韩福利综合一区| 激情啪啪拍91| 国产无马av| 国产在线视频二区| 日韩性爱人人爱人人操| 新版天堂中文资源8在线| 欧美国产精品久久九九| 伊人久久国产免费观看视频| 午夜精品99久久久久传媒| 男人的天堂网页| 中文字幕在线免费观看| 天天日熟妇| 夜夜福利| 日韩精品9区| 秋霞午夜视频一区二区| 麻豆天美国美国产AV| 国产精品一二三区福利| 五月天综合| 欧美一级A一级a爱片久久| 久久综合九色综合欧洲98| 国产按摩一区二区三区| 国产精品操| 九九九九久久久| 嗯嗯嗯啊啊啊在线免费观看| 人妻在线大香蕉| 97精品97久久| 夜夜躁狠狠躁日日躁av| AAAA欧美日韩| 性爱乱伦视频免费| 日本国产成人亚洲精品无码| 欧美精品另类人妖xxxx| a片亚洲一本通视频| 国产后入式在线观看| 夜夜爽夜夜| 九九精品无码专区免费| 亚洲各类熟们中文字幕| 97资源超碰| 久久久久9999精品九九九| chaopen97久久| 一级免费精品| 人妻色偷色噜| 亚洲一本大道中文字幕无码在线| 91精品电影18| 亚洲欧美啪啪| 性爱视频免费网址| 日本在线一二| 亚春色色| 家庭乱伦网站国产| 国产熟女一区二区丰满| 青青草好吊色| 日本午夜久久电影| 天美传媒av一区二区| 欧美Ⅴ性爱| 久热大香蕉| 中文字幕人妻色偷偷久久皮 | · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | www.91逼逼.com| 婷婷五月天影院| 偷拍欧美激情| 91观看 国产白丝| 免费精品中文字幕| 看黑丝美女操逼青青网站| 日韩本不卡视频在线观看| 2018天天干在线视频| 欧美日韩m| 另类图片五月天| 国产一区在线观看无码AV| 青青青操| 无码人妻精品酒店| 丁香六月婷婷| 超碰 欧美| 欧美精品69性爱| 青草视频在线看看看看看看看看看| 午夜无码熟妇丰满人妻| 欧亚成人| 天天躁狠狠躁av| 操人人| 亚洲综合888| 国产精品视频内谢女人| 久久最新免费视频23| 亚洲中文字幕久久无码精品| 天天视频黄网站| 亚洲黄色网址| 久久久精品视频免费观看| 国产精品午夜福利视频| 欧美日韩国产高清在线一二三区| 97超碰中文| 色噜噜精品一区二区三| 日韩精品国模| 国模少妇一区二区三区| 黄色交缠性感爆操91国产精品免费一区二区三区 | 新版天堂中文资源8在线| 黄久在线| 亚洲图片欧美在线视频| 日本媚薬中文字幕在线| 性站| 看免费的黄片| 国产精品久久久九九九| 免费在线观看AV无码网站| 情色五月天就去干| 伊人91| 热99re69精品8在线播放| 老女人爆菊| 精品无码久久久久久久杏吧| 欧美成人色| 日本性交操一区二区不卡系列| 伊人伊人LD| 国产男人又猛又粗又爽| 青青操在线视频| 日本亚洲vr欧美不卡高清专区| 国产精品黑人一区二区三区| 偷窥自拍亚洲色图| 欧美国产欧美在线观看| 97se亚洲综合自| 农村少妇久久久久久久| 四月丁香婷婷| 国产精品岛国片在线观看| 天天欲望网| 国产夜夜操| 围产精品一区二区三区视频播放| 天天射夜夜骑| 色www精品视频在线观看| 国产高清免费不卡av| 亚洲人精品久久久| 亚洲狼狼干综合1| 欧亚性爱视频免费看| 久久久久夜夜夜夜| 97超碰人操| 大香蕉碰碰| 亚洲人妻在线一区| 国产精品视屏| 亚洲丝袜99| 国产精品91一样| 成人性爱高清视频免费看| 国产高清自拍| 日韩内| 97超碰在线资源网站| 天堂岛av| 秋霞曰韩R级| 亚洲欧美色图小说| 久久无码精品| 男人天堂无码| 91国产丝袜足交精品视频| 99日精品欧美国产| 久久九九视频九九视频| 国产 日韩 欧美一区| 久久是精品| 久久免费精品96| 91麻豆天美国产欧美| 99re公开精品免费视频| 9国产超碰| 天干天干天干天天做| 日本男人插女人的逼黄色| 亚码激情| 亚洲无码久久久久久久| 性影在线视频| 中文字幕在线观看永久| 另类图片欧美激情综合| 少妇熟女一区二区三区| 91操熟女视频 | 欧美一二三级精品在线| 一级乱伦网站| 精品国产Av无码久久久伦古装| 四虎精品亚洲| 国产一区二区三区,在线观看观看| 2025亚洲男人天堂| 无码人妻一区二区一牛影视| 一本一道人妻久久一区二区三区 | 中文久久96| 综合天天网| a人欧美综合天堂麻豆| 欧美 青青草| 久久亚州高清| 青青草精品| 亚洲色图91欧美日韩| 欧美亚洲另类在线蜜桃| 国产久久av| 色爱三区| 26uuu性| 国产麻豆福利av在线播放| 久久东京伊人一本到鬼色| 免费自拍三级综合| 国产一区二区在线电影| 久综合网| 九九久久久久久爱| 今日头条成人一区二区三区四虎精品| 99xav| 久久精品91| 亚洲图片欧美另类综合免费视频大大香| 本道在线| 野狼福利社区| 強姦亂倫a| 99性爱在线观看| 韩国一级婬片A片AAAAA| 91精品伊人久久久大香线蕉91| 欧美日韩国内不卡| 天美精品av| 91骚妇| 欧美青青草视频| 亚洲欧洲日韩中文字幕一区| 天美传媒精品一区二区| 国产精品爱欲| 在线视频日韩欧美国产| 97九色人妻| 伊人操操| 欧美综合1性辶| 日本成人在线不卡一区二区三区| 小日子操bb在线看| 色婷五月| 诱惑人妻欧美一区在线播放| 久久久性少妇| 日本孕妇一区二区视频操逼免费看 | 欧洲自拍色图gif在线| 超碰综合97在线| 97国产精品| 久久毛卡| 夜夜高潮夜夜爽| 久久久天美| 百度百度日本操逼| 日本岛国黄色网址| 第四色亚洲色图| 99re28在线观看| A 在线网址| 色九九九九久| 欧美精品欧美精品系列 | 日产国产精品中文久久婷婷| 精品无码一区二区人妻久久蜜桃| 搡老女人老91二区| 亚洲一卡2卡3卡4卡乱码网站| 99精品丰满人妻无| 蜜臀在线网站| 这里只有精品视频在线观看麻豆 | 日日干夜夜操视频h| 超碰97在线中文| 探花精品 一区二区| 欧美Aⅴ| 99色在线| 色欧美在线| 亚洲成a人片在线观看中文!!!| 久久国产99精品72福利| 一级AAA片一区二区三区| 日本视频一区二区三区| 天天干天天日天天射黄色大片| 亚洲欧美清纯| 极品尤物自安慰| 天天舔天天 | 欧美日韩一区二区三区四区蜜桃| 五月天激情小说网| 欧美性第1页| 人妻 中文 日韩| 国产熟女少妇一区| 青娱乐91| 七久久久| 欧美色图 色综合图| 激情视频网址| 1024午夜激情男人的天堂| 99re久久| 狂操嫩妻视频一区二区三区| 亚洲精品电影| 五月激情在线| 78超碰| 插入综合网| 日韩欧美~中文字| 久热香蕉精品在线视频| 肉丝无码中文高清| 18禁超污无遮挡无码免费网| 试看60秒| 日本123区操B视频| 九久久九九久视频| 69精品人人人人| 嗯嗯啊啊视频一区二区三区| 国产AAAAAABBBBB| 经典丝袜一区| 天天日夜夜| 黄片qw| 九九人妻| 欧美日韩夜夜| 人妻系列无码专区中文有码| 97久久超碰日韩精品| 欧美日韩人人精品| 东北丰满熟女国产一区| 99久久99九九99九九九| 97 国产一区| 免费黄色A片| 少妇久久久| 91九九九吃| 日韩人妻资源网| 欧美一级久久久久久久大片动画 | 久久成人午夜精品影院| 久久中文字幕在线观看| 国产少妇高潮| 偷拍 精品另类 凸凹了四区| 精品成人无码| 亚洲欧美另类图片| 日韩久草| 性欧美体内射精| 一区在线观看中文字幕| 亚洲欧美色图小说| 日逼97| 91 国产丝袜在线播放-百度| 欧美专区第一页| 国产无码一二三区| 国产中文字幕在线点播| 午夜一区| 91网站在线播放| 啊啊啊啊啊好大好舒服想要| 热久久这里只有精品| 人人妻人射| 久久久久久99AV无码免费网站| 91在线一起| 91天美传媒在线观看| 爱射综合| 色婷婷小说| 日韩丝袜二区| 成人七区| 牛牛操视频逼| 97超碰人人操人人操| 欧美熟妇色| 大香交| 91碰碰| 九九九九97| 精品美女少妇一区二区三区| 久久色一区| 精品妇女一区二区三区| 超碰在线人妻| 国产成人精品亚洲日本| 日逼国产| 日本性爱网址| 亚洲色图日韩精品| 在线a v| 91在线视频观看国产| 亚洲激情在线观看一区| 思思热在线视频免费| 神马久久久久久| 亚洲 国产 精品一区| 一级黄色视频网| 翔田千里AⅤHD无码| 精品人妻一区二区三区四区石在线| 91亚洲欧洲| 大色综合| 呦呦一区| 国产又猛又粗又爽又黄| 成人免费毛片| 26uuu国产日韩综合在线观看| 一本大道不卡一二三区| 一线黄色免费性爱片| 日韩国产乱子伦App| 亚洲一区二区三区AV无码 | 精国久久一区二区三区98| 老女人老91妇女老热女| 日韩国产九九精品一区二区三区毛片| 校园春色家庭伦理欧美激情| 日本五区不卡| 中文字幕乱码在线观看| 亚洲综合91| 中文字幕,人妻,日韩| 国产AV久久野战精品| 亚洲激情在线一区二区| 国产精品色| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 奇米四色影视777久久久| 18禁美女裸体无遮挡啪啪| 日本国产欧美高清在线| 色五月网址| 超碰97资源大奶| 91嫩草在线| 丰满人妻-区二区三区免费看 | 大香蕉伊人久久| 91人人看| 亚州国产成人精品女人久久| 风韵犹存大大大大香蕉| 国产亚洲色停停久久99精品91| 免费看黄视频亚洲网站| 六月婷婷综合| 岛国小电影| 黑人干亚洲| 东京热男人的天堂| 国产人妖视频一区在线观看| 91超碰人人操| 裸模AV女优| 日产精品久久久一区二区| 超碰97久久| 老司机射| 97欧美精品综合| 色婷婷日韩精品一区二区三区| 亚洲 暴爽 AV人人爽日日碰| 成年女人黄网站| 欧美日韩国产中文超碰| 久久久久久久9最新免费视频观看| 国产熟女一区二区| 欧美不卡二区| 射丝袜高跟鞋99| 91天天爽| 岛国网址国产| 超碰超碰95| 青青草中日韩在线| 欧美A片中文字幕| 婷婷丁香熟妇综合网| 操一区| 欧美色图片| 狠狠操综合| 日韩精品9区| 国产无马在线| 在线观看AV不卡| 日日玩天天干| 性色生活片久久毛片婬片免费放女人一级毛片 | 亚洲第一页欧美| 夜夜欧美 | 日日干日日操五月天伦理视频| 舔人妻中文免费视频| 日本欧美一区二区三区视频麻豆| 亚洲天堂区| 久久久无码精品人妻二区| 成人a大片在线观看| 超碰午夜在线| 亚洲精品久久久久毛片A片拉屎| 日韩女模中文造逼| 看看日B真人视频| 思思热免费在线视频| 麻豆乱码久久精| 少妇久久久| 亚洲情色电影网| 精品亚洲天堂| 日本三级韩国三级99| 日日躁天天躁狠狠躁| 小情侣高清国产在线视频| 伊人伊人LD| 亚洲色系另类精品国产| 亚洲淫乱骚妇AV| 欧美大香蕉久| 99国产精品久久久久久久成人热| 亚洲麻豆av一区二区| 人妻天天操天天爽视频免费| 九九草| 欧美日不卡| 国产精品免费久久久久久久久久| 人妻激情偷乱视频一区二区三区 | 懂色AV一区二区三区| 91精品国产一区三一| 婷婷五月花| 精…码一二三区| 99丝袜福利在线播放| 亚洲日韩天堂| 精品人妻一区二区三区-国产精品| 九九无码| 色噜噜人妻丝袜AV资源| 日本日逼高清| 美女骚尻视频| 99视频在线| 98久久| 九九成人精品| 成人亚欧免费视频| 人妻丰满熟妇av无码区蜜桃| 97久久视频| 啊啊啊好想要| 美女主播色欲91抠b在线播放| 亚洲导航深夜福利| 91影库| 欧美日韩另类字幕中文| 国产日本久久免费精品| 色综合天天爱去电影网| 国产在线不卡导航| 国产乱色国产精品免费视| 俞拍自拍| 天综合网| 男女性感激情网站| 国产91美女视频| 久久av网| 国产精品久久伊人| 久久久新亚洲AV| 亚洲精品蜜桃久久久久久久| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 久久超碰大香蕉| 性色亚洲| 日韩欧美一级特黄大片| 亚洲AV成人无码久久精品播放| 精品女人999| 国产精品永久免费10000| 熟女91网| 嗯嗯,啊啊,国产精品| 精品偷拍13p欧美dodk视频| 好湿好紧视频| 97se综合网| 日本3级一区二区免费| 人人么人人操| 天天综合网亚洲综合网| 密臀在线免费观看| 国产女人成人精品视频| 人人操 欧美| 欧美在线亚洲| 精品九九九九九九九九九| 热久久这里只有精品| 日本不卡高清视频| 91亚洲综合| 午夜操操操| oumeizonghese,www| 激情小说五月天| 久久亚洲AV无码专区国产精品| 国产传媒日韩欧美| 亚洲综合色在线| 自拍丝袜美腿人妻| 九九热在线精品视频| 人妻一区视频| 另类亚洲一区二区三区| 久久久久久久| 老司机福利社视频在线观看| 91天天综合网,天天综合网| 激情五月天综合网| 性爱乱伦一区| 手机在线播放国产福利| 日本精品一级二级三级| 久久久久久九九九九九| 91亚.色| AV99热18这里只有精品| 欧洲Au麻豆| 亚洲色鬼| 欧美操逼一二三区| 99久久网站| 中文字幕精品区先锋资源| 国产精品一区二区校花| 亚洲AV麻豆Aⅴ无码电影一 | 久久人人爽爽人人爽人人片αV| 操逼操逼操| 97欧美综合| 91bbbbbb| 精品人妻一区二区免费看| 日日AAvv| av橘色网站| 亚洲乱熟女一区二区| 9ⅰ久久久天天| 欧美色图在线视频少妇| 中文欧丝袜诱惑| 久偷拍欧美日韩三区| 一区,二区,三区视频| 操操操操网黑人| 日本不卡二三区| 99热免费精品| 麻豆精品天美| 久久草视频污视频| 日日碰视频网| 一本一道久久综合久久| 少妇九九九九| 欧美碰碰综合色| 日日躁夜夜躁狠狠躁超爽| 欧美精品庄| 亚洲色人| 亚洲欧美日韩制服另类| 亚洲熟伦熟妇AV无码春色| 手机午夜电影神马久久| 国产精品无码久久久久2025| 精品久久久久av影院| 欧美东京热精品A∨| 伊人五月天| 99在线精品视频| 久久免费老司机精品| 大香蕉 222| 98精品国产乱码久久久久久| 日韩人妻精品| 久久久涩| 热99这里有精品综合久久 | 加勒比色综合| 蜜臀AV一区二区三区| 亚洲97综| 性爱免费视频成人| 国产 丝袜 欧美中文 另类| 六月丁香网| 蜜桃视频精品一区二区三区| 婷婷五月天无码| 亚洲综人网| 亚洲国产成人精品女人久久久| 少妇熟女1区2区3区| 国产AV无码AV| 九色 人妻 大香蕉| 日韩美女高潮喷水视频| 麻豆一区二区AV天美| 久久久久久网址| 操逼片中文| oumeisetu综合| 91路www| 啊啊啊啊啊啊在线| 99国产在线 精品 视频| 九九色热| 天天澡天天爽日日av| 欧美伊人电影| 精品毛片av一区二区 | 极品另类| 黑人嘿嘿嘿超爽免费视频| 大奶啊啊好爽| 91色色综合| 亚洲综合第一页| 日韩人妻 中文字幕| 国产久久一区二区午夜| 精吧天堂| 欧美v亚洲v综合v国产v妖精| 无遮挡h肉动漫在线观看| 久久伊人在线五区| 久久青娱乐| 三级AV入口| 超碰调教97| 免费男人的天堂| 日韩人妻有码免费视频| 亚洲夜色在线| 久久精品国产97欧美精品亚洲 | 丁香九月婷婷| 久久精品国产亚洲AV成人直播| 日本丝袜美腿人妻九九| 欧美九九九| 国产区性爱在线视频秋霞豆 | 久久超碰国产一区二区三区| www.狠狠| 久久精品六区| 色婷婷激一区二区三区 | 亚洲综合999| 色噜噜狠狠色综合日日| 久久久91福利姬| 欧美一区二区三区互相| 91久久精品国产| 4虎在线观看| 激情综合五月丁香| 国产日韩中文字幕欧美| 黄片免费久久久久久久| 大香网伊人久久综合网eew| 国产强奸乱伦欧美| 久久一二三四五六七八九区| 激情网色| 素颜老阿姨乱情色| 一起草欧美| 夜夜人妻爽| 国产综合在线视频网站| 久久e6只有精品| 欧美v日韩v亚洲v最新在线| 国产av尤物| 美女网站91| 能看的av| 色香综合| 欧美极品女人的天堂| 成人性交免费视屏| 五月婷婷综合网| 日韩人妻无码不卡网站| 五月激情小说| 国产传媒一区二区三区| 91丝袜美女国产| 亚洲色图一区二区三区| 天天综合精品| 一起草三级AV电影在线观看 | 1000午夜黄色| 逼逼逼逼操操操操操操操操操午夜剧场| 中 文字幕一区二区三四 五 区日 日 骚| 久久在线观看免费视频| 东京成人一区| 家庭乱伦性爱av| 久久久内射良家| 中文字幕一区二区三区视频播放| 人妻另类| 黑操B| 国产无吗在线播放| 欧美97视频| 在线性黄高清免费视频| 国产激情在线| 欧美亚洲性爱一区二区| 级做a爱无码性色永久免费| 日本最新免费韩国1区2区视频播放| 911av网站免费观看| 91精品少妇搡搡搡| 99久久综合| 视频国产成人精品日本亚洲18| 青青草日本中文字幕 | 99色热| 啪啪91| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 大香蕉啪啪啪| 人人搞人人插人人操| 素颜老阿姨乱情色| 五月香婷婷| 69国产对白刺激| 精品少妇人妻| 狠狠操夜夜操蜜桃视频三区| 精品国产Av无码久久久亚洲| 亚洲色图 图片| 婷婷色色五月天| 欧美一级美片在线观看免费| 羞答答AV中文字| 丝袜熟女2P| 91c色| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 久久国产精品91| 亚洲 日韩 丝袜 熟女 变态| 国产白丝AV| 久久久久久9999| 狠狠色综合网| 亚洲国产精品9999在线观看| 色九九久九九| 1区2区3区中文字幕日韩| 婷婷天堂站| 午夜精品久久久久久久久久蜜桃| 天天久久久久久| 精品人妻视频一区二区三区蜜桃视频| 日韩乱插| 国产黄色在线播放观看| 久久婷婷苹果| 久久神马影院| 精品女人999| 天天日天天干天天整| 中文字幕在线免费观看2| 日韩欧美蜜桃精品久久中文字幕久久| 日本美女性生活久久久久久久| 亚洲色图亚洲无码强奸乱伦| 久久成年片色大黄全免费网站| 91在线一起| se,,,亚洲欧美| 极品五月天噜噜| 日韩黄色成人性爱| 色色色色日本| 日本操逼视频在线| 亚洲男人天堂网站| 碰人碰碰人人开房人肉| 久久av网| ′ !γ}丶。。久久精品欧美一区二区三区 | 成人精品电影| 97自拍视频在线| 秋霞曰韩R级| 色黄色美女大长腿午夜视频| 青青操网| 懂色av一区二区三区天美传媒| 色亚洲欧美| 色香综合天天影视综合 | 国产97色在线| 一卡二卡三卡| 中文字幕精品亚洲熟女| 亚洲综合骚逼| 伊人伊人LD| 成人综合网 欧美| 欧亚乱色熟一区二区三四区| 韩日精品四区| 嗯嗯啊啊视频在线看| 91精品久久久久久77777| 国产精品熟女丝袜一区二区| 亚洲国产成人精品无码专区| 二男一女成人A片| 少妇人妻太紧太深av| 少妇一区二区三区高速| 肏逼福利网站| 日韩性爱小视频| 丝袜人妻av一区二区| 国产高清成人免费视频| 日韩性爱小视频| 亚洲一区中文精品| av一区二区三区不卡| 一区二区三区免费视频入口| 免费A片三p视频| 在线亚洲 欧美 日本专区| 91福利网在线观看| 蜜乳AV网址| 欧美成人一区二区三区在线播放| 口爆吞精在线观看| 精品毛片久久久精品毛片| 免费啪啪一级视频|