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
返回資訊列表
亚洲日日操| 日 日干 日日做| 思思热视频在线| 婷婷五月成人有| 久久久国产精品黄毛片| 久久九区| 99色色色色| 色色丁香婷婷| 男人天堂 久久| 狠狠干狠狠色| 亚洲无码99| 激情丁香久久| 五月激情啪啪| 五月丁香啪综合| 欧美激情五月天| 99热在线播放| 色婷婷裸体色性在线| -91九色大屁股| 影音先锋高清无码资源网| 野战毛片三一3| 丁香五月天在线视频| 热婷婷在线视频| 香蕉综合在线| 97碰碰视频在线观看| 天天干-天天日| 开心五月婷婷婷美女| 99国产在线精品视频| 少妇搡BBBB搡BBB搡毛茸茸 | 99综合视频| 亚洲六月婷| 99热九九这里只有精品| 99ri精品视频在线观看| 在线网黄| 激情五月天婷婷| CAOBIBI| 成人综合网站| 日本不卡高字幕在线2019| WWW,五月| 欧美色色日韩| 日韩AV在线免费观看| 岛囯综合激情网| 裸体做A爰片毛片A片免费| 五月天婷婷綜合院| 97香蕉碰碰人妻国产欧美| 色五月亚洲开心网| 五月激情婷婷丁香| av在线观看网站| 99精品在这里| 久久玖玖综合| 婷香五月| 婷婷性爱| 国产在线网址1| 黄桃AV无码免费一区二区三区| 开心激情网五月天| 风流少妇A片一区二区蜜桃| 五月婷婷性爱| 五月婷婷啪啪啪啪| 探花搜索结果 - 黄上黄| 玖玖玖婷婷婷| 九九色影视| 99久在线精品| 99在线观看免费精品视频| 六月婷婷激情| www激情网| 色色综合视频| 无码动漫av| 99色在线| 欧美性生交XXXXX无码小说| 亚洲AV免费在线| 久久婷婷影院| 五月激情天天干| 婷婷五月天狠狠| 拳交大逼| 丁香五月在线观看| 五月综合激情网| WWW色色色COM| 99热婷婷| 婷婷深爱五月天| 欧美性爱五月天| 狠狠的日| 色99视频| 色久女| 色色五月婷婷久久| 69er小视频| 五月丁香婷婷激情澎湃四射| 五月香婷婷| 九九香蕉网| 少妇伦子伦精品无吗| 亚洲成人影视在线| 91九色网| 色播五月网| 久久曰曰| 激情婷婷综合网| 久久婷婷六月综合资源| 日韩无码专区| 丁香五月在线自慰| 99爱最新免费视频在线观看| 五月丁香六月色| 五月丁香婷婷欧美| 大香蕉九九| 五月开心久久| 伊人啪啪网| 国际国外精品欧洲南美洲专区无码不卡| 情婷婷五月天| 五月婷婷五月天| 超级碰碰97在线| 伊人天堂婷婷| 99er免费在线观看| 激情六月婷婷| 色色色色色九九九九九| 丁香综合伊人| 综合99综合久久久久久久| 婷婷五月色| 九九99精品视品| 亚洲电影中文字幕| 国产精品视频免费看| 九九久久偷拍| 五月丁香色色综合| 26uuu日韩| 伊人久久婷婷| 狠狠爱婷婷爱| 五月综合婷婷五月| 99五月香婷婷丁香在线视频| 婷婷五月激情网站| 色婷婷a v| 大战熟女丰满人妻AV| 丁香 亚洲 久久| 激情五月综合六月丁香婷婷狠狠干| 五月丁香六月| 日韩AV免费| 欧美性二区| 婷婷婷婷婷婷婷五月丁香| 99热色精品| 日韩av网站在线观看| 成人色情五月天婷婷丁香| 亚洲成人在线综合| 另类激情首页| 日本在线观看99| 色色色综合网| 中文无码婷婷| 日韩精品999| 丁香五月激情综合啪啪| 日韩av手机在线观看| 九九热av| 色~性~乱~伦~噜| 青青久久91| 天天肏屄夜夜爽| 碰97久久| 色噜噜五月天| 国产成人AV在线播放| av大片在线| 99久久久| 精品人妻一区| 操笔无码| 亚洲精品V天堂中文字幕| 超碰免费大香蕉| 天天干 夜夜爽| 97人妻超级碰碰碰碰碰| 久久久五月婷婷| 最近中文字幕2019视频1| 99色天堂| www.色综合| 久久久婷婷婷| 综合色99| 五月丁六月香av| 久99热| 色婷婷久久综| 日韩欧美一级大黄网站| 91se在线视频| 色99色| 天天色综合天天| 新97人人上人人| 久久综合首页| 一起草AV| 颜射 精品性爱av| 中文成人在线| 色欲久久99精品久久久久久| 亚洲这里只有精品| 噜噜操操| 亚洲无码99| 久热伊人| 五月婷婷亚洲天堂97色婷婷| 亚洲狠狠干| 久人人操| 色色a| 成人视频九九| 色色色五月天婷婷| 五月天婷婷无码| 色婷成人狠干| 欧洲综合视频| 五月婷高清视频| a网站免费观看| 丁香五月天激情婷婷丁香六月| 俺去也婷婷| 婷婷五月综合欧美在线播放| 色婷婷av综合网| 天天插AV丝袜中| 9久久AV| 色婷婷激情| 婷婷综合色色| 久久久婷婷五月天| 五月综合激情| 综合在线丁香五月| 五月丁香九九| 性一交一乱一交A片久| 亚洲五月婷天天操| 五月婷久久草| 超碰v| 91精品久久久久久综合五月天| 久久玖玖综合| 久久XX| 五月六月激情| 爱射综合| 拍色综合| a在线观看| 五月天停停成人网| 国产99美少妇| 精品爆操| 欧美婷婷色| 婷婷五月六月丁香| 六月婷婷狠狠| 综合激情五月婷婷| 五月婷婷色在线| 色综合色| 夜夜操狠狠操天天操| 久草九九| 婷婷丁香成人色综合| 欧美性猛交99久久久99| 五月丁香六月情婷婷久久| 一起操 91N.com| 色九九综合| 欧美日本一区二区三区| 九九色中文| 狠狠色色色| 久久伦乱| 天天狠狠干| 入口五月婷婷六月香| 99久久婷婷国产综合精品| 亚洲熟妇无码乱子AV电影| 色丁香五月天射婷婷爱婷婷| 狠狠色丁香久久婷婷综合五月| 色五月婷婷网| 另类激情五月| 久久人妻伦理| 欧美成人网婷婷综合在线| 91精品人妻少妇无码影院| 日韩丰满少妇无码内射 | 五月婷婷激情| 婷婷丁香五月亚洲| 热99这里只有精品视频| 少妇丁香婷婷 | 天天日天天操天天干| 欧美色图天堂网色| 97婷婷久久丁香| 丁香六月综合激情| 五月丁香激情综合网| 五月天天爽| 99re思思在线视频| 五月天婷婷六月激情网| 亚洲AV网站| 人操91在线| 激情99| 黄色五月婷婷| 欧美99热| 在线另类视频| 激情五月天网站| 婷婷五月综合啪| www.激情五月天.com| 成人电影在线免费试看| 五月天婷婷久草丁香| 久久久久久久11111111111| 亚洲中文字幕AV| 五月婷婷亚洲色视频| 国产精品激情五月天色婷婷| 色五月婷婷大| 丁香五月婷婷激情视频播放| 天天拍夜夜爽| 只有久久精品免费| 激情婷婷五月天在线观看| 国产乱码久久| 狠狠 婷婷| 99re熱| 五月婷婷久久综合| 亚洲性受XXXX五月丁香| 干亚洲天堂| 色亚洲无码| 99久在线精品| 丁香五月激情婷婷视频| 色一区高清| 99操中文视频| www.激情.com.| 丁香五月,开心五月,成人婷婷| 天天综合五月| 久久婷婷亚洲| XXXX岛国| 婷婷综合在线观看视频| 婷婷五月天激情网站| 五月丁香六月情亚洲| AV五月丁香| 久久亚洲网| 秋霞午夜理论 | 色色婷婷五月天| 色欲久久综合| 99精品在线| 开心激情站| 九月色婷婷| 深爱激情五月天| 99在线精品免费视频| 成人无码髙潮喷水A片| 最近免费中文字幕大全高清大全1 免费看欧美成人A片无码 | 亚洲欧美丁香五月天亚洲欧美| 久久久久久人妻久久久久久久久久人妻久久久 | 性爱久久| 五月天福利影院导航| 99热草草| 91网站黄| 五月天三级| 国产一级婬片毛片| 99在线热视频| 99色在线观看| 婷婷香蕉视频| 青青.com| 青青草视频福利| 日韩1区2区| pom538精品视频| 九九综合| 极骚大香蕉伊人| 国产AV网页| 性天堂久久| 九九热这里只有精品556| 亚洲激情电影五月天色婷婷丁香一起草| 天天操夜夜玩!| 五月婷婷香| 五月天激情影院| 色五月首页| 久99久视频精品| 91ncm视频| 亚洲国产精品五月天| 9999色色色色| 色色色免费视频| 三级片AAA久久久AAA久久久AAA| 九月婷婷综合在线| 99热最新地址在线| 久久99热这里只有精品| 婷婷成人五月天| 人人操大| 色婷婷五月天天天天天天天天天| 天天做天天爱天天爽| 香蕉久久国产AV一区二区| 国外亚洲成AV人片在线观看| 另类丁香综合| 丁香五月综合福利视频导航| 婷婷人人操| 青草视频在线观看视频| 五月丁香成人| 强伦轩人妻一区二区电影| 亚洲综合色色色| 婷婷天堂伊人| 婷婷五月 丁香六月| 五月丁香人妻| www.99热国产| 色五月婷婷激情综合网| 99热99精品| 丰满少妇猛烈A片免费看观看| 日韩无码乱轮| 久久视频九九视频| 饮料下药迷倒漂亮女同事强干| 第四色色色色色丁香五月天| 丁香丁香激情网| 婷婷丁香五月激情密臀av| 欧美顶级少妇做爰HD| 中文字幕av在线播放| 午夜不卡成人一区二区| 色色色热| 色婷婷操逼| 色婷婷裸体色性在线| 婷婷六月天| 性爱五月婷| 99热自拍| 奇米四色五月天| 99精品视频免费在线播放| 激情欧美五月丁香| 久久精品凹凸分类| 日本狠狠爽| 国产婷婷五月天| 碰超亚洲| 久久机只有这里精品| 依人大香蕉| 激情婷婷丁香色五月| 久久99热 这里有精品| 91九色精品女同系列| 狠狠狠狠青草| 婷婷五月深深爱| 全部老头和老太XXXXX| 综激情网| 9热视频在线观看| 五月色婷婷夜色| 九六五月天婷婷| 激情五月综合婷婷| 婷婷在线视频| 中文字幕成人| 日韩婷婷五月| 色婷五月天| 五月天丁香六月综合| 久色网址| 99精品久久| 色五月婷婷基地| 午夜爱爱网站| 九九热只有精品| 97超碰人人操| 思思久久精品| 日韩五月婷婷| 午夜精品人妻无码一区二区三区| www.久久五月天.com| 九九aV| 亚洲色婷婷| 综合激情婷婷| 天天骑日日爽| 亚洲精品V天堂中文字幕| 九九视频这里只有精品在线播放| 黑人糟蹋人妻HD中文字幕| 五月激情六月| 亚洲中字AV电影在线网站| 五月天三级| 欧洲第一无人区观看| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 国产三级在线播放| 99熟女啪啪视频| 国产精品成人AV在线| 亚洲熟女色| 97干网站| 欧美顶级少妇做爰HD| 米奇激情婷婷| 丁香六月成人网| 激情五月六月婷婷| 综合另类视频| 成人综合网站| 婷婷五月丁香伊人| www.jiujiujiu| 狠狠干夜夜干| 激情婷婷综合五月少妇| 男女免费视频999| 99九九在线| 婷婷 久综合| AA片在线观看视频在线播放| 九九99精品视频在线观看| 亚洲AVwwwwwww| 色偷偷色婷婷| 人妻内射麻豆视频| 欧美日韩国产一区二区| 激情婷婷五月天| 欧美综合婷婷网| 色播色丁香五月| 曰曰久久| 丁香五月综合图片在线观看| 9久久网| 五月丁香色色网| 嫩草综合网| 国产探花一片区| 久久精典| 男人的天堂五月丁香| 色婷婷超碰| 九九热在线精品视频| 99热只有这里才是精品| 国产综合视频婷婷| 亚洲狠狠爱婷婷| 久久精品系列| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 免费观看全黄做爰的视频 | 久青操| 日韩 欧美 国产 一区 二区| 色开心五月丁香| 开心婷婷五月| 日日撸夜夜操| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 超碰在线超碰| 久久综合26p| 另类专区在线观看| 操操操Av| 九九久久99| 亚州操操| 狠狠综合久久综合| 夜精品无码A片一区二区蜜桃| 亚洲热视频| 激情五月激情综合网一级丸片| 91超级碰人人操| 99精品久久| 激情丁香五月| 人人人操97| 色久播播| 美女网黄| 人操人人| 久婷婷久草| 午夜丁香婷婷| 日韩AV大全| www.99热视频| 六月婷婷九月丁香亚洲综合| 色综合xx| wuyuedingxiang99| 久久五月丁香| 免费97碰碰| 好叼操在线观看| 伊人五月综合网| 久久在线大香蕉| 26UUU精品一区二区Com| 五月天免费色| 人人操Av| 丁香五月1页| 夜夜爱影院| 丁香五月婷婷激情蜜桃| 日本二级毛片二级毛片| 国产毛多水多女人A片| 五月婷av| 色色婷婷五月天| 99re热在线观看| 亚洲激情婷婷| 五月婷婷开心五月| 久久99网| 久久综合五月| 无码操B| 五月天 另类图片| 日本熟妇人妻在线| 五月天激情中文字幕| 安息电影在线观看完整版| www.日本久久videos| 99碰碰视频| 丁香五月婷婷激情四射| 99WWW免费视频| 色婷亚洲五月丁香| www狠狠com| 射久久丁香五月| 激情丁香五月| 婷婷五月天丁香激情| 99在线播放| 97超碰欧美中文字幕| 中文字幕人妻AV| 免費观看aV在线网址| 五月色网| 五月天激情四射| 91狠狠综合久久| 99热啪啪| 色香蕉精品五夜婷| 色婷小说| 丁香五月婷婷亚洲天堂| 亚洲婷婷激情综合激情999精品| 色爱爱综合网| 综合色网站| www.久久爱.com| 99色色网| 婷婷五月天亚洲色| 思思热国产| 亭亭五月色男人| 亚洲色频| 色99在线| 久久无码成人| 五月天堂色色| 日韩欧洲亚洲| 九九九九九无码| 色六月天| 五月天婷婷AV| 色丁香久久| 丰满人妻妇伦又伦精品国产| 九九激情| 九九色精品| 五月天婷婷自拍图片在线观看| 97色五月天| 午夜婷婷五月天| 激情久久丁香| 乱岳熟女50岁| 丁香婷婷综合色五月激情国产基地| 岛国操B不卡在线| 丁香六月婷婷综合激情欧美| 五月丁香六月婷婷亚洲激情综合| www,26uuu,c0m,色情| 激情99| 六月激情婷婷| 北条麻妃伊人| 玖玖在线视频福利| 欧美3AaAa大片| 中文资源在线a | -91九色大屁股| 色色啊| 欧美丁香婷婷五月| 狠狠色噜噜狠狠狠狠综合| 五月婷婷 激情按摩| 色婷婷国产精品综合在线观看| 天天做天天爱天天摸| 婷婷.com| 五月天激情网站| 99ri视频在线观看| 色婷婷丁香五月高清在线| 婷婷五月天激情免费在线观看| 99视频精品| 3p九色在线| 99热99在线| 亚洲综合色棒| 婷婷综合五月| 91免费看片| 亚洲AAAA网| 激情久久五月天| www.婷婷com| 伊人久久艹| 色狠狠色综合| 99在线免费观看| 久久jiuwww| 日韩AAA| 综合色情网| 99久久人人| 天天操夜夜啊| 久久精品9| www.99riav99| 婷婷美女精品视频| 97人人射| 91青娱乐青青草| 婷婷五月天激情综合深爱激情 | 国产乱人偷精品人妻A片| 9l视频自拍九色9l视频在线观看| 五月停停丁香| 成人精品视频99在线观看免费 | 激情五月黄色小说| 五月久久婷婷丁香| 久久久婷婷色五月资源网| 夜夜天天久久婷婷| 亚洲色五月天| 五月婷婷99热| h在线看免费版在线看| 亚洲激情四射色| 色噜噜狠狠色综合伊人| 亚洲精品亚洲人成人网| 色欧美影院| 久久精品视频在这里有| 影音先锋男士资源网一区| 丁香五月色播中文在线播放| 思思热在线观看| 久久六月天| 五月天开心婷婷激情网站 | 五月丁香婷婷综合网| 色色综合激情| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 丁香五月婷婷色播艳门照| 天天爽天天爽| 精品久久人妻热| 天天色天天| www.99在线| www.婷婷亚洲基地| 久久久久亚洲AV成人无码电影| 久久久精品人妻| 亚洲视频无| 五月婷婷69| 欧美人人超级碰| www.com五月天| 99re在线免费视频| 五月天婷婷乱论小说| 亚洲激情六月丁香| 五月婷婷之综合激情| 日本玖玖在线| 特级西西4444www无码| 五月香蕉网| 五月婷婷69| 天天综合网~91| 91无码高清| 亚洲色图五月丁香| 91碰碰碰| 亚州欧美国产久精国产99综合视频| 91精品久久久久久77777| 伊人久久激情图区五月| 亚洲V国产V欧美V久久久久久| 四色 爱 婷婷 精品 亚洲 五月天| 国产做A爰片毛片A片美国| 六月伊人婷婷| 99在线视频观看| 99色色色色| 五月天婷婷社区久久综合| 色天堂A| 超碰99在线观看| 日本99视频| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 久久伊人五月天| 天天看片日日夜夜| 久久婷婷丁香花综合网| 欧美成人色婷婷| 丁香五月婷婷偷拍| 亚洲日日日| 亚洲婷婷开心五月| 婷婷综合在线网| 婷婷成人视频| 色色热99| 婷婷久久爱| 9月色婷婷| 五月色情婷婷| 色欲AVV| 久久天堂| 五月婷婷深深爱爱| 9色免费网| 五月丁香av中文| 综合激情五月综合激情五月激情1 天天爱天天做天天舔 | 丁香婷婷久久老熟女综合网| 久久影视婷婷五月| 亚洲天堂久久| 日韩视频99| 久热大香蕉| AV在线不卡播放| 日韩在线观看亚洲| 五月婷久久| 久久五月婷婷视频| 玖玖婷婷五月天| 天天色色天天| 思思热久久阴99| 综合久久十| 激情综合五月| 狠狠色综合久久| 操碰91| 久热精彩视频98| 丁香婷婷色五月| 天天色激情| 色九月婷婷| 123日本不卡在线| 97狠狠色| 国产在线网址1| 天堂久久精品| 狠狠色婷婷六月激情网| 色噜噜婷婷| 中文字幕在线人妻| 人人操AV| 婷婷激情在线| 日本激情综合| 亚洲综合激| 任你擦免费视频| 久久丁香综合香蕉| 五月天激情小说网| 99热这里| 蜜桃五月天| 99热这里只有精品国产免费| 欧美日韩成人在线网站| 久久久宗合视频88| 99热这里只有精品9| 99精品免费视频| 激情 婷婷 插| 精品国产va久久久久| 色情婷| 九热网站| 国产99久久久国产精品免费看| 亚洲综合九九| 99只有这里有精品在线视频| 欧美亚洲操逼| 婷婷 激情 五月| 国产精品久久久久久白浆色欲| 国产超碰av| 夜夜操加勒比| 婷婷五月影院| 天天插天天插天天插天天插| 五月婷激情影院| 99热这里只有精品3| 五月丁香六月合| 丁香五月天色综合| 色播综合| 久久99视频| 视频一二区| 色色色色色综合| 婷久久久| 丁香六月丁香婷婷激情| 青青草免费公开视频| 五月天婷婷基地| 97人人射| 激情综合亚洲| 9+1视频网址| 亚洲永久免费| 婷婷中文在线| 久热婷婷| 99精品视频网| 夜夜骑夜夜操| 99精品视频网| 能看的av片| 五月丁香婷婷综合网| 国产午夜精品AV一区二区麻豆| 激情小说五月丁香在线视频观看视频| 五月婷婷激情性爱| 啪啪综合| 亚洲综合99| 久久99婷婷| 五月天堂婷婷| 99熟女| 五月丁香婷婷啪啪| wwwss在线观看| 久热精品视频在线观| 九月色婷婷| 欧美va精品va老师va| 草综合网| 第二色AⅤ| 日本无va视频| 91dy.av| 丁香五月激情性色郤| 五月丁香黄色| 九九热只有精品| 婷婷在线激情| 久99视频在线观看| 五月天色影院| 亚洲精品又粗又大又爽A片| 亚洲亚洲人成综合网络| 91日在线视频| 永久热91| 日韩综合网络男女香蕉a片| 五月香婷婷| 99爱欧美| 亚洲色婷婷视频| 天天爽天天爽| 国产 码在线成人网站| 操操啪| 丁香情色五月| 成人午夜在线视频| 激情伊人| 五月婷婷视频啪啪美女| 99热这里只有在线| 婷婷五月色色| AAA久久| 黄色片avv| 五月天社区婷婷丁香社区| 大香蕉五月天婷婷| 婷婷五月丁香高清无码| 99热这里只有精品最新| 日韩精品一品二区三区的使用体验| 超碰九九热| 五月婷在线| 国产91在线视频| 成人综合视频在线| 99热久只有精品首页| 色情五月天A片| 超碰三级片| 麻豆AV一区二区三区| 在线一起草av| 五月婷久久| 一级A片天天操夜夜操| 亚洲五月天激情| 五月婷婷香| 久久久久久久久18久久| www.久久爱.com| 久久与婷婷| 999热这里只有精品| 色婷婷六月天| 另类国产欧美视频| 丁香九月婷婷| 丁香五月六月婷婷殴美综合| 国产激情视频在线观看| 日韩在线观看网址| 啪啪 综合网| 开心五激情网| 亚洲免费99| 久久精品凹凸分类| 99精品国产热久久91色欲| 青青福利网| 中文无码婷婷| 日本色超碰| 激情 五月 婷婷 丁香| 五月天婷婷激情在线色图| 99九九精品| 国产高潮白浆一区二区| 色五月婷婷天天干| 丁香五月av| 激情人妻蜜夜系列区| 丁香五月婷婷超碰在线| 99精色| 久久99热这里只有精品23| 99这里| 97操操| 中文字幕av网站| 天综合日日夜综合7799| 国产激情在线| 久久99这里只有精品视频| 色婷视频| 99热热热国产超碰| www.日日夜夜| 狠狠操天天干| 婷婷欧美激情综合| 色五月婷婷色五月| 国产亚洲精品久久久久苍井松| 亚洲最大在线| 亚洲美女网Va| 亚洲人成播放网站| 五月婷免费视频久久久| 色色色欧美| A级毛片高清免费不卡播放谢谢谢谢| 色五月婷婷视频| 丁香五月天婷婷激情| 日本色图综合| 久久综合五月天| 在线播放 精品| 一區四區歐美日韓| 这里只有精品在线观看视频| 五月天婷综合| 色婷婷五月天偷拍| 丁香五月桃花在线激情综合| 性爱电影科技贸易有限公司| 超碰九色| 亚洲午夜精品久久久久久人妖| 婷婷中文无码| 六月久久婷婷| 五月婷婷五月天| 人妻激情网| 丁香五月婷婷在线观看| www,99热在线观看| 先锋av性爱成人电影| 婷婷成人基地| 天天爽日日搞| 久草热久草在线视频| 五月婷婷色播视频| 亚洲综合激情五月久久| 欧美色色色| 色婷婷www| 色婷婷丁香五月| 五月天婷婷久久| 99ri精品视频在线观看| 狠狠色狠狠| 91成人视频| 久99久视频| 99热人人| 五月色影院| 五月色婷婷在线观看| 亚洲精品99| 久久精品爱爱| 激情开心五月天| 激情5月婷婷狠狠干| 天堂成人A片永久免费网站| 97色色色视屏| 国产做爰视频免费播放| 婷婷五月AV| 婷婷丁香六月天激情四射网| 婷婷五月天狠狠| 丁香六月av| 九九热99免费视频| 天天肏视频| 婷婷色色五月天| 精品99久久久久成人网站免费| 色丁香五月婷婷| 日逼免费视频| 久久aaaaa| www99精品| 六月天婷婷| 成人色五月天| 精品综合网在线| 五月婷婷六月丁香在线视频免费在线观看| 婷婷五月天你懂的| 色五月成人| 色五月激情问网站| 久久久91精品| 99这里有精品视频| 91狠狠综合久久久| 99精品偷自拍| 五月激情六月宗合| 色99日韩| 99热精品在线观看| 97丁香五月| 五月天丁香综合久久国产| 色色亚洲视频| 久久婷婷丁香六月天| 五月叮香啪| 玖玖资源在线视频| 欧美色色色| 日韩AV在线免费观看| 成人在线99| 99人人操人人摸| 国产黄色一级片| 99热这里只有精品1| 色婷婷六月开心中文字| 久久免费丁香| 午夜婷婷| 开心五月网| 久久99免费视屏| av在线婷婷| 色七七九九| 四虎婷婷五月天| 狠狠色噜噜狠狠狠888| 色吧五月婷婷| 婷婷色五月大香蕉在线观看| 久久婷色| 操骚货在线| 五月天激情综合首页| 五月婷婷丁香日韩在线| 大香蕉婷婷久久| 色狠狠六月| 婷婷五月天亚洲综合| 思思久久99热只有频精品66| www.9797国产| 色五月天网| 丁香五月手机在线| 4438亚洲欧美| 久99久视频| 人人人人人人人草| 99 r热| 日韩激情网站| 性一交一乱一交A片久| AA丁香综合激情| 五月丁香六月激情网| 色色五月天网站| 欧美天堂婷婷日韩| 色五月播五月| 免费视频99| 日日想日日夜日日操| 亚洲成人在线综合| 婷婷视频在线碰| 亚洲色另类| 欧美激情五月天| 在线色五月婷婷| 综合色99| 婷婷激情啪啪| 亚洲成人AV高清字幕| 婷婷99狠狠躁天天躁| 亚洲综合五月| 狠狠色婷婷六月激情网| 二人电影免费版在线观看| 色播播婷婷| 五月丁香综合啪啪| 天天爱天天爽| 婷婷六月丁香激情综合| 色天堂97| 碰人人97| 日韩艹比| 激情综合亚洲| 99热大香蕉| 91久久免费| 色在线免费观看| 性做爰A片免费视频A片直播 | 婷婷色影院| 亚洲成人中心| 久99精品视频| 大香人妻| www.色欲丁香婷婷| av网址在线播放| 丁香五月色情| 五月天激情小说网| 五月天婷婷视频| 久久婷五月婷| 超碰操网| 五月婷婷激情性爱| 久超超碰| 丁香五月天婷婷中文字幕| 久久人妻视步| 天天xxxxxx天天日| 久热视频这里只有精品68| AV 3P| 怡红院院在线导航网 | 99热这里只有精品1| 91九色在线| 亚洲AV成人在线| 五月丁香色| 欧美97色| 久久婷婷综合网| 91超碰在线观看| 亚洲AV综合网| 色色色婷婷五月天| 久99视频在线观看| 大香蕉久艹| 九九亚洲视频| 色情五月综合婷婷| 激情深爱五月天| 99热在线观看免费精品| 99热这里只有精品55| 日韩无码专区| 成人精品视频99在线观看免费| 午夜少妇在线观看视频| 亚洲亚洲人成综合网络| 色伦专区97中文字幕| 99久久国产宗和精品1上映| 亚洲国产精品VA在线看黑人| 国产在线网| www.久久99精品| 色婷婷综合在线| 日本99视频精品免费播放| 91久久综合| 丁香五月天堂| 美女五月天婷婷| 综合狠狠干| 激情综合色五月丁香六月亚洲| 久久久精品人妻录| 婷婷色色婷婷| 婷婷视频网| 九九久久精品| 玖玖婷婷色欲| 久久日韩婷婷五月| 99色视频在线观看最新| 99久久丝| 色五月婷婷视频| 狠狠狠夜夜夜| 人人澡玖玖一| 狠狠干,狠狠操| 亚州欧美黄色电影| 丁香五月777| 大香蕉520| 超碰AAAAAAV| 99精品视频网站| 97碰碰人人| 性做爰1一7伦| 色色综合热| 国产操碰| 很操日本7| 天天操婷婷| 色综合色色| 色狠狠婷婷| 影音先锋毛片网站| 丁香5月综合啪啪| 九九热在线视频观看| 婷婷丁香久久| 婷婷六月天国产综合| 婷婷中文字幕网| 亚洲综合激情五月天婷婷| 久久人人人人妻| 操逼六区| 丰满老熟妇BBBBB搡BBB| 男人天堂 久久| 26uuu欧美日韩| 99免费视频在线观看爱| 秋霞A V毛片| 电影91久久久| 久久久ww| 色色日韩无码| 婷婷五月综合啪| 中文字幕网伦射乱中文| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 91超碰在线观看| 99精品无码网站| 99热人人| 思思干精品| 天天情天天狠天天透| 久久综合激情婷婷激情| 成人 在线 日韩| 亚洲无码性爱| 色婷婷五月天av在线| 这里只有精品免费观看网占| 伊人婷婷五月天| 骚逼视频一区2区| 婷婷精品| 婷婷六月综合激情| 成功精品影院| 91九色精品| 天天操天爱综合| www.99热这里只有精品| 国产综合丁香五月天| 99视频久久免费视频| 天天天在线观看| 九月激情婷婷丁香| 99热在线观看免费中文| www,天天干| 99国产精品久久久久久久久久久| 综合久久久| www.久久av.com| 精品亚洲国产成AV人片传媒| 久久香蕉福利| 人人噜天天上| 嫩草AV久久伊人妇女超级A| 色九九九九| 激情五月天色婷婷| 99热在线观看| 另类视频综合| 国内外色色色色色成人视频| 在线18av | 无码九九| 激情五月婷| 日本天堂久久| 免费试看小视频 99| 九九无码| 久久久8| 久久色亭亭五月天| 欧美一黄一色一乱一伦| 天天干-天天日| 97自拍视频在线| 婷婷久久五月| 欧美天堂久久| 五月婷免费视频| 婷婷视频在线| 中文字幕无码AV| 热的国产,热的综合,热的有码 | 五月色婷婷综合| 色在线免费观看| 九九综舍久久| 91综合色噜噜| 可以直接看的AV网站| AA片在线观看视频在线播放| 99黄色性生活| 狠狠色噜噜狠狠狠狠综合| 色婷婷瘦婷婷日韩| 丁香五月亚综合图片| 狠狠一日| 九九九九九九九热| 国产午夜精品AV一区二区麻豆| 五月激情丁香六月狠狠干| 成人丁香| 99久久99视频只有精品| 日日夜夜婷婷| 婷婷91| www.99热视频| 国产在线黄色| 久99久在线| 婷婷永久在线| 狼人久草| 超碰在线91| 99热这里有精品| AV色五月婷婷| 激情综合婷婷| 丁香六月婷婷缴情欧美| 超碰99在线观看| 无码网| 丰满女老板BD高清A片| 天干干夜夜操| 日本操B视频| 亚洲第一色区| 墨西哥毛片内射精| 精品无吗va视频免费观看| 天天干天天操天天射 | 99久久婷婷国产综合精品电影| site:ornaments52.com| 五月婷婷性爱网| 热99这就是精品视频| 五月婷婷综合影院| 五月婷婷综合久久| 五月婷婷综合激情网| 狠狠操狠狠操AV| 99成人网站| 五月Huangsewang| 亚洲欧美另类在线23p| 91xxxx九色| 激情丁香六月| 日韩婷婷五月| 亚洲欧洲中文日韩久久AV乱码| 99热这里只有精品69| 五月天色色色网| 久久婷婷五月| 九九色图| 国产精品久久久久久久久久| 丁香婷婷六月在线资源观看| 99免费青青蜜臀| 大香蕉九操| 99热这里只有在线播放| 日木WWW视频| 婷婷五月激情图片| 色情综合| 国产午夜成人免费看片无遮挡| 五月六月激情| 五月丁香久久呀| 国产成人综合网| 玖玖资源站视频| 亚洲一区国产传媒| 久操大香蕉| 99爱无码| 丁香五月婷婷色情综合| 五月激情小说| 五月成人天| 99热18| 亚洲av| 久大香蕉| 99热这里只有精品亚洲| 亚洲色99综合天堂| 激情婷婷久久| 婷婷丁香六月影视| 色吊丝av中文字幕| 欧洲亚洲精品| 人人人人人人人草| 日本综合色色| 五月天婷婷色播综合在线| 九色啦蜜臀| 热热久久精品视频| 97偷拍在线视频| 99热在线只有精品| 六月香五月婷| 97碰碰视频在线观看| 丁香婷婷婷婷十二月在线观看视频| 99热在线观看| AA丁香综合激情|