欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

Unity技能系統(tǒng)核心:打造可擴(kuò)展的Buff管理器完整指南

Unity技能系統(tǒng)核心:打造可擴(kuò)展的Buff管理器完整指南 “Unity技能系統(tǒng)”做到中期最容易被低估的就是Buff管理器。很多項目剛開始做戰(zhàn)斗時技能里直接寫幾個if疊buff用List 硬遍歷等到技能數(shù)量上了二三十個各種減速、中毒、增傷、免疫混在一起邏輯開始互相打架改一個Buff數(shù)值能帶出兩個無關(guān)Bug。這篇文章想把我搭一套可擴(kuò)展Buff管理器的完整思路和代碼細(xì)節(jié)整理出來從數(shù)據(jù)結(jié)構(gòu)、Tick更新、疊加驅(qū)散、事件解耦到性能優(yōu)化盡量讓讀到的人能直接抄走少踩一點(diǎn)我踩過的坑。文章不只是貼代碼我會把我為什么這么設(shè)計、為什么用字典而不用List、為什么用事件而不是在技能里寫死邏輯、為什么說Update里每幀遍歷Buff是大忌這些“為什么”也講清楚。適合正在做ARPG、MOBA、卡牌或者任何帶戰(zhàn)斗系統(tǒng)的Unity開發(fā)者參考不管你是剛寫完第一個技能的新手還是正在重構(gòu)戰(zhàn)斗模塊的老手這篇都應(yīng)該有你能直接用上的東西。1. 為什么技能系統(tǒng)里必須有一個專門的Buff管理器1.1 沒有管理器的技能系統(tǒng)會變成什么樣我先描述一個場景。你拿到一個需求給玩家加一個持續(xù)5秒的減速Buff效果是移速降低30%。初版代碼很容易長這樣void ApplySlow(Player player, float duration, float percent) { player.speed * (1 - percent); player.StartCoroutine(WaitAndRemove(duration, player, percent)); } IEnumerator WaitAndRemove(float time, Player player, float percent) { yield return new WaitForSeconds(time); player.speed / (1 - percent); }單看這個邏輯沒問題但幾個Buff疊加之后就出事了。玩家同時被減速30%和加速20%你沒法用一個speed字段加減法搞定更麻煩的是角色在Buff期間死亡協(xié)程還在跑復(fù)活后協(xié)程歸來把速度恢復(fù)到一個不存在的舊值Buff被提前驅(qū)散你又得手動去把所有協(xié)程停掉Buff刷新比如再次中毒要重置持續(xù)時間協(xié)程版本就直接失控了。這個問題的本質(zhì)是Buff是一種有時間維度的狀態(tài)它不能靠零散的協(xié)程管理。它需要被統(tǒng)一注冊、統(tǒng)一更新、統(tǒng)一移除并且要能疊加、能替換、能響應(yīng)刷新。這就是Buff管理器存在的理由。1.2 Buff管理器的核心職責(zé)劃分我在項目里給Buff管理器定了四條硬性職責(zé)任何一條都不允許讓外部模塊去碰負(fù)責(zé)Buff實例的注冊、查詢、移除和清空這是生命周期管理。負(fù)責(zé)所有Buff的定時更新包括持續(xù)計時、周期觸發(fā)、延遲觸發(fā)統(tǒng)一走管理器自己的Tick。負(fù)責(zé)Buff疊加策略、刷新策略和驅(qū)散回調(diào)也就是狀態(tài)規(guī)則。負(fù)責(zé)對外拋出事件讓戰(zhàn)斗系統(tǒng)知道“誰被加了什么Buff”但自己不做傷害、不改屬性。至于減速的具體數(shù)值、中毒的持續(xù)傷害、增傷的比例這些都不寫在管理器里。管理器只做“調(diào)度”不做“計算”。這樣設(shè)計以后每加一種新Buff我只需要新建一個Buff配置數(shù)據(jù)和一套回調(diào)邏輯管理器代碼基本不用動這是“可擴(kuò)展”三個字的根基。1.3 適用場景與設(shè)計目標(biāo)什么樣的項目需要這套東西我的判斷標(biāo)準(zhǔn)很簡單你的戰(zhàn)斗里只要有超過三種可疊加的Buff并且Buff之間有交互比如“減速免疫”要抵消“減速”“灼燒”要被“寒冰”清除你就需要一個統(tǒng)一管理器。如果是休閑游戲里只有一個加速道具那確實沒必要上這套架構(gòu)直接用協(xié)程就夠了。我這套管理器在設(shè)計初定了幾個目標(biāo)后面所有代碼都圍繞這些目標(biāo)展開新增Buff不需要改管理器源碼通過配置和注冊就能完成。運(yùn)行時查Buff要快戰(zhàn)斗中頻繁調(diào)用不能用List做遍歷。每個Buff實例的生命周期清晰開始、結(jié)束、被刷新、被驅(qū)散都要有對應(yīng)回調(diào)。與技能系統(tǒng)和角色屬性系統(tǒng)解耦只通過事件和委托通信。2. Buff數(shù)據(jù)結(jié)構(gòu)先把地基打牢2.1 數(shù)據(jù)與實例分離的思路寫B(tài)uff管理器最容易犯的第一個錯誤是把“Buff定義”和“Buff實例”混在一起。比如直接在玩家身上掛一個Buff類里面既有配置數(shù)據(jù)又有剩余時間代碼確實是能跑的但想要給兩個敵人同時上一個Buff或者同一個Buff在不同等級下效果不同立刻就會復(fù)制出好幾份重復(fù)代碼。我的方案是把Buff拆成兩層BuffData靜態(tài)配置數(shù)據(jù)描述Buff長什么樣一個Buff類型對應(yīng)一份存在ScriptableObject或者配表里。BuffInstance運(yùn)行時實例描述某個單位身上這個Buff當(dāng)前的狀態(tài)包含持續(xù)時間、疊層數(shù)、當(dāng)前所屬目標(biāo)。這樣做的第一個好處是內(nèi)存占用低一百個敵人同時中毒只有一百個BuffInstance共享一份BuffData。第二個好處是方便配表驅(qū)動數(shù)值策劃調(diào)參不需要找程序改代碼。第三個好處是邏輯清晰面向?qū)ο罄铩肮残院蛡€性分離”的原則在Buff場景下就是這么落地的。2.2 BuffData 配置類定義“這個Buff是什么”這是我項目里最基本的BuffData定義用ScriptableObject實現(xiàn)方便在編輯器里直接配置也支持用Json配表后運(yùn)行時加載[CreateAssetMenu(menuName Combat/BuffData)] public class BuffData : ScriptableObject { public string buffID; public string buffName; [Header(基礎(chǔ)時長)] public float duration; [Header(類型標(biāo)簽)] public BuffType buffType; public BuffTag[] tags; [Header(疊加規(guī)則)] public BuffStackMode stackMode; // None / StackCount / RefreshDuration public int maxStackCount 1; [Header(特效)] public GameObject loopVFX; public AudioClip applySFX; }這里的關(guān)鍵字段有三個我只挑需要說透的講。stackMode是疊加規(guī)則。做戰(zhàn)斗系統(tǒng)的都知道同一個Buff重復(fù)施加時怎么處理非常重要。我在這里定義了三檔None表示重復(fù)施法直接刷新時長StackCount表示增加疊層數(shù)每一層都有獨(dú)立數(shù)值加成RefreshDuration表示刷新持續(xù)時間但疊層不變。有的游戲還要求“不同來源的同類Buff分開計時”這種情況可以在BuffInstance里記錄來源是比較后期的擴(kuò)展但數(shù)據(jù)結(jié)構(gòu)上要提前留好位置所以我加了tags數(shù)組用于類型匹配。用ScriptableObject而不是直接寫死在代碼里對我這種團(tuán)隊協(xié)作的工作流很關(guān)鍵。策劃不需要打開代碼工程直接在編輯器里創(chuàng)建Buff資產(chǎn)填參數(shù)就行。代碼里所有對Buff數(shù)據(jù)的訪問都通過buffedID查表也不會出現(xiàn)“改了一個Buff全局都被影響”的事故。2.3 BuffInstance 運(yùn)行時實例記錄“這個Buff現(xiàn)在怎么樣了”BuffData是靜態(tài)藍(lán)圖BuffInstance就是運(yùn)行時的動態(tài)狀態(tài)。當(dāng)玩家被施加一個持續(xù)5秒的減速游戲里就生成一個BuffInstance掛在管理器里每秒扣時間時間歸零就移除并執(zhí)行移除回調(diào)。public class BuffInstance { public BuffData data; public int stackCount; public float remainingTime; public float tickTimer; public GameObject target; public GameObject source; public float Duration data.duration; public float Progress remainingTime / data.duration; public bool IsExpired remainingTime 0f; public BuffInstance(BuffData data, GameObject target, GameObject source, int stackCount) { this.data data; this.target target; this.source source; this.stackCount stackCount; this.remainingTime data.duration; } }tickTimer是專門為周期觸發(fā)準(zhǔn)備的字段比如中毒每2秒跳一次傷害火海每0.5秒造成一次灼燒。有了這個字段管理器在Tick里就能統(tǒng)一處理“剩余時間遞減”和“周期性觸發(fā)”兩類邏輯。你可能會問target為什么不直接存玩家類而要存GameObject我的經(jīng)驗是Buff是戰(zhàn)斗通用模塊它不應(yīng)該依賴具體某個角色類。存GameObject以后傷害計算時再通過GetComponent拿到具體屬性組件這樣Buff管理器就和角色類解耦了。如果你項目里所有可戰(zhàn)斗單位都有統(tǒng)一的接口或基類也可以把GameObject換成基類引用但原則是一樣的管理器不知道具體邏輯只負(fù)責(zé)調(diào)度。3. Buff管理器核心邏輯從注冊到Tick更新3.1 管理器的基礎(chǔ)框架用字典做存儲與查找Buff管理器我推薦做成普通的C#類掛在MonoBehaviour上方便走Update但核心數(shù)據(jù)結(jié)構(gòu)和邏輯用純C#寫這樣做有兩個好處一是方便單元測試二是如果后續(xù)要做幀同步或服務(wù)端戰(zhàn)斗純邏輯代碼可以直接遷移。管理器內(nèi)部的核心存儲是一個以BuffDataID為鍵的字典每個鍵對應(yīng)一個BuffInstance列表。同一單位最多同時掛多少個同類Buff是有限制的所以用列表存多疊Buff很合適。public class BuffManager : MonoBehaviour { private Dictionarystring, ListBuffInstance buffDict; private void Awake() { buffDict new Dictionarystring, ListBuffInstance(); } public bool HasBuff(string buffID) { return buffDict.ContainsKey(buffID); } public int GetStackCount(string buffID) { if (buffDict.TryGetValue(buffID, out var list)) return list.Count; return 0; } }為什么用字典而不用List最核心的原因是查詢頻率。戰(zhàn)斗里要頻繁判斷“這個單位是否免疫眩暈”“是否處于霸體狀態(tài)”如果用List每次都要遍歷全部Buff戰(zhàn)斗單位一多每幀查詢次數(shù)會爆炸。字典查詢平均時間復(fù)雜度是O(1)這是性能上最劃算的選擇。還有一個細(xì)節(jié)字典的key我用的是string的buffID而沒用枚舉。因為配表驅(qū)動的項目里策劃隨時可能新增Buff用枚舉就得改代碼再編譯一次效率太低了。字符串做ID可讀性也高但要注意大小寫統(tǒng)一我項目里強(qiáng)制約定buffID使用蛇形命名比如slow_down_30配表和代碼里完全一致避免字符串寫錯導(dǎo)致查不到Buff這種隱蔽Bug。3.2 Tick更新管理器如何驅(qū)動所有Buff計時Buff管理器之所以要掛在MonoBehaviour上就是為了拿到Update生命周期。每次Update管理器遍歷所有Buff實例做三件事刷新剩余時間、處理周期觸發(fā)、判斷是否到期。private void Update() { TickBuff(Time.deltaTime); } private void TickBuff(float deltaTime) { var expiredList new ListBuffInstance(); foreach (var kvp in buffDict) { var list kvp.Value; for (int i list.Count - 1; i 0; i--) { var buff list[i]; buff.remainingTime - deltaTime; // 周期觸發(fā)邏輯中毒每2秒結(jié)算一次傷害 if (buff.data.triggerInterval 0f) { buff.tickTimer deltaTime; if (buff.tickTimer buff.data.triggerInterval) { buff.tickTimer 0f; buff.OnTick?.Invoke(buff); } } if (buff.IsExpired) { expiredList.Add(buff); } } } foreach (var buff in expiredList) { RemoveBuff(buff); } }這里有一個特別容易踩的坑遍歷字典時不能直接修改集合。如果你在for循環(huán)里直接調(diào)用RemoveBuff會觸發(fā)InvalidOperationException因為字典的迭代器檢測到集合被修改了。我把要移除的實例先放進(jìn)一個臨時的expiredList等遍歷結(jié)束再統(tǒng)一移除這是最簡單也最穩(wěn)妥的做法。還有一個關(guān)于Time.timeScale的問題。游戲暫?;蛘叻怕齽幼鲿rBuff計時需不需要跟著暫停我的做法是在管理器的Tick方法里傳入deltaTime由調(diào)用方?jīng)Q定傳Time.deltaTime還是Time.unscaledDeltaTime。大部分戰(zhàn)斗Buff應(yīng)該跟隨游戲時間也就是受timeScale影響但某些UI演示Buff或者暫停菜單里還要繼續(xù)計時的就要用unscaled。這個靈活度留一個參數(shù)就能搞定。3.3 疊加、刷新與驅(qū)散Buff生命周期里的三類操作Buff管理器最復(fù)雜的部分不是計時而是狀態(tài)變更。我把狀態(tài)變更抽象成三個方法AddBuff、RefreshBuff、RemoveBuff分別對應(yīng)施加、刷新、移除/驅(qū)散。AddBuff是入口它要先查字典里是否已有同類Buff再根據(jù)BuffData的stackMode決定新疊加還是刷新。這段代碼是整個管理器邏輯密度最高的地方public void AddBuff(string buffID, GameObject target, GameObject source) { var data GetBuffData(buffID); if (data null) return; if (data.stackMode BuffStackMode.StackCount) { if (buffDict.ContainsKey(buffID)) { var list buffDict[buffID]; if (list.Count data.maxStackCount) { // 達(dá)到疊層上限刷新最舊一層的時長 list[0].remainingTime data.duration; return; } else { var newBuff new BuffInstance(data, target, source, 1); list.Add(newBuff); newBuff.OnApplied?.Invoke(newBuff); return; } } else { var newList new ListBuffInstance { new BuffInstance(data, target, source, 1) }; buffDict.Add(buffID, newList); newList[0].OnApplied?.Invoke(newList[0]); return; } } else if (data.stackMode BuffStackMode.RefreshDuration) { if (buffDict.TryGetValue(buffID, out var list) list.Count 0) { foreach (var buff in list) { buff.remainingTime data.duration; } } else { var newList new ListBuffInstance { new BuffInstance(data, target, source, 1) }; buffDict.Add(buffID, newList); newList[0].OnApplied?.Invoke(newList[0]); } } }RefreshDuration模式專門用于處理“補(bǔ)Buff”的情況。比如中毒還剩1秒時再中一次毒常規(guī)做法是重置為完整時長。因為這種模式的疊層數(shù)永遠(yuǎn)只有1所以不需要考慮上限直接遍歷所有實例把時間重置就行。RemoveBuff負(fù)責(zé)處理主動驅(qū)散和自然到期。自然到期直接移除就行主動驅(qū)散比如凈化技能需要額外調(diào)用驅(qū)散回調(diào)讓外部邏輯能回應(yīng)“這個Buff被提前清掉了”。我在BuffInstance上掛了三個委托OnApplied、OnTick、OnRemoved由Buff的具體邏輯去注冊這樣可以做到管理器和技能邏輯完全解耦。3.4 解耦通信事件驅(qū)動讓Buff管理器不依賴任何技能邏輯Buff管理器只負(fù)責(zé)“管理”它不關(guān)心Buff具體效果。它要做的是在發(fā)生狀態(tài)變更時把消息廣播出去。我的實現(xiàn)方式是給BuffInstance掛委托而不是用UnityEvent。委托更輕量調(diào)用代價小也不需要在Inspector里拖引用。實際使用場景舉幾個例子一個“攻擊附帶中毒”的被動技能在造成傷害時調(diào)用buffManager.AddBuff(poison, enemy, player)。一個“凈化”技能調(diào)用buffManager.RemoveAllBuff(target)然后BuffInstance上的OnRemoved回調(diào)里會把中毒特效銷毀、把額外傷害停止。一個“減速抵抗”被動角色屬性計算模塊調(diào)用buffManager.HasBuff(slow_resist)有的話就直接忽略減速效果。所有這些交互都通過委托和查詢方法完成Buff管理器不需要知道“攻擊”是什么“被動”是什么“凈化”是什么。新增一種Buff時我只需要寫一份具體的Buff邏輯類實現(xiàn)委托回調(diào)然后在配表里填上引用管理器代碼完全不用動。關(guān)于委托注冊的時機(jī)我建議在OnApplied回調(diào)里做初始化在OnRemoved里做反注冊。尤其要注意Buff實例被移除時一定要把委托置空防止引用泄漏。如果Buff的OnTick里注冊了傷害計算的匿名函數(shù)不清理干凈長期運(yùn)行會積累大量無用的委托引用內(nèi)存占用會緩慢上漲。4. 實戰(zhàn)流程完整構(gòu)建一個中毒Buff4.1 從配表到實例化的完整調(diào)用鏈理論講再多不如把一條完整鏈路走一遍。我挑一個最常見的Buff類型中毒展示它是如何從配表走到角色屬性面板的。第一步創(chuàng)建BuffedData資產(chǎn)。在Unity編輯器里右鍵創(chuàng)建Combat/BuffData填上buffIDpoisonduration5持續(xù)5秒triggerInterval1每1秒跳一次傷害stackModeStackCountmaxStackCount3最多疊3層第二步寫B(tài)uff具體邏輯。因為是中毒我需要一個腳本訂閱Buff的Tick回調(diào)在每次周期觸發(fā)時對目標(biāo)造成傷害。為了方便歸類我把Buff邏輯寫在BuffData旁邊的組件里但更像Scalable的做法是把邏輯做成一個獨(dú)立類然后用BuffData的字段引用。public class PoisonBuffLogic { public static void OnBuffApplied(BuffInstance buff) { // 播放中毒特效、音效 PlayVFX(buff.target, buff.data.loopVFX); // 給目標(biāo)屬性組件標(biāo)記中毒狀態(tài) var attr buff.target.GetComponentCombatAttribute(); attr.ApplyStatus(StatusType.Poisoned, true); } public static void OnBuffTick(BuffInstance buff) { var attr buff.target.GetComponentCombatAttribute(); int damage 10 * buff.stackCount; attr.TakeDamage(damage, buff.source); } public static void OnBuffRemoved(BuffInstance buff) { // 停止毒特效 StopVFX(buff.target); // 清除中毒狀態(tài)標(biāo)記 var attr buff.target.GetComponentCombatAttribute(); attr.ApplyStatus(StatusType.Poisoned, false); } }第三步把邏輯掛到BuffData上。我給BuffData加了一個字段Logic或者直接放一個回調(diào)注冊方法讓BuffInstance在被創(chuàng)建時自動訂閱這三個方法。這里最常用的模式是// 在AddBuff創(chuàng)建BuffInstance之后 buffInstance.OnApplied PoisonBuffLogic.OnBuffApplied; buffInstance.OnTick PoisonBuffLogic.OnBuffTick; buffInstance.OnRemoved PoisonBuffLogic.OnBuffRemoved;這樣中毒Buff的完整調(diào)用鏈就是技能命中 - 調(diào)用buffManager.AddBuff(poison, target, source)- 創(chuàng)建BuffInstance - 觸發(fā)OnApplied - 播放特效加狀態(tài) - 管理器每幀Tick - 每隔triggerInterval觸發(fā)OnTick - 計算傷害 - 持續(xù)時間結(jié)束 - 觸發(fā)OnRemoved - 清理狀態(tài)。4.2 傷害結(jié)算與戰(zhàn)斗模塊的聯(lián)動上面這段邏輯里有兩個容易被忽略的細(xì)節(jié)值得單獨(dú)說。第一個是多層中毒的傷害疊加計算。我的代碼里毒傷計算公式是10 * buff.stackCount這依賴于BuffInstance的stackCount。如果管理器用StackCount模式把疊層次數(shù)存在實例列表里那么GetStackCount(poison)就能直接得到層數(shù)。這樣中毒傷害會隨層數(shù)遞增玩家就能感受到“疊滿3層毒傷害暴漲”帶來的戰(zhàn)斗策略。第二種情況是OnBuffTick里傷害結(jié)算和事件派發(fā)的關(guān)系。如果戰(zhàn)斗系統(tǒng)里有“收到傷害觸發(fā)反擊”這類邏輯傷害結(jié)算時一定要把buff.source傳出去這樣反擊系統(tǒng)才能知道該反擊誰。我在很多項目里看到毒傷只傳target不傳source結(jié)果中毒傷害無法觸發(fā)受擊反饋也無法被“反傷鎧甲”反射這是Buff事件設(shè)計常見的坑。任何由角色造成的傷害哪怕來自間接的持續(xù)傷害也要保留施法者引用。還要考慮當(dāng)目標(biāo)在中毒期間死亡中毒Buff該怎么處理。我的做法是在目標(biāo)角色的死亡回調(diào)里主動調(diào)用buffManager.RemoveAllBuff(target.gameObject)把中毒、灼燒、減速等所有Buff一次性清掉。這比等Buff自然到期更干凈因為很多Buff的OnRemoved回調(diào)要清理特效、恢復(fù)屬性如果目標(biāo)死了特效還在目標(biāo)尸體上播放非常出戲。4.3 實戰(zhàn)中Buff管理器的核心查詢接口設(shè)計以下是Buff管理器提供給外部調(diào)用的查詢接口我做成了接口形式方便以后測試時替換mock也更符合依賴倒置的原則。public interface IBuffManager { bool HasBuff(string buffID); bool HasBuff(BuffTag tag); int GetStackCount(string buffID); float GetRemainingTime(string buffID); void AddBuff(string buffID, GameObject target, GameObject source); void RemoveBuff(string buffID, GameObject target); void RemoveBuffByTag(BuffTag tag, GameObject target); void RemoveAllBuffs(GameObject target); void Clear(); }HasBuff(BuffTag tag)特別有用。比如“霸體”不一定要做成一個Buff也可以做成一個標(biāo)簽體系。某些技能需要判斷目標(biāo)是否處于霸體狀態(tài)時直接查標(biāo)簽就行比遍歷所有Buff判斷類型的效率高很多。GetRemainingTime是給UI倒計時用的。戰(zhàn)斗UI要顯示玩家身上的Buff圖標(biāo)和倒計時這個接口能直接返回一個指定Buff的剩余時間UI層不需要知道Buff管理器內(nèi)部是怎么存儲的。4.4 多單位管理對象池與字典的擴(kuò)展這里要給Buff管理器增加一個維度——如果一場戰(zhàn)斗有幾十個敵人每個敵人身上都有Buff那怎么辦最簡單的方法是把BuffManager掛到每一個單位身上各單位只管理自己。這個方案在小規(guī)模戰(zhàn)斗里完全夠用也符合直覺。但如果你想做一個全局管理器管理所有單位的Buff那就把字典再套一層private DictionaryGameObject, Dictionarystring, ListBuffInstance allUnits;這樣做的好處是方便做全屏凈化和全局Buff查詢壞處是性能和內(nèi)存壓力變大。我的建議是先不做全局統(tǒng)一管理等確實需要全屏技能或者跨單位查詢Buff時再升級。過早設(shè)計多層嵌套會讓代碼可讀性下降而且戰(zhàn)斗系統(tǒng)永遠(yuǎn)是最容易出Bug的重災(zāi)區(qū)保持?jǐn)?shù)據(jù)結(jié)構(gòu)簡單是降低Bug率的最有效手段。補(bǔ)充一個關(guān)于對象池的點(diǎn)。BuffInstance本身是很小的對象頻繁創(chuàng)建和銷毀在長期運(yùn)行中會產(chǎn)生GC壓力。如果你發(fā)現(xiàn)戰(zhàn)斗幀率受GC影響明顯可以對BuffInstance做對象池。因為BuffInstance沒有復(fù)雜的引用關(guān)系池化非常容易用一個StackBuffInstanceAddBuff時從池里取RemoveBuff時把委托置空、數(shù)據(jù)清空再歸還。這個優(yōu)化可以放到性能優(yōu)化階段再考慮不要一開始就做容易引入新的Bug。5. 常見問題、踩坑與性能優(yōu)化清單5.1 五個高頻坑與對應(yīng)方案我復(fù)盤過去幾個項目整理了Buff管理器最容易出的五個坑每一個我都踩過先寫原因再給解法??右挥脜f(xié)程做Buff計時Buff被驅(qū)散后協(xié)程還在跑。協(xié)程只能停StoreCoroutine的引用一旦Buff是數(shù)組管理的你根本拿不到所有協(xié)程的引用。解法就是Buff管理器統(tǒng)一Tick不用協(xié)程計時。如果一定要用協(xié)程那也必須在BuffInstance上緩存Coroutine對象移除Buff時StopCoroutine否則就會出“角色復(fù)活后還在掉血”的靈異事件??佣闅v字典時直接刪除導(dǎo)致異常。這個我在3.2節(jié)強(qiáng)調(diào)過。C#的字典迭代器不允許迭代過程中修改集合強(qiáng)行Remove會拋異常。正確的先用expiredList收集再統(tǒng)一刪除。這個坑在戰(zhàn)斗系統(tǒng)中非常常見因為Buff的到期回調(diào)里往往會觸發(fā)新的Buff邏輯遞歸調(diào)用AddBuff或RemoveBuff不小心就會踩中。坑三Buff結(jié)束特效不銷毀。中毒特效、冰凍特效掛在角色身上Buff被驅(qū)散時如果OnRemoved里沒有清理特效引用特效就會永久留在場景里。這是特別容易漏的地方。我的經(jīng)驗是特效掛到目標(biāo)子節(jié)點(diǎn)時記錄引用BuffInstance的OnRemoved里統(tǒng)一做GameObject.Destroy(vfx)。如果擔(dān)心特效預(yù)加載的性能盡量用一個特效容器腳本來統(tǒng)一管理播放和停止??铀膶傩曰謴?fù)順序?qū)е翨ug。加速Buff結(jié)束時要把速度除回來但如果玩家在加速期間被減速了除回來的結(jié)果就是減速后的值這又變了。這是數(shù)值設(shè)計上的經(jīng)典陷阱。正確做法是Buff不直接改基礎(chǔ)屬性而是把Buff的加成疊加到一個系數(shù)上每次計算時用“基礎(chǔ)值 加成值”而不是“在現(xiàn)有值上乘/加”。比如moveSpeed baseSpeed * (1 speedBuffPercent)這樣不論多少個加速減速Buff疊加計算順序都不會影響結(jié)果??游錖og輸出刷爆。開發(fā)調(diào)試時在Buff的Tick回調(diào)里打Debug.Log比如“中毒造成10點(diǎn)傷害”中毒5秒每秒一次就會出現(xiàn)5條日志如果100個單位同時中毒就是500條Log編輯器直接卡死。做戰(zhàn)斗模塊調(diào)試時盡量用斷點(diǎn)或者條件編譯的日志開關(guān)不要用全局Debug.Log。5.2 性能優(yōu)化GC壓力、字典查找與批處理Buff管理器性能問題一般出現(xiàn)在大規(guī)模戰(zhàn)斗上。我遇到的實際場景是千人同屏每個單位都有2-3個Buff每幀要管理幾千個Buff實例的計時這時候就必須做針對性的優(yōu)化。第一個優(yōu)化點(diǎn)是減少Update期間的堆內(nèi)存分配。3.2節(jié)代碼里我新建了expiredList每次都new這就是GC壓力的一部分。優(yōu)化方法是在管理器里預(yù)分配一個List用完Clear不要在函數(shù)內(nèi)重復(fù)new。同樣的道理Tick里盡量不要用LINQWhere、ToList這類操作會分配大量臨時對象在戰(zhàn)斗熱路徑上是性能殺手。第二個優(yōu)化點(diǎn)是避免每幀遍歷所有Buff做查詢。如果Buff數(shù)量特別多可以考慮用dirty標(biāo)記。比如某個屬性被Buff影響時設(shè)置屬性模塊的臟標(biāo)記只有標(biāo)記變化時才重新計算屬性而不是每幀把Buff全算一遍。這種“事件驅(qū)動重算”比“每幀輪詢”更符合戰(zhàn)斗系統(tǒng)的真實需求因為Buff只在施加、移除、疊層變化時才需要影響屬性。第三個優(yōu)化點(diǎn)是合并同類型BuffTick。如果有100個單位同時中毒每個單位每秒都要觸發(fā)一次OnTick傷害計算這會產(chǎn)生100次傷害事件調(diào)用。有些項目會把這部分合并成批量結(jié)算比如統(tǒng)一收集所有中毒單位和剩余存活時間隔1秒一次性計算所有毒傷。代價是傷害結(jié)算時間會有一點(diǎn)點(diǎn)延遲但對大多數(shù)玩法的體驗來說無感。第四個優(yōu)化點(diǎn)是性能分析工具的使用。Unity自帶的Profiler就夠用你要重點(diǎn)關(guān)注的是GC.Alloc和Update里的耗時。如果發(fā)現(xiàn)Buff管理器占了總耗時比例過高優(yōu)先看是不是有頻繁的字典擴(kuò)容、字符串拼接和LINQ查詢。字典擴(kuò)容是個隱形性能殺手AddBuff時如果沒給字典預(yù)分配容量字典會在擴(kuò)容時把整個哈希表重新計算一遍。在創(chuàng)建管理器時如果預(yù)估有多兩倍的Buff種類可以先new Dictionarystring, ListBuffInstance(64)把容量一次性給足。5.3 我現(xiàn)在的編碼習(xí)慣最后分享幾個我寫B(tài)uff管理器時給自己立的規(guī)矩。第一所有對外API只暴露接口不暴露具體類。這樣以后不管是做斷線重連后的戰(zhàn)斗恢復(fù)還是做服務(wù)端驗證都只需要替換接口實現(xiàn)類不用改調(diào)用方代碼。第二新加Buff時先想清楚它的生命周期再動手寫邏輯。Buff和技能的區(qū)別在于技能是一次性的行為Buff是一個持續(xù)性的狀態(tài)。持續(xù)狀態(tài)最怕的就是沒有清理干凈。寫任何Buff邏輯前先列一張清單進(jìn)入時做什么、周期時做什么、結(jié)束時做什么、被驅(qū)散時做什么全部覆蓋再編碼。第三多寫單元測試。Buff的疊加、刷新、驅(qū)散、死亡清理這些操作極其適合寫單元測試。用Unity Test Framework跑起來幾分鐘就能把核心邏輯覆蓋完。每次重構(gòu)管理器之前先跑一遍測試心里就有底了。第四Buff管理器的代碼要短小精悍不要在里面堆業(yè)務(wù)邏輯。我見過有些項目的Buff管理器幾百行里面塞了減速公式、毒傷公式、冰凍模型變色、擊退物理效果最后完全沒辦法維護(hù)。管理器的職責(zé)就是調(diào)度和生命周期管理所有具體的Buff效果實現(xiàn)都應(yīng)該拆到BuffData的子類資產(chǎn)里或者在外部回調(diào)里完成。這樣哪怕Buff類型再翻一倍管理器仍然是這一套代碼這是“可擴(kuò)展”最實在的體現(xiàn)。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
成人Av在线大片| 激情五月天婷婷色色色色色色色色色色色| 精品久久久久久久人妻| 亚洲免费看片| 少妇性BBB搡BBB爽爽爽视頻| 999激情视频| 久久九九99| 少妇2做爰HD韩国电影| 色婷婷在线视频综合| 丁香五月天日韩无码| 五月丁香六月综合激情 | 丁香五月婷婷av| 97香蕉久久超级碰碰高清版| 江苏少妇性BBB搡BBB爽爽爽 | 婷色五月| 超碰精品在线| 日本天堂爱爱| 婷婷五月婷婷| 色婷婷综合网站| 五月婷婷激情久久| 丁香五月天狠狠操| 黄色91在线观看| 丰满人妻一区二区三区| 婷婷久久五月天| 99青青草99| 深爱激情综合| 婷婷九月激情| 91啪啪| 洗浴中心操B视频| 亭亭色色五月天| 婷婷久综合| 婷婷综合激情| 99久热这里只有精品| 色情五月| 男女av免费看| seuuu婷婷| 久久99热这里只有精品| 婷婷五月天亚洲| 久久综合五月天| 色婷婷六月综合| 日韩无码成人电影| 亚洲超碰在线| 人妻自慰在线| 欧美久久婷婷| 伍月婷丁香婷| 婷婷成人五月天一区| 丁香色色网| 欧美婷婷综合网| 免费黄色片子| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 91热网址| 女同激情久久av久久| 丝袜熟女一区二区三区| 九色无码| 免费AV在线| 91精品综合久久久久久五月丁香| 亚洲一区二区无遮挡A片| 五月花丁香婷婷| 欧美婷婷五月激情| 乱轮A片| 天天爽天天草| 婷婷色在线播放| 丁香婷婷六月| 婷婷俺去也| 操操操Av| 亚洲这里只有精品| 极骚大香蕉伊人| 99riav 亚洲| 欧美情色一区| 欧美操逼天堂| 五月天国产成人| 99五月丁香丁| 安息电影在线观看完整版| 激情五月婷婷| 五月婷婷干| 激情婷婷五月天在线观看| 亚洲五月天综合| 99色丁香婷婷综合网| 激情五月综亚网| 日韩AV色色色| 五月婷婷久久久| 91色综合| 久久婷婷原创视频| 久久久18| 免费看片在线观看| 五月6香色婷婷视频| 五月天天天操天天爽夜夜操| 丁香五月综合在线观看| 99精品视频免费观看| 色播五月综合网| 九九色99| 色婷婷8| 婷婷六月久久| 久婷婷五月激情| 日日干夜夜撸夜夜骑| 日日操天天爽| 99精品在线观看视频| 免费视频WWW在线观看网站| 激情综合丁香六| 久久182| 99热主页日本| 深夜A片| 色综合大香蕉| 国产干逼片| 五月丁香激情怕怕| 亚洲激情综合五月婷婷啪啪| 伊人啪啪网| 成人片黄网站色大片免费毛片| 午夜激情四射影院| 日韩另类| 亚洲区在线| 成人五月天。COM| 激情综合99| 欧美日韩大黄| 色色五月丁香| 99色在线观看视频| 欧美草久久五月天91| 亚洲午夜av| 国产AV熟妇人震精品一品二区| 天堂久久婷婷| 婷婷五月丁香综合激情| 色五月婷婷777| 激情婷婷在线中文字幕| 婷婷精品性性性性性性性| 九九热这里只有精品6| 91精品91久久久中77777| 久久99网| www.六月丁香看AV| 国产毛多水多女人A片| www.91av.com| 秋霞电影理论| 99久久国产宗和精品1上映| 日韩一级网站| 青青草99热久久精品国| 亚洲激情网站| 沈娜娜av| 99这里只有免费的精品| 日本色五月| 大香蕉人人网| 五月激情六月综合| 在线成人国产| 玖玖精品视频| 亚洲4区国产欧美| 五月丁香六月婷婷亚洲激情综合| 欧美大片免费播放器| 色婷婷先锋| Www,五月天| www久| 亚洲A色| 亚洲操B| 亚洲欧美婷婷五月色综合| 九九精品re免费视频| 婷婷五月丁香91| 操逼棍操逼| 九九无码| 亚洲 综合中文| 五月天色五月| 丁香花成人区| 五月丁香婷婷视频| 草综合14| 日韩野外 无套| 国产日批视频| 任你艹| 亚洲视频五区| 婷婷久久五月| 综合激情婷婷| 日本久久天堂| 精品无码色欲AV| 丁香久久| 思思久ren热| 婷婷丁香五月亚洲| 日韩一区二区在线播放| 99在线观看| 久久综合干| www色五月| 日本道久久91| 人人摸人人澡人人| 99热亚洲综合| 97碰人人操| 五月婷久久综合| 亚洲人妻五月丁香婷婷| 色约约视频一区二区三区四区五区| 色高清无码视频| 极品人妻VIDEOSSS人妻| 夜色.cnm| 婷婷九月亚洲| 开心久久五月天| www.99色| 激情久久天天| 色婷婷啪啪| 五月色亚洲| 天天透天天干| 亚洲超碰在线| 婷婷五月深深的爱| 91久女| 婷婷五月激情视频| 亚洲无线视频| 亚洲V国产V欧美V久久久久久| 琪琪理论片| 久热9| 九九免费精品在线视频| 色色丁香婷婷五月天| 五月天六月婷| 激情五月天99色| 色丁香五月| 97色婷婷五月天| 婷婷综合精品视频97| 五月婷婷黄色毛片| 六月天六月婷| 97碰碰九九视频| 这里只有免费精品| 九九色逼| 九久久九精品视频| 殴美日比视频| 亚洲激情视频网| 激情网色五月| 99久久网站| 五月丁香啪啪啪啪| 67194中文字幕| 色婷婷网| 婷婷激情五月天在线视频| 丁香伍月婷电影全集| 色色色色av色色色色| 婷婷五月综合啪| 九九热AV| 成人视频婷婷| 5月婷婷视频网站综合| 久久免费操| 久久99精品久久久| 九九色热| 夜夜干 夜夜操| 精品久久久999| 激情六月婷| 亚洲AV综合网| 亚洲三A| 五月天天综合| 丁香六月激情蜜桃| 91日韩在线| 97色 五月天丁香| 久99热在线观看| 色五月亚洲五月天| 五月婷婷丁香综合| 精品九九久久| 五月天婷婷色| 99视频久久| 颜射 精品性爱av| 久久玖玖综合| 蒲京久久无码视频| 99国产精品久久久久久久久久久| 色情五月婷| 亚洲五月丁| 97碰碰在线看视频免费| 五月婷婷国产| 婷婷大香焦| 99超级碰免费视频| 色色色地址| 婷婷五月丁香五月天| 色色激情网| 日日夜夜爽| 91爱啪啪| 午夜丁香综合婷婷| ady狠狠入| 91ncom.色| 天天做天天爱综合| 亚洲综合狠狠艹| 99er这里只有精品视频| 九九色综合| 日本3级片一区2区| 五月开心久久| 五月久久网| 亚洲超碰青涩| 丁香香蕉射射射| 9999久久久久| 亚洲综合久| 久久成人天| 免费九九热| 99人人干人人| 色色影院黄大片| 色色色色色色网站| 色99色| 色天天综合| 久久er+| 六月激情婷婷| 丝袜激情网| 五月丁香婷婷伊人日韩| 99视频日韩| 久9精品视频在线| 江苏少妇性BBB搡BBB爽爽爽| 99久| www.色色com| 久久男人网婷婷| 色色婷婷综合| 日韩av高清| 欧美精品狠狠色丁香婷婷| 亚洲日韩成人三级av| 国产真实乱对白精彩| 搡BBBB搡BBB搡18| 婷婷五月天小说| 天天综合色| 亚州美女| 久久久五月天婷婷成人网| 色五月婷婷丁香凹凸| 久热99视频在线观看| 色婷婷中文| avh片在线观看| 久久五月天 91| www. 五月. com| 视频久久9| 婷婷午夜综合| 精品一区二区三区四区五区六区介绍| 天天成人综合视频| 五月天婷婷色| 五月婷婷色| 日本人妻伦在线中文字幕| 国产SUV精品一区二区883| 婷婷色五月91啪啪| 成人综合视频在线| 夜夜骑日日操| 99re热视频这里只精品5| 婷婷 丁香 精品| 欧美 日韩 成人 在线| 99热99干| 激情操逼婷婷| 综合性爱网| 激情婷婷五月天。| 操操操AV| 天天骑天天操| 天天肏天天舔AV| 十区AV| 久久精品婷婷| 五月婷婷六月婷| 97操碰在线视频| 天天草天天爽| 伊人五月天久久| 超碰免费人人| 天天爽天天日天天舔| 9有码中文| 中文字幕成人| 六月婷婷视频| 狠狠色情婷婷| 538任你爽| 日韩丰满少妇无码内射| 99视频在线播放大全| 91精品熟女| 人人草人| 91欧美| 色开心五月丁香| 五月婷婷无码| 婷婷五月丁香五月综合网| 婷婷综合激情| 九热视频免费观看| 丁香月五月天婷婷久久| 99热在线中文字幕| 九月性爱网| 91色婷婷综合久久中文字幕二区| 亚洲综合丁香五月天| 亚洲操逼网| 嫩草视频。| 色,激情五月天| 亚洲99热| 激情婷婷丁香| 美女亚洲五月丁香| 九九九热精品| 国产在线视频1234| 日逼免费视频| 天天插天天射| 色综合99| 91肏| 久激情| 五月丁香AV、伊人业余、性色熟妇| 日本婷久久| 国产精品久久久久9999小说 | 久久久中文| 色青五月天| 中文字幕 久久9999| 五月丁香天堂网| 青青草Avb在线| 国产探花AV在线| 五月丁香婷婷六月| 五月婷婷久久久| 色视频五月天| 六月丁香婷婷爱| 99热思思在线观看| 99热97| 亚洲超级碰| 天天日天天日天天搞| 激情婷婷五月天| WWW99热| 99免费热视频在线| 婷婷六月久久| 久久视频这里99| 99国产在线精品视频| 日本三级中国三级99人妇网站| 五月丁香婷婷五月| 99ri视频在线观看| 日韩色五月| 亚洲宗合激情| 欧美性爱5月天天天看| 丁香五月天激情综合| 五月丁香999| 综合伊人久久| 99在线精品视频| 日日干日日| 冬月かえでAV无码播放| 色婷婷丁香五月| 伊人成综合五月婷婷| 五月丁香婷婷啪啪综合网| 天天天天操| 天天做天天视天天谢| 99热精品在这里| 五月天综合久久| 国产avapp 网| 久99久在线| 999婷婷综合| 色玖玖导航| 大香蕉99热| 变态另类9| 久久免片| 婷婷大美在线| 影音 五月 婷婷 久久| 六月婷婷亚洲| 婷婷综合av| www.激情五月| 我爱大香蕉| 九九热这里| AV天堂淫乩| 婷婷开心激情五月激情网| 亚洲正能量欧美| 开心婷婷五月天激情网| 99噜噜| 欧美熟女99| 婷婷成人网五月天| 99超超碰| 九九热精品视频| 91精品综合久久婷婷九色| 精品人人操| 五月丁色AV| 午夜成人片400| 狠狠色 综合色区| 97人碰人操| 狠狠操狠狠操AV| 丁香五月婷婷色情综合| 在线看的免费网站| 丁香婷婷激情六月五月开心| 99热福利| 99爱在线| 亚洲午夜av| 六月婷婷狠狠| 超碰精品国产首页| 囯产精品久久欠久久久久久九大| 丁香五月婷婷在线视频| 99色热视频| 激情五月综合网| 这里只有精品69| A级毛片高清免费不卡播放谢谢谢谢| 91九色|疯狂|高潮|对白|| 五月婷婷伦理| 婷婷五月天丁香激情| 九九热在线99| 丁香五月六月婷婷殴美综合| 久久久五月天| 九九99视频精品| 色婷天天| 狠狠干 狠狠操| 婷婷午夜激情| av首页在线| 成人av在线电影| 色色丁香五月婷婷| 91丨九色丨高潮丰满日本| 日韩免费视频| 97人人做| 久播影院免费观看电视剧大全最新网| 色五月综合网| 久草嫩草在线观看| 成人视频网| 亚洲中文乱字字幕在线永久| 色。 婷婷婷| 亚洲无码www| 免费看欧美成人A片无码| www.激情五月| 丁香五月综合在线播放 | 67久久| 久久综合丁香激情五月| 四色五月婷婷在线观看| 婷婷五月免费观看| 亚洲婷婷91丁香| 欧美日韩成人h| 婷婷久久综合| 五月婷婷丁香| 日日插日日干| 草AV9999| 亚洲色色图片| 香蕉婷婷| 国产.亚洲.欧洲视频在线| 五月天色色无码| 99久久婷婷国产综合精品草原| 思思热精品在线观看| 天天日夜夜B久久| 9久久久久| 啪啪五月婷婷| 综合色七七| 亚洲免费看片| 激情五月丁香五月| 综合大香蕉| 99热97| 激情五月天婷婷视频| 熟女色专区| 在线观看免费狠狠色丁香香综合| 丁香花婷婷五月天| 大香蕉伊然在亚洲90| 男女啪啪做爰高潮无遮挡| 夜夜操夜夜操| 婷婷综合在线| 日韩成人电影AV| 99九九视频精彩在线| 色综合久久88色综合天天| 深爱婷婷色| 深爱 五月天| 九九热a| 五月丁香婷婷欧美| 99碰网站| 久热黄色| 夜夜 操无码| 亚洲秘 无码一区二区三区妃光/1| 天天操狠狠操| 欧美成人性爱网| 99精品22| 五月激情婷婷丁香| 婷婷六月丁香五月| 开心五月天激情网| 99碰网站| 五月丁香婷婷综合| 婷婷五月天视频| 日韩成人精品中文字幕| 九九精品热| 九九久久精品| 五月婷婷性爱| 亚洲欧洲中文日韩久久AV乱码| 国产精品99久久久久久久女警| 99人人干| 欧美性生交A片免费看| 国产精品美女久久久久AV超清| 嫩草AV久久伊人妇女超级A| 婷婷五月天亚洲色| 99惹精品视频| 五月婷婷综合在线视频小说| 九九热婷婷| 99自拍视频网站| 伦乱天堂| 91久久99久久91熟女精品| 开心五月天激情网| 91碰免费视频| 婷婷欧美激情| 激情五月综合网| 日本女va| 久久人妻在线| 色综合九九| 五月婷综合性中心| 五月激情婷婷丁香| 天天爽人人综合免费7799| 日韩视频99| 蜜桃人妻无码AV天堂三区| 日韩AV中文在线观看| 婷婷五月丁香99| 91丨九色丨老农村| 性色人人爽| 激情五月网站| 激情99| 热久久99热欧美国产亚洲| 五月婷色| 婷婷五月天首页激情| 色玖玖爱| 深爱五月亚洲| 国产精品成人AV在线| 欧洲色色| 99婷婷色| 高清无码网址| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 激情骚五月| 99自拍视频| 激情综合婷婷| 天天搞天天色综合| 亚洲欧洲中文日韩久久AV乱码| 禁片二区| 色色色色热热| 另类 在线| 色婷婷a v| 99在线精品免费视频| 婷婷五月69| 丁香五月婷婷五月| 激情五月综合网最新| 日韩成人电影av| 久久综合影院 | 狠狠搞亚洲| 九月av在线| 大香蕉伊人99| 99re久热只有精品6在线直播| 精品少妇人妻AV无码专区偷人 | 激情綜合網址| 91一起操| 99热这里精品| 亚洲综合在线伊人婷| 国产婷婷色综合AV蜜臀AV | 免费看片在线观看| 激情欧美五月丁香| 丁香婷婷伊人| 日本久久婷| 搡BBBB搡BBB搡18| VfJxEwPH| 思思色播| 六月婷在线| www99热| 婷婷之六月丁香| 婷婷久久免费| 久久久av久av久片一区二区| 色婷婷五月色| 婷婷天天综合| 国产AV网页| 激情九九六月激情免费视频| 丁香五月天色| 激情小说五月天| 激情AV中文| 国产精品A片| 亚洲1区| 婷婷综合性爱网| 日日舔夜夜操| 亚洲色色色色色色色色色| 久久99色色| 婷婷久久久| 欧美成人精品A片免费一区99| 色五月人妻| 一本久久亚洲五月婷婷| 人人操插| 婷婷久久婷婷| 亚洲乱码日产精品BD| 六月丁香综合| 色女伊人| 色情免费视频播放| 再綫Av免费視品| 成人网站av免费网站推荐| 成人精品视频99在线观看免费| 99狠狠| 日韩精品二三区| 婷婷丁香五月天欧美| 天天射美女| 99国产欧美视频| 日本人妻伦在线中文字幕| 久久99网站| 日本狠狠色| 狠狠色噜噜色狠狠狠综合久久成人波 | 婷婷五月天毛片| WW婷婷五月天com| 久9热| 99热啪啪| 伊人久久五月天| 开心五月天激情网| 狠狠色综合久久| 激情激情激情网| 婷婷激情综合无月| 人妻久久久久久久久妻久久久久久久久| 麻豆精品| 成人网站av免费网站推荐| 1024在线视频| 黄色毛片精品| 97热超碰| 五月丁香婷婷啪啪综合| 青996青| 激情宗合 激情宗合| 99ri视频在线观看| 婷婷五月天AV在| 日本理论久久| 青青草轻轻操| 久久婷色| 天天综合色丁香| 五月丁香六月婷婷啪啪综合| 这里只有精品热| 国产精品久久在线观看技巧| 综合久色五月| 九九久久99精品免费观看www| 五月丁香啪啪婷婷| 久热91| 婷婷五月天手机版视频| 超碰在线资源| 久久久8| 干亚洲天堂| 五月天丁香婷婷网| 中文AV网| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 国产五月天激情小说| 丁香五月亚洲综合丝袜| 99热只有| 天天综合亚洲综合网天天αⅴ| 久久久天堂国产精品女人| 五月草视频| www.91九色| 国产精品一区在线观看你懂的| 丁香五月婷婷久久久| 91成人电影| 亚洲99激情| 午夜在线成人网站免费观看| 9|无码久久久久久| 狠狠色丁香婷婷综合久久97AV| 绿色小导航AV| 久久婷婷五月综合| 熟女激情五月天| 99re6热在线精品视频播放速度| 亚洲精品又粗又大又爽A片| www.99热视频| 激情综合4月| 亚洲天堂有码| 天天操夜夜操| 色色色综合色| 九热在线这里有精品6| 日本久久极品| 裸睡玩奶头(高H)| 婷婷五月天六月丁香| 中文字幕婷婷五月天| 亚洲啪啪自拍| 亚洲1区| 日本婷色| 成人网丁香五月| 超碰色色综合| 色亭亭丁香五月天| 免费黄色片子| 神马欧美精| 亚洲人妻一区二区| 久久五月丁香婷婷| 一区三区视频有限公司| 精品香蕉99久久久久网站| 91久久精品无码一区二区三区| 综合色五月天| 亚洲AV成人在线| 91主播在线| 极品人妻VIDEOSSS人妻| 五月丁香婷婷色色| 五月丁香中文| 亚洲行行色色| 五月丁香综合精品欧美| 99热e| 色欲久久久久| 色亚洲婷婷| 120分钟婬片免费看| 一区二区三区XXXXXX| 国产AV一区二区三区日韩| 欧美99| 夜色综合网| 热99热9| 九九热这里精品| 久9久9热久热| 日熟女| 嘿嘿视频免费看9| 久久人妻熟女一区二区| 伊人久久婷婷| 99无码黄色视频| 成人精品人妻| 久久婷婷视频| 色婷婷丁香五月在线观看| 丁香六月天色婷婷| 婷婷丁香第一页| 伍月婷婷免费视频| 激情婷婷五月久久| 婷婷99狠狠躁天天躁| 亚欧州精品视频| 99精品高潮| 色婷婷另类| 婷婷综合久久综合| 91九九九九九九| 99国产在线精品视频| 99精彩视频| 丁香六月综合激情| 中文字幕永久在线| 91啪啪| 成人看片网站| 人人操av| 黑人糟蹋人妻HD中文字幕| 大香蕉久| 99这里有精品| 国产看真人毛片爱做A片| 久久精彩视频| 色婷婷基地 | 久久黄色片| 激情欧美丁香五月| 五月婷婷激情综合av| 这里只有精品无码| 超碰在线中文字幕| 91人人操.COM| 99re热视频这里只精品| XX色综合| 五月天婷婷色色| 一点色成人网| 波多野结衣不卡AV| 色综啪啪啪啪啪啪| www色婷婷com| 美女黄频aⅴ视频| 久久婷色| 九九爱这里只有精品| 五月天婷婷网站| 五月中旬婷婷丁香六| 色色色色网色色网色色| 久久激情五月婷婷| 婷婷的99视频网站| 成人片在线播放| 777精品久无码人妻蜜桃| 青青草青青草五月天| av一区二区电影免费在线观看| 五月婷婷,六月婷婷| 97极品在线| 激情视频婷婷五月花| 天天综合插插| xxx.色婷婷| 综合99视频| 99只有精品| 草草色情综合网| 男人視頻站| 成片免费观看视频大全| 六月婷五月丁香| 可以免费看AV网站| 性色婷婷| 男女啪啪做爰高潮无遮挡| 欧美日韩成人h| www,色婷婷| 月月AV| 婷婷干五月综合在线播放| 天堂中文国产| 激情婷婷丁香| 欧日韩成人| 亚洲精品视频在线播放| 亚洲黄网在线| 操一区| 久热只有这里精品| 色婷婷888| 久草热8精品视频在线观看| 国产亚洲99久久精品熟女| 婷婷五月天久久久| 五月婷在线色视频| 婷婷操久久| 日本色色色色色色色色一色二色| 小色小蛇伊人婷婷色香五月| 九九视频这里只有精品在线播放 | 91人久| 午夜爱插插| 日日操日日射| 丁香六月久久| 五月丁香六月停停停| www.五月婷婷| 五月草影视| 开心五月天激情网| 亚洲无码AV片| 丁香五月成人论坛| 婷婷97碰碰| 婷婷五月丁香基| 日本色道视频网站| 五月丁香六月婷婷在线观看| 婷婷丁香五月综合| 秋霞AV美国| 亚洲mm色| 婷婷色五月天在线| 99re视频在线| 五月的丁香六月的婷婷| 五月丁香婷婷久久| 婷婷五月色花丁香社区| 五月激情精品视频| 丁香六月婷婷开心| 久久久九九九 99| 激情五月天在线| 成人在线网址| 免费观看2018www黄色操逼网站| 国产va在线视频| 99综合在线| 九九99在线视频| 九九九九九九九热| 色情五月婷婷| 99精彩视频| 大香蕉伊人99| 婷婷狠狠干| 丁香五月婷婷天激情| 精品九九在线观看视频| 国产avapp 网| 九九九九无码| 色五月成人在线| 五月天丁香| 色综合色色| 久青操| 久久久免费图片视频| 亚洲十月婷婷综合| 丁香五月激情网| 青草青草久热这里只有精品| 综合网啪啪| 99久久.www| www99热| 影音先锋五月婷婷| 婷婷成人五月天一区| 久久丁香五月天| 一区色色色色网| 丁香色色色| 色情婷婷。| 久久人妻视频| www.97干视频| 久久五月天综合| 丁香香蕉婷婷| 婷婷亚洲五月| 色色网91| 日日撸夜夜操| 99热全是精品| 99久久精品国产色欲| 狠狠情色| 午夜九九九九九九九九九九九九九| 97香蕉人人在线观看| 99久热这里只有精品| 96精品国产综合久久久久久| 六月丁香VA| 九九综合图片网| 欧美性色视频| 9有码中文| 天天操B| 日韩啪啪网| 99综合| 思思视频这里是精品| 成人精品视频99在线观看免费| 婷婷五月丁香高清无码| 强辱丰满人妻HD中文字幕| 伊人超碰| 色综久久久| 欧美成人A片AAA片在线播放| 大香婷婷| 丁香五月色情| www五月| 夜夜天天久久婷婷| 九色亚洲| 激情婷婷六月天| 丁香久久综合| 99热这里是精品| va婷婷在线| 色综合77777| 99久在线精品99re8| 六月丁香婷婷色狠狠久久| 精品久久久999| 人妻性操逼中文字幕 国产| 天天干天天插| 婷婷五月噜噜| 91在线日本| 91日韩在线| 深爱网深爱综合网| 午夜在线成人网站免费观看| 婷婷五月天激情小说| 大香蕉久操| 欧美成人AAA片一区国产精品 | 日操夜操天天操不卡| 99热成人| 青青草性爱视频| 97夫妻超碰| 五月综合婷婷五月| 五月天久久婷婷| 亚洲精品又粗又大又爽A片| 日韩欧美一级大黄网站| 五月婷婷色播| 久久怡红院| 亚洲欧美一区二区三区爱爱动图 | 久久婷婷电影| 成人日韩欧美| 四色女婷婷| 婷婷丁香五月激情密臀av| 色五月婷婷亚洲| 五月开心啪啪| 9久热在线视频精品| AV中文在线| 亚洲情欲| 色五月丁香五月五月婷婷| 99久热视频在线| 色综合久久综合中文综合网| 五月丁香狠狠爱婷婷综合| 97干在线看| 天天做天天爽| 99视频| 日韩狠狠色婷婷| 激情婷婷五月天| 婷婷五月噜噜| 另类在线| 丁香狠狠操| 伊人色综合网| 1区2区视频| 久久99这里只有精品视频| 大香蕉九操| 久久九九热38| 五月天播播| 人妻精品一区二区三区| 99热这里只有精品10| 98永久精品| 午夜天天精品视频| 色情五月婷婷| 青青草激情网| 丁香婷五月天| 婷色五月天| 久久激情四射| 久久香蕉影院| 色综合丁香婷婷| 五月综合六月婷婷| 五月色情婷婷开心五月天| 欧美网站视频4399| 免费在线观看AV网站| 丁香五月大香蕉| 天天干夜夜谢| 五月天成人手机在线视频| 色啪网| 欧美婷婷精品激| 丁香五月开心七月| 激情五月天色播| 热久国产| 操一操干一干| 伊人狠狠操| 欧美色色色色色色色色色色影视| 亚洲激情综| 中文字幕成人日韩| 色色欧美色色色| 日日日日日| 九月婷婷久久| 午夜婷婷久久| 色婷婷婷婷五月天| 能直接看的AV网站| 天天在线天天综合网色| 久/久精品99看9| 一区二区免费看| 人人妻人人澡人人爽| 五月婷婷综合天天操| 日欧一片内射VA在线影院| 26uuu| 中文字幕av久久爽一区| 久久九九国产精品怡红院| 天天狠狠干| 丁香五月激情婷婷| 五月天婷爱综合| 综合xx网| 婷婷九月激情| 性爱在线播放av| 婷婷欧美偷拍综合| 婷婷五月深情丁香深爱日韩| 另类专区在线观看| 九月婷婷综合| 久久久97| 99热人人| 99操久久| 97资源碰碰| 欧美性爱一区| 99男人的天堂| 九九99精品视频| 91久久精品无码一区二区三区| 狠狠狠狠狠干| 婷婷五月激情网| 四月婷婷五月丁香| 99色综合| 色五月偷偷| 六月婷久久| 亚州色婷婷| 中文字幕在线免费观看视频| 丁香婷婷性爱| 色九九综合| 狠狠色成人影片| 色色激情| 亚洲乱码日产精品BD| 日日躁夜夜躁狠狠久久AV| 国产精品激情AV久久久青桔| 欧美久久一级内射wwwwww.| WW婷婷五月天com| 婷婷激情六月中文| 69精品无码一区二区三区| 日韩精品电影| 黄色片精品| 五月丁香香蕉| 免费AV黄在线播放| 亚洲mm色| 亚洲AV色婷婷人禽五月天| 五月天另类小说| 99色热| 婷综合| 亚洲精品99| 精品久久久91久久影视网| 婷婷五月丁香成人网| 婷五月天六| 黄色五月婷婷| 国产婷婷综合| 婷婷五月深爱五月| 天堂网啪啪| 午夜丁香婷婷| 天天日天天久久青青| 美女视频图片久久91| 中文AV在线观看| 亚洲激情av| 狠狠干总合| 五月婷婷啪| 日本久久高清| 激情99| 3DAV亚洲香蕉久久 一区二区| 五月丁香色婷婷色| 色五月丁香五月激情五月激情| 毛片新网地| 无码橾| 色婷婷成人做爰A片免费看网站 | 一二线视频 另类| 超碰在线观看成人视| 91蜜桃婷婷狠狠久久综合9色| 五月婷综合性中心| 综合AV在线| 五月色丁香国产在线视频| 丁香五月香蕉| 人人播| 中文字幕91,综合| 国产91视频| 久热中文字幕在线线观看| 亚洲免费观看高清完整版AV线| 色人久久| 99热精品超碰| 婷婷伊人无码| 99热亚洲精品| 九九成人| 中文字幕无码成人电影| 婷婷 久综合| 夜夜躁爽日| AV电影在线播放| 日韩成人电影Av| 六月丁香视频网站| 思思热精品在线| 天天操夜夜操| 久久婷婷五月综合啪| 天天草天天爱| 九月av| 九九爱激情| 黄色AV日韩| 色五月首页| 日本欧美成人片AAAA| 91人人妻人人操| 六月亚洲| 丁香婷婷六月天| 亚洲区在线| Xx色综合| 天堂五月婷婷| 艹B高清无码| 丁香久久| 这里只有精品视频免费在线观看| 国产精品人成A片一区二区| 婷婷七月丁香色色| 丁香婷婷伊人| 九九色色| 天天操中文字幕| 五月天色婷婷成人| 另类少妇人与禽zOZZ0性伦| av国产精品偷| 欧美一级操逼视频| 青青久在线视频免费观看| 色五月激情网| 99热成人| 婷婷丁香大香蕉| 婷婷五月丁香基| 天天色视频| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 啪啪色激情五月天| 婷婷综合成人五月天| 99热在这里只有精品| 亚洲成人另类| 五月天开心激情综合网| 丰满少妇猛烈A片免费看观看| 婷婷色婷婷| 色九亚洲| 色婷成人狠干| 天天干天天操| 日韩成人不卡| 日本人妻丁香婷婷久久寝取熟女五月| 丁香五月香蕉| 99在线热视频| 九九热免费| 665566 无码| 激情亚洲婷婷六月| 五月综合色| 婷婷五月成年人| 激情五月天影院| 激情综合无码| 午夜成人天堂久久无码日韩久久| 亚州激情九月| 99久久玖玖| 99久| 五月婷婷导航| 九九精品在线观看视频6| 婷婷影院A成人| 操逼在线视频| 免费看欧美成人A片无码| 99热香港| 中文字幕日产A片在线看| 久久五月天合网| 激情五月婷婷| 夜夜爽天天| 97色在线| 五月婷婷六月激情在线| 天天天天干| 狠狠肏综合网| 国自产拍偷拍精品啪啪一区二区| 色五月天中文字幕| 蜜桃成语时李时珍 免费| 天天成人综合| 少妇大叫太大太粗太爽了A片| 狠狠干总合| 九九操屄| 丁香五月婷婷色| 亚洲人成网站999久久久综合| 婷婷五月花西瓜| 丁香五月天激情四射网络不好| 女高怪谈在线观看| 色婷婷综合在线| 久久久无码精品成人A片小说| 日韩超碰在线| 大香蕉人妻| 人妻射精AV| 97精品人人A片免费看| 精品99在线看| 中文字幕亚洲-区久久99婷婷| 丁香五月婷婷激情蜜桃| 五月丁香偷拍| 美女精品一级不卡视频| 琪琪色五月天| www.99热| 天天日夜夜夜操操操操| 欧美三级视频| 激情五月天综合网| 五月丁香av中文| 丁香九月婷婷| 久热a| 人妻六月天| 五月丁香婷中文| 亚洲精品va| 九九操屄| 天天爽天天操| 九九热这里只有精品7| 中国女人做爰A片| 天天做天天爱天天玩夜夜爽| 少妇婷婷五月天| 五月综合久久| 婷婷成人丁香色情基地30 | 97九色视频| 丁香婷婷六月婷婷六月婷婷六月婷婷| 国产欧美日韩综合精品一区二区| 五月天激情无码专区| 97九色视频| 久久人妻精品| 婷婷丁香人妻天天久久| 999激情视频| 色色丁香| 《蜘蛛女》梁铮1995| 欧美久热| 欧美综合婷婷网| 99热99草97| 五月天综合视频| 五月丁香欧美在线| 91色九| 日产精品一线二线三线芒果| 青青草成人网| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 成人片在线播放| 丁香激情综合| 国产婷婷色五月| 奇米色大香蕉| 欧美黄色AA片哗啦啦啦| 久久机只有这里精品| 亚洲AV日韩无码| AAA级久久久精品| 99久在线精品| 丁香欧美| 九九精品在线视频观看| 久色大香蕉|