99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜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应募而来的超M素人 西纯子 10musume-011723-01 | 婷婷性爱无码视频| 五月丁香六月激情综合| 全部老头和老太XXXXX| 五月天激情综合首页| 日逼AV影音先锋男人资源站| 欧美婷婷| 五月丁香综合在线| 这里只有免费的精品| 五月丁香六月婷婷的女人| 色婷婷AV在线| 99re思思精品视频在线观看| 99ri国产精品| 丁香五月在线| 碰97久久| 五月天伊人| 丁香五月天偷拍| wuyuedingxiang| 狠狠爱婷婷丁香| 日本色婷婷五月天成人电影| 激情综合网五月婷婷| 激情综合网 激情五月天| 久久精品63| 另类激情中文| 激情 婷婷| 婷婷色系婷色| 丁香五月91| 亚洲综合五月天婷婷| 中文在线成人| 色色色成人网| 99精品亚洲| 色五月丁香总合网| 丁香五月激情天AV无码| 亚洲另类电影| 5月激情天| 小泽玛利亚视频一区二区| 亚洲亚洲人成综合网络| 国产美女无遮挡裸体毛片A片| 99九九视频| 一级内射毛片| 91n啪啪| www夜夜操| 丁香五月天激情小说| 狠狠爱婷婷爱| 99久久婷婷国产综合| 久久99免费视频网站| 五月丁香婷婷综合| 中文毛片无遮挡高潮免费| 99热免费| 大香蕉手机视频| 91丨九色丨熟女| 五月婷婷色激情| 天天噪夜夜爽| 激情五月色综合| 国产精品色一哟哟| 日本VA视频| 欧洲高清免费久久| 激情五月天婷婷丁香| AV片在线观看| 超极99精品| 亚洲天堂婷婷丁香| 日本九九九九九九| 婷婷五月天综合AV| 狠狠干五月天| 成人无码髙潮喷水A片| 九九热精品| 99热99在线| 丁香色婷婷| 亚洲欧美另类在线23p| 色综合开心五月深爱五月| 涩综合在线 | 激情五月天婷婷丁香| 天天色官网| 五月婷婷开心亚州在线| 日韩综合久久| 久久五月婷| 五月天色色网站| 六月婷婷八月丁香| 成人婷婷| 97色吧| 校花娇喘呻吟校长陈若雪视频| 538在线精品| 亚洲精品V天堂中文字幕| 久久人妻少妇嫩草AV| 欧美三级A做爰在线观看| 九九成人| 久久综合五月情| 97操碰日本女人| 欧美槡BBBB槡BBB少妇| www.婷婷久久五月天| 激情婷婷综合网| 在线观看欧美3区| 丁香婷婷五月人体| 深爱网深爱综合网| 色综合区| 超碰免费电影| 五月丁香啪啪啪免费看| 六月综合婷婷开心伊人| 99热这里只有精品23| 亚洲六月婷| 看国产探花操逼三级片| 区美毛片子| 99色性爰网络| 5五月综合网亚洲| 啪啪激情综合| 亚州色色色| 99日本精品视频热| 色射7856五月天激情四射| 涩九九九九| 天天爽夜夜爽夜夜爽精| 婷婷涩涩五月天| 九九精品热| 无码日本精品XXXXXXXXX | 五月精品99综合| 色玖玖导航| 老司机午夜福利视频金瓶梅| www.久久| 激情中文在线| 午夜精品人妻无码一区二区三区| 久久综合性| 五月婷婷久久网| www.色婷婷| 99精品国产在热久久| 中文字幕婷婷在线| 欧美Va在线| 99爱视频免费| 日日操无码| 婷婷香蕉| 亚洲国产成人在线| www激情网站| 99热99热在线观看| 丁香五月在线观看| 久综合网| 99色综合网| 五月丁香婷庭在线| 99色爱| 色色激情| 99在线69| 狠狠久久婷五月| 色性五月天| 五月婷婷色色| 欧美狠狠草| 人人草人人看| 99手机在线精品视频| 激情小说之五月| 色婷婷电影网| 9热精品| 日日艹思思热| 五月天停婷基地| 久久婷婷色五月| 五月天久久婷婷| 任你日热视频| 九九热精品| 丁香五月天堂网| 噜噜噜狠狠色综合| 99亚洲大片精品永久在线观看| 天天操天天操天天操天天操天天操| 伊人五月综合网| 五月天婷婷在线观看| 婷婷香草网| 丁香六月婷婷五月天| 人人操插| 婷婷五月天美女| 五月天婷婷视频| 人人操AV| 色婷婷成人做爰A片免费看网站| 任你艹| 成人免费在线电影| 五月丁香啪啪激情| 五月婷婷丁香| 深爱激情网五月天| 秋霞AV美国| 色激情五月| 久久久久9| 七七九色| 五月婷婷啪啪| 日日操天天| 就爱日五月天| 九色视频91| 色婷婷久久| 五月婷婷五月天| 六月亚洲| 成人免费视频一区| 天天操天天插| www.seqingwuyuetian| 婷婷视频在线| 亚洲AV成人精品日韩在线播放| 亚洲成人超碰| 大香蕉综合网| 婷久久高清| 亚洲另类婷婷五月综合| 91凹凸在线| 婷婷综合激情| 91色在线 | 日韩| 九九99热| 综合狠狠干| 中文字幕无码AV| 久久视频这里99| 五月色情| 日韩另类| 日韩在线aaa| 久久婷婷五月激情综合| 色婷婷在线视频| 综合xx网| 99精品国产热久久91色欲| 久久婷五月天| 荷兰av一级| 亚洲激情校园| 熟女网站久久| 亚洲色图欧美色图日本视频| 五月丁香激情四射| 色欲日日躁| 国产三级片91| 激情视频婷婷五月花| 99久久国产宗和精品1上映| 思思热在线免费视频| 亚洲AVDVD| 99精品视频免费观看| 天天操九九插| 人人爱干人人爱草| 很很色丁香久久停停| 99亚州综合精品成人网| 色五月播五月| 激情五月丁香综合网站| 四色 爱 婷婷 精品 亚洲 五月天| 九九99九九精品视频| 婷婷五月情| 婷婷无码视频| 内射激情在线| VA五月激情在线| 九九中文字幕九| 国产精品天天狠天天看| 久久五月天综合| 久草a片| 色色色网站| 欧洲亚洲午夜| 亚洲无码yw| 丁香五月婷婷乱| 99热九九这里只有精品| 在线观看亚洲AV| 国产麻豆视频| 丰满少妇猛烈A片免费看观看| 国产综合婷婷| 99熟女啪啪视频| 天天肏天天爽夜夜爽| 六月婷婷激情| 97色婷| 欧美激情中文字幕| 丁香五月婷婷天堂大香蕉| 五月开心播播网| 九九热视频这里只有精品| 色情五月婷| 99热这| 五月天婷婷开心| 伊人网欧美在线男人天堂五月丁香 | 91丁香婷婷综合久久欧美| 99色在线| 激情性爱五月天网页| 狠狠狠狠狠狠| 婷婷五月丁香激情| 99免费超碰在线| 亚洲九区| 婷婷六月丁香五月图区| 六六久久黄色| 天堂亚洲 在线| 1769在线观看欧美国产| 大香蕉人人网| 久久精品9| 色情婷婷。| 7777精品伊人久久久大香线蕉最新版| 亚洲成人无码网站| 丁香五月激情六月欧亚激情综合导航| 久久这里这里有精品免费视频| 亚洲操人| 色色婷五月天| 色丁香久久久| 亚洲欧美丁香五月天亚洲欧美| 欧美va在线| 99re最新地址| 一级二级色大片| 天天操婷婷| 亚洲午夜av| 综合网亚洲| 婷婷色片| 人妻人人操| 国产又爽又猛又粗的视频A片 | 狠狠色婷婷7| 岛国资源网| 天天色天天舔天天爱天天爽| 久久婷婷五月天激情| 激情深爱五月| 久久只有18视频| 五月天.com| 大香蕉啪啪网| 超碰99热在线观看| 久久丁香五月综合六月激情红杏视频| www.伊人天堂偷偷婷婷| 色五月婷婷色五月婷婷色五月婷婷| 激情六月丁| 91视频精品99| 国产XXXX搡XXXXX搡麻豆 | 亚洲色图81p| 最新va在线播放| www.婷婷五月.com| 另类五月婷婷| 狠狠色狠狠干| 91九色精品熟女内射| 九九色99| av在线免费播放观看| 蜜桃婷婷狠狠久久综合| 国模淫穴色图| 欧美Va婷色| 97人妻碰碰碰久久| 包操45分钟网站| 99视频在线观看欧| 婷婷少妇激情| 黄色片avv| 婷婷狠狠97| 女婷久久| 色五月丁香伊人五月| 欧美激情综合色综合啪啪五月| 色五月天综合网| 精品热九九| 成人丁香五月| 51国精产品自偷自偷综合| 天天爽人人综合免费7799| 久久婷婷九月国产精品| 久久久这里都是精品| 五六月丁香激情视频| 久久亚洲无码| 色情网综合| 蜜臀AV在线成人| 日韩色色视频www| 特黄三级片| 五月婷婷丁香日韩在线| 色婷婷婷av| 丁香久久久| 丁香五月花影院| 综合色色婷婷| 婷婷五月激情丁香| 久月久在线视频| 丁香色色色| 天天爽免费视频| 国产欧美性成人精品午夜| 91久久久久久久91| 人人爱摸视频| 99资源在线| 激情五月丁香色婷婷| 久久大香蕉同僚| 任我肏视频精品| 婷婷色香六月综合激情| 桃色成人网| aⅤ79成人片| 99这里都是精品6| 无码人妻丰满熟妇奶水区码| 婷婷久久久| 在线视频99| 91九九九九九九| 婷婷丁香77777| 99激情在线| 大香蕉欧美在线| 婷婷五月天激情网站| 性按摩玩人妻HD中文字幕| 激情五月天婷婷直播| 停停五月色宗合| 九月停停| 婷婷 色 丁香 夜| 99riAV成人在线视频| 五月社区丁香| 天天激情站| 婷婷六月色丁香视频在线观看| aa久久| 色色色色色五月| 超碰1999| 97久人人| 激情丁香五月| 久色网| 婷婷色五月丁香六月欧美啪| 久久久色婷婷五月天| 色综合五月天| 狠狠狠人妻| 中字幕视频在线永久在线观看免费| 欧美色狠婷久| 九久久九精品视频| 丁婷婷五月天在线播放| 国产婷婷综合| 久久九九色| 日韩中文欧美| 99ER热精品视频| 婷婷伊人久久综合| 成人网站av免费网站推荐| 丁香五月六月综合欧美| 桃色激情五月天| 91超级碰在线视频| 综合亚洲六月婷婷在线| 欧美三9久九观看| 激情婷婷综合五月少妇| 五月天婷婷操逼视频| 亚洲永久免费| 五月天色婷婷图片| 大胆伊人久久| 激情婷婷五月天| 狠狠干在线视频| 亚洲精品第一国产综合亚AV | 天天拍久久| 欧美丰满熟妇BBB久久久| 综合网激情五月天| 色99婷婷五月天| 91九色首页| 丁香五月婷婷呀| 91久久久久| 欧美色色色色色色| 色婷五月天亚洲| 欧美五月婷婷综合| 99re思思热久久| 婷婷六月网| 99视频啪啪| 丁香婷婷网| 99视频精品8| 色婷婷性爱| 99精品在这里| 亚洲热视频在线| 色色婷| 无码视频国内精品久久久| 久久丁香五月| 婷婷五月丁香婷婷| 人妻av在线| 五月精品99综合| 黄色三级日本| 色色射| Av狠狠色丁香婷| 99亚洲精品综合在线 | 婷婷五月色激情欧美激情| 久久之人妻| 婷婷情色五月| 97人人射| 天天日夜夜曹| 色久综合天天做视频| 大香蕉伊人久久| 真实熟女-91九色| 亚洲五月婷| 99精色| 26uuu国产色| 综合激情专区| 草榴视频黄色网| 五月天久久婷婷| 这里只有精品视频在线| 这里只有精品网站| 秋霞电影理论| 天天草天天舔| 婷婷五月天播| 婷婷色在线观看| 综合日本婷婷| 日本色色色色色色色色一色二色| 五月天婷婷激情小说电影| 丁香五月亚洲| 婷婷六月五月天综合| 久久总和99| 丁香五月激情啪啪啪| 日本丁香五月| 综合五月婷婷| 玖玖热视频| 色综合久久44| 色欲婷婷五月天| 久9久成人精品视频| 狠狠搞亚洲| 玖玖九九99| 色97综合婷婷天天色| 五月色综合| 婷婷五月激情视频在线| 九九婷婷五月天| 五月丁香色婷婷综合| 五月丁香六月婷婷不卡免费无码| 激情的五月| WWW·天天操·视频?| 色色丁香| 五月色丁香成人| 26uuu.| 桃色五月婷婷| 一级黄色影片| 爱之国产色情综合| 99精品视频在线| 七七久久综合| 九九综合网| www.亚洲激情.com| 丁香五月综合无码趴趴| 亚洲成人无码网站| 超碰人人在线| 久久久久久久久久久久久久人妻视频 | 国产操B视频| 国产免费一区二区三区三州老师F1F1.CC| 大香蕉七区| 久婷婷五月天影院| 伊人五月天综合网| 另类小说五月天| 九九热av| 最新五月天婷婷影| 色色色色热| 国产日韩欧美性爱| 婷婷五月四狠狠| 包操45分钟网站| 九九这里精品| 停停五月色宗合| 五月婷在线视频免费播放| A网在线欧洲| AV性爱在线| a久久| 99精彩视频| www.henhenl| 俺去也综合| 狠狠狠狠狠| 婷婷五月天成人网| 51精品国内探花| 亚洲小电影在线观看黄999| 日本精品在线噜噜噜| 色丁香在线视频| 婷婷成年人免费视频| 91久久综合亚洲鲁鲁五月天| 中文字幕日产A片在线看| 久久婷婷五月综合色和| 亚洲高清在线| 91婷婷五月天嫩女| 97色色视频| 婷婷丁香婷婷97| 激情小说五月天| 久久机热这里只有精品| 天天精品视频免费观看| 99精彩视频在线观看| 久久久大香蕉| 五月天天天色| 色情成人五月天| 婷婷丁香视频| 开心五月激情五月丁香五月婷婷| 久久久999精品| 久草丁香婷婷1024| 亚洲V国产V欧美V久久久久久| 超碰在线94| 玖玖伦理电影| 免费亚洲婷婷中文字幕| 激情国产五月| 色色色综合视频| 少妇搡BBBB搡BBB搡毛茸茸 | 婷婷中文字幕欧美| 亚洲一色色色色色色色色| 色五月五月天色婷婷色五月| 久久婷婷综合五月| 久久精品在线| 久热大香蕉| 婷婷五月天桃花网| 丁香婷婷六月天| 色综合九九| 亚州激情九月| 激情五月深爱婷婷| 色色欧美色色色| 久久久久久xxxxx| 影音先锋偷偷色男人站| 综合在线观看99| 欧美狠狠草| 五月天婷婷网站888| 久久99草五月婷婷| 99热在线观看这里只有精品| 国产69精品久久久久999小说| 久久婷综合| 97热久久| 色狠狠色综合| av一区二区电影免费在线观看| 婷婷丁香一月| 国产成人精品一区二三区熟女在线| 九九九九大香蕉| 思思精品热在线| 97干干干丁香| 26uuu激情五月天| 免费AV播放| 婷婷网影院| 五月天成人网在线观看| 91色干| 五月性色| 啪啪丁香五月| 91色婷婷综合久久中文字幕二区| 欧美色图天堂网色| 五月婷婷中文字幕| 丁香色色网| 色色激情五月天| 激情五婷网| 成人短视频在线| 五月婷婷影院| 亚洲色色色| 天天爱天天做天天舔| 激情综合五月| 欧美va| 久月久在线视频| 五月激情网综合| 婷婷六久久| 91丨九色丨白浆秘| 91超碰在线观看| 91精品婷婷国产综合久久| 超碰人人操在线| 日韩999| 九九亚洲| 色婷婷丁香五月色综合网| 婷婷福利影院| 97在线视频人妻九色| 欧洲不卡视频| 777米奇影视第四色| 色五月色综合| 夜色.cnm| 色丁香五月婷婷| 99这里有精品免费| 大香蕉视频99| 色欲久久综合| 五月婷婷丁香大陆免费| 五月天伊人久久| 丁香五月香蕉| 婷婷色五月色妇| 婷婷五月a| 另类图片天天影视在线观看| 日韩六六久久电影| www.99精品视频| 99精品网| 欧美成人色婷婷| 91超碰九色| 五月婷婷啪啪| 99热免| 99久久网站| 人人操人人爱丁香五月| www.婷婷亚洲基地| 丁香婷婷五月香蕉91| 丁香五月天堂网| 99精品视频在线6| 婷婷五月天丁香久久| 4399成人黄A片| 高清无码中文字幕aVDV| 午夜爱爱网站| 色婷婷色综合久久精品V| 婷婷五月综合社区| 这里只有精品视频在线看| 亚洲在线综合| 97人人操人人拍| 91精品91久久久中77777| 色婷婷狠狠久久综合五月| 五月丁香六月成人| 97色射| 这里只有精品视频免费在线观看| 婷婷五月草| 狠狠88综合久久久久噜噜噜| 国产精品丝| 免费无码毛片一区二区A片| 久9热视频| 99热最新网址| 开心久久五月天| 第四色五月婷婷| 99精品丁香五月| 亚洲第一第二网站| 成年人最刺激的综合网| 思思久热6| 9999热精品在线免费播放| 99热官网| 五月天桃色深爱网| 91超碰在线播放| 欧美激情综合色综合| 99小精品| 99久久99视频只有精品| 全高清无码视頻| 色99超碰| 激情淫乱男女| 99精彩视频在线观看| 人妻丰满精品一区二区A片| 六月婷久久| 97色色视频| 99热这里只有在线| 99热这里只有精品热| 丁香五月亭亭六月综合激情网| 九九99免费视频| 欧美色九| 成人电影在线免费试看| 91九色国产熟女| www综合久久| 开心久久网婷婷| 色婷婷小视频| 91久久九| 人操人人| 久婷婷色| 久久婷婷五月丁香网| 91互操| 日韩AV在线免费观看| 第四色大香蕉| av在线激情| 51成人| 精品婷婷| 婷婷五月天激情文学小说| 激情婷婷五月天。| 成人在线观看国产| 99在线精品免费视频| 国产精品人人做人人爽人人添 | 97在线精品视频| 五月婷婷三级| 九九热九九| 久久这里只有国产| 丁香六月激情综合网| 婷婷丁香五月天小说| 亚洲激情色色| AV性爱网| 婷婷伊人五月天| 色婷婷五月天| 在线观看视频1区| ady狠狠入| 国产婷婷五月天| 九九成人精品免费视频| 天天干天天日天天插| 久久久久99精品成人片| 可以看的AV| 久久a热| www色婷婷| 五月丁香青草综合啪啪| 99色性爰网络| 99视频在线| 噜噜噜狠狠色综合| 男人的天堂99| 狠狠香蕉| 狠狠五月天婷婷激情网。| VA婷婷亚洲| 色色国产| 九九视频在线观看| 超碰天堂网| 九月激情综合| 综合久色五月| 思思久久99| 久久综合五月天| 亚洲a色| 五月婷婷无码| 操日本99| 久久久com| 天天舔日日肏夜夜爽| 丁香婷婷六月天| 中文字幕网伦射乱中文| 99久久.www| 色五月涩涩婷婷蜜桃| 婷婷五亚洲| 成人看片网站| 强奸幻女毛片| 欧美va国产va| 操逼六区| 日本三级99人妇网站| 久久久99久久| 99re思思久久| 少妇人妻偷人精品无码视频新浪| 色婷婷狠狠久久YY| 99惹精品视频| 六月婷婷色综合| 伊人激情综合网| 久久婷婷五月天大香蕉| 中文字幕 码精品视频网站| 99免费视频网| 人妻体体内射精一区二区 | 激情综合色| jizzdr| 午夜精品人妻无码一区二区三区| 久久的爱大香蕉| 青青草六月丁香| 丁香六月欧美| www.9797国产| 青青草99热久久精品国| 欧美色色色色色色| 超碰高清在线| 日本高清综合网五月丁香| 婷婷久久五月天| 亚州色色色| 亚洲色涩视频| 伊人五月天| 日本丁香五月| 亚洲无aV在线中文字幕 | 天天舔天天| 最新无毒无码AV| 精品成人无码A片观看香草视频| 九九精品热| 91久久国产综合久久| 伊人婷婷五月天av| 五月天操逼网| 婷婷五月天色| 99热都是精品| 婷婷夜夜夜夜| 日本在线wwww| 97亚洲婷婷| 天天干夜夜操A片| 97香蕉人人在线观看| 蜜臀嫩草| 婷婷大美在线| 91超碰在线观看| 99在线观看视频| 三人荫蒂添的好舒服A片| 婷婷综合视频| 婷婷五月天av| 欧美美美女性色视频| 日韩狠狠色婷婷| 亚洲综合激情五月久久| 日韩无码色色| 五月六月婷婷| 五月丁香六月激情啪| 美女久久天堂| 色婷婷成人做爰A片免费看网站| 国产精品爽爽久久久久久| 美国色五月天婷婷资源站| 五月婷婷色吧!| 丁香六月爱综合| www.爱操com.| 精品人妻久久久久久久| 2w在线视频| 久久久久久丁香五月| www.俺去也com| AV性爱在线| 99亚洲天堂| 国产SUV精品一区二区6| 婷婷五月天丁香久久| 五月天激情久久| av线电影| 91五月天| 婷婷色五月久久| 五月天婷婷丁香六月| 青草五月天| 五月激情婷婷在线| 麻豆AV一区二区三区| 久久99草五月婷婷| 九九热在线99| 五月天色婷婷激情综合| 亚洲综合婷婷六月丁香五月| 这里只有精品在线观看视频| 色九九九九| 丰满女老板BD高清A片| 久热A片| 丁香六月狠狠干| 欧美人人操| 国产在线另类五月婷婷| 亚州操操| 色99最新网址| 五月婷婷六月丁香免费| 婷婷五月天激情视频| 五月婷婷AV| 大地资源色婷婷视频在线| 欧美日本97| 激情五月婷婷欧美极品| 夜夜操天天干| 色色国产| 久久婷婷五月综合97色一本| 亚洲亚洲亚洲AAAAAA| 国产日比| 日韩 mm 不卡| 可以直接看的AV网站| 激情五月婷婷网| 国产精品电影网| 久久偷拍综合五月天| 亚洲精品一二三| 插插网爽妇五月丁香| 饮料下药迷倒漂亮女同事强干| 99精品国产在热久久婷婷| 婷婷婷婷婷开心无码播放| 五月综合激情网| 播五月丁香六月| 久久久五月天婷婷| 99视频这里有精品免费观看| 97luluse| 99亚洲无码| 狠狠色丁香婷婷| 亚洲激情综合| 啪啪激情综合| 天天玩夜夜操| 青青草视频福利| 日本va欧美va欧美精品88| 无码免费人妻A片AAA毛片西瓜| 国产精品噜噜在线视频| 色逼综合网| 婷婷五月天基地| 色欲色天天香综合| 成人精品视频99在线观看免费 | 人妻久久久久久| 色丁香五月天| 伊人久久婷婷| 91精品综合久久久久久五月丁香| 五月婷婷丁香六月| 激情五月激情综合网| 五月婷网站| 五月天婷婷爱| 99超级碰免费视频| 99热免费看| 狠狠干五月天婷婷网| 教师性爱毛片| 日韩在线视频网站| 思思精品久久艹| 大香蕉五月天婷婷丁香91| 亚洲欧洲另类| 97热在线精品| 5月婷婷性视频| 久久久jd| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 亚洲黄色操逼| 久草热在线视频| 日日杆天天| 狠狠色无码| 九九热在线亚洲免费视频| 99热资源在线| 碰碰碰碰碰99| 99热在线极品极品| 超pen个人视频97| 人妻久久久久久久| 九热精品| 啪啪操超碰| 九月色婷婷综合| 五月天综合在线观看| www.av视频xx999.com| 狠狠情色| 亚洲韩国日产综合AV| 亚洲国产精品VA在线看黑人| 天天干狠狠| 五月丁香婷婷久久| 婷婷五月天小说| 五月天综合在线观看| 日批在线看| 变态另类色图| 男人大jjc女人免费视频| 伊人婷婷五月天| 啪啪色区| 精品人妻在线| 少妇搡BBBB搡BBB搡毛茸茸 | 日韩乱玛久久| 五月丁香激情深爱婷婷| 日日操,日日爽| 再次出发二| 天天色天天爽| 99久久a线观| 狠狠五月天婷婷| 99激情视频热| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 婷婷性爱五月天丁香网| 99久操视频| 免费AV在线| 天天上天天爽| 日熟女| 99久久精| 丁香五月av在线| 五月丁香六月| 五月婷婷五月天| 五月婷婷婷色| 人妻AV在线| 五月丁香激情欧洲啪啪| 激情丁香九九五月综合网| 色情综合网| 都市激情亚洲| 狠狠搞综合色| 五月丁香好婷婷A片网| 五月天婷婷小说| 五月丁香婷婷婷激情爱爱| 丁香五月六月久久综合 | 激情www| 99性爱精品| 狠狠草在线观看| 五月婷婷婷| 蜜桃婷婷丁香综合久久开心亚洲| 四季日韩AV无码综合| 五月丁香花视频| 丁香五月激情啪啪| 思思国产99| 亚洲这里只有精品| 超碰在线个人观看| 五月婷婷激情综合| 婷婷五月天免费视频| 久草五月婷婷| 综合激情九月婷婷,激情综合婷婷中文字| 国产,欧美,学生妹,视频| 日本天堂免费99| 五月丁香性爱| 亚洲中文丁香| 婷婷丁香97| 欧美高潮9| 99re久久| 日日懆天天懆| 人妻久久久| 91视频精品99| 亚洲射激情| 青青热久久综合| 色九月婷婷综合| 欧美超碰亚洲| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 婷婷激情视频| 一起草日本| 99热这里只有精品1998| 91婷婷| 亚洲操逼片| 另类 在线| 五月婷婷,六月婷婷| 五月综合婷婷久久在线| 欧洲色色| 丁香五月花婷婷开心| 亚洲av网站| 五月婷婷|欧美| 九九99精品视频在线观看| 激情四射亚洲| 五月丁香伊人网| 成人片黄网站色大片免费毛片| 久久伊人大香蕉| 噜噜干日本| 99精品一二三四视频| 五月天啪啪啪| 大胆伊人久久| 婷婷五月天六月丁香| WWW.久久99| 久久精品视频在这里有| 日本久碰| 天天做夜夜爽| 9超碰在线| 播五月,色五月,开心五月播放器| 久久久精品99| 久久久久人妻| 婷婷激情视频| www久久99| 97自拍视频在线| 天天爽天天干| 久久五月人人摸| 国产精品久久久久久久久久 | 欧美色图片88| 六月天丁婷婷| www.1024久久| 婷婷刺激综合| 大香蕉婷婷色| 天天做天天爱天天爽| 色99亚洲| 丁香88AV五月婷婷| 亚洲激情综合免费| WWW·色色色·COM| 婷婷五月情| av婷婷丁香 六月| 少妇性按摩无码中文A片| 美女激情婷婷| Y11111111111少妇电影院| 婷婷五月激情图片| 丁香花五月天激情| 狠狠综合| 天天干天天操| 午夜丁香综合婷婷| 99精在线| 天天综合亚洲综合| 东北黄色一级| 99操99| 天天艹天天色| 99热九九在线| 99操99| 五月天色在线| 婷婷久久影院| 婷婷五月色| 日本不卡五月婷婷丁香| 丁香婷婷综合激情五月色| 免费观看的av| 久久人妻视步| 亚洲啪啪啪啪| 久久婷婷五月综合色欧美| 久久天天| 九九视频精品这里只有| 亚洲天堂AV综合网| 操99| 狠狠五月天激情| 色播播婷婷| 亚洲夜五月| se婷97| 99热这里只有精| 婷婷瑟瑟五月天| 婷婷五月天色色| 久久人人添人人爽添人人片αV | 婷婷丁香五月噜噜噜| 91久久五月天| 丁香五月五月婷婷欧美大香蕉| 天天色天天日天天舔| 开心婷婷五| 99九九热视频免费| 丁香五月激情网| 五月丁香六月婷婷啪啪| 五月天亚洲最大成人| 久久九九99桃花视频| 亚洲中文字幕在线观看| 五月婷婷综合在线| 五月天激情中文字幕| 中文AV在线播放| 七七久久综合| 99热这里有精品24| 色人久久| 91丨人妻丨国产丨丝袜| 国产午夜成人AV在线播放| 久久3p| 五月婷导航| 丁香五月婷婷久久久| 538任你爽视频不一样的| 精品久久久中文字幕大豆网推荐理由| 婷婷丁香97| 亚州操人在线视频| 天天日夜夜草进麻麻的子宫| 久久久激情视频| 亚洲av无码影院| 91 九色大美女| 久久丁香五月天| 婷婷的色色五月天| 激情六月婷| 六月色婷婷欧美| 激情性爱五月天| 丁香五月综合无码趴趴| 久久婷综| 99在线精品免费视频| 超碰碰碰碰| 91人操人人人操人| 天天噜噜| 深夜A片| www激情网| 色婷婷综合中心| 无码免费人妻A片AAA毛片西瓜| 天天操无码| 五月婷婷五月色| 丁香激情综合| 九九机热| 婷婷伊人五月| 密乳视频| 丁香开心深爱| 欧洲激情五月天婷婷| 这里只有精彩小视频视频网站| 色五月婷婷在线| 欧美操逼天堂| 538任你爽视频不一样的| 激情九九九九| 丁香五夜激情四射夜夜夜| 亚洲中文字幕翔田千里| 91夫妻网站九色| 国产欧美性成人精品午夜| 五月婷婷开心网| 婷婷五月激情五月激情| 激情五月天丁香| 中文字幕在线日亚州9| 亚洲另类婷婷综合| 欧美人人操| 人妻激情在线| 激情綜合網址| 91九色丨国产丨爆乳| 影音先锋一区| 97人人射| 99热精品在线播放| 婷婷99狠狠| 亚洲爆乳无码精品AAA片蜜桃| 99热精品免费| 日本无码专区| 色噜噜狠狠狠狠色综合久欧美| 婷婷五月天最新网址| 大香蕉伊人99| 狠狠做婷婷| 99激情| 久草丁香婷婷1024| 色综合久久88色综合天天| 97人妻碰碰碰久久| 久久五月激情综合| 激情五月天在线观看婷婷| 色综久久AV| 99热99这里有免费的精品| 99亚洲无码| 久久婷婷五月综合| 婷婷五月丁香综合| 五月综合色| 婷婷成人av| 色噜噜97视频在线观看| 99re思思热在线视频| 日韩av干| 丁香五月人妻| 伊人狠狠丁香婷婷综合尤物| AⅤ网站在线看| 996热re视频在线观看视频| 99干99| 六月婷婷深深爱| 99热这里有精品2| 九九精品免费| 开心激情综合| 色婷婷成人色网| 91肏| 欧美99热| 国产偷人妻精品一区| 成人视频一区| av网址在线播放| 久久9热| 色婷婷五月天激情久久| 亚洲视频图片婷婷五月| 五月丁香婷婷色| 激情五月天天| 啪啪激情综合| 精品成人无码A片观看香草视频| 五月天成人在线播放| 日韩人妻无码专区| 激情五月九九九| 激情无码五月天| 深爱激情丁香| wwwss在线观看| www.激情五月天.con| 色婷婷五月天天天天天| 婷婷五月天开心网| 五月天婷婷久久| 五月天丁香综合在线| 免費亭亭成人| 午夜丁香综合婷婷| 激情婷婷丁香五月| 久久综合干| 色99热| 五月天综合网| 色婷婷久久综| 2w在线视频| 99视频这里有精品| 色涩影院六月丁香| 26uuu激情五月天| 色婷久久| 欧美日韩日韩成人| 色婷婷综合五月| 99超级碰免费视频| 九九亚洲视频| 成人精品视频99在线观看免费| 一区二区乱码视频| 99热日韩| 99在线精品免费视频| 97干视频| 天天爽天天干| 九九九九九九九九九九九九九九九九九九九在线视频 | 激情五月天婷婷| 教师性爱毛片| 激情五月激情综合网一级丸片| 最新av在线观看| 激情骚五月| 天天檫天天爽| 国产乱妇无乱码大黄AA片| 日韩成人电影AV| 99精品综合| 婷婷狠狠香蕉综合| 天天撸夜夜爽| 99激情视频| 99这里是99在线视频| 久久久久久激情| 91疯狂操操操操| 99久久极情精品一区| 国产av天天插天天操天天爽| 三区激情四射av| 激情综合网五月婷婷| 色色色综合色| 色色色综合| 第四色网婷婷| 人人摸人人搞| 一区操| 丁香五月五婷| 九九爱精品网站| 婷婷激情啪啪| 五月天综合在线网| 五月丁香婷中文字幕| 青青草视频免费观看| 亚洲中文无码成人| 九九99精品视频在线观看| 91狠狠色丁香婷婷综合久久| 91精品久久久久久| 九九热黄色| 六月丁香婷| 97色在线| 日日夜夜干| 天天免费成年人视频| 亚洲精品久久久久久久久久吃药| 激情综合五月激情| 免费看欧美成人A片无码| 综合狠狠干| 色五月综合激情网| 婷婷草| 五月丁香六月婷婷久久|