当前位置: 首页 > news >正文

东营建设信息网站电话seo研究中心vip教程

东营建设信息网站电话,seo研究中心vip教程,网站如何在百度刷排名,旅游网站开发目的Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些… Unity BuffSystem buff系统 一、介绍二、buff系统架构三、架构讲解四、框架使用buff数据Json数据以及工具ShowTypeBuffTypeMountTypeBuffOverlapBuffShutDownTypeBuffCalculateType时间和层数这里也不过多说明了如何给生物添加buff 五、总结 一、介绍 现在基本做游戏都会需要些buff之前我也在网上找也看到很多别人写的buff系统并不是很符合我的心理预期大部分在网上看到的都是面向过程的而不是面向对象的独立开来的buff这样每改动一个小地方或者写一个buff基本上就要改动整个框架的部分这对合作开发来说是比较致命的就一个人来做的话还问题不大但是人一单多了一人写几个buff最后就全乱了今天把我之前写的这套框架发出来经过验证了原来的一个项目大概有3000多个buff能够比较完美的支持下来。 这个buff系统架构我放到CSDN资源中可以进入BGBuffSystem下的SampleScene查看demo。 二、buff系统架构 这里大概做一个的架构细节后面再说。 三、架构讲解 架构这里我就简单说一下整体的逻辑大家可以下载使用看核心。 这里我选择的面向对象也是面向组件的方式这意味着我每一个buff都会创建两个类分别是xxxBuffCtrl操作类、xxxBuffEntity数据实体类当buff挂载时会将对应的xxxBuffCtrl挂载到对应的对象上而xxxBuffCtrl是负责控制buff的具体效果并且持有xxxBuffEntity数据实体他们分别也是继承自BuffCtrlBase、BuffEntityBase。这样上层管理的时候只需要管理BuffEntityBase的初始化数据和BuffCtrlBase对应的上层管理即可。数据用的是json。 Buff层数、buff的移除方式全部移除还是单独移除buff多挂载buff执行次数buff的类型叠加永久重复添加刷新时间刷新层数等我在上层提供了集中常用的类型如果要想添加可以在BuffCtrlBase中写具体逻辑在BuffEntityBase的BuffOverlap枚举中添加新类型。 这里我也提供了很多的接口具体的可以在BuffCtrlBase中看。 using System.Collections; using UnityEngine; using System;public class BuffCtrlBase : MonoBehaviour, IDisposable {#region 基础属性/// summary/// Buff信息/// /summarypublic BuffEntityBase m_buffInfo;/// summary/// 人物控制器/// /summarypublic RoleAttribute m_Self;/// summary/// 敌人控制器/// /summarypublic RoleAttribute m_Other;/// summary/// 是否触发/// /summarypublic bool m_IsEnable false;#endregion#region 辅助计算使用/// summary/// buff Ctrl层的限制时长 根据Entity的m_LimitTime获取/// /summarypublic float m_CtrlLimitTime 0;/// summary/// 辅助计算使用/// /summaryprivate float m_CtrlFrequencyTimer 0;#endregion#region 进入buff初始化/// summary/// 进入Buff/// /summarypublic virtual void BuffOnEnter(RoleAttribute self, RoleAttribute other, string json){m_Self self;m_Other other;m_IsEnable true;}/// summary/// 初始化/// /summarypublic virtual void InitAttr(){}#endregion#region 暂停继续buff/// summary/// 暂停buff/// /summarypublic virtual void PauseBuff(){m_IsEnable false;}/// summary/// 继续buff/// /summarypublic virtual void ContinueBuff(){m_IsEnable false;}#endregion#region 持续buff中/// summary/// 持续Buff/// /summarypublic virtual void BuffOnStay(){if (m_IsEnable){switch (m_buffInfo.buffOverlap){//计时结束移除 重新复制是将时间叠加case BuffOverlap.OnlyStackedTimeWithLimitTime:m_buffInfo.m_TimingTime Time.deltaTime;m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_IsEnable false;BuffOnExit();}break;//计时结束移除 重新复制是将时间重置case BuffOverlap.OnlyStackedResterTimeWithLimitTime:m_buffInfo.m_TimingTime Time.deltaTime;m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_IsEnable false;BuffOnExit();}break;case BuffOverlap.OnlyStackedLimitLayer:m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}break;case BuffOverlap.OnlyStackedLimitLayerWithResetLimitTime:m_buffInfo.m_TimingTime Time.deltaTime;m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_IsEnable false;BuffOnExit();}break;case BuffOverlap.MoreStackedLimitTime:m_buffInfo.m_TimingTime Time.deltaTime;m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_IsEnable false;BuffOnExit();}break;//永久存在 无需层数叠加 只执行一次case BuffOverlap.OnlyStackedOnePermanent:m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}break;//永久存在 无需层数叠加 每间隔时间执行一次case BuffOverlap.OnlyStackedLoopTimeCallPermanent:m_buffInfo.m_TimingTime Time.deltaTime;if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_buffInfo.m_TimingTime m_buffInfo.m_TimingTime - m_buffInfo.m_LimitTime;InsistCallBack();}break;//倒计时结束消失 无重叠case BuffOverlap.OnlyStackedLimitTime:m_buffInfo.m_TimingTime Time.deltaTime;m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}if (m_buffInfo.m_TimingTime m_buffInfo.m_LimitTime){m_IsEnable false;BuffOnExit();}break;//永久存在现实层数case BuffOverlap.OnlyStackOnePermanentWithLimitLayer:m_CtrlFrequencyTimer Time.deltaTime;if (m_buffInfo.m_Frequency ! 0 m_buffInfo.buffCalculateType BuffCalculateType.Loop){if (m_CtrlFrequencyTimer m_buffInfo.m_Frequency){m_CtrlFrequencyTimer m_CtrlFrequencyTimer - m_buffInfo.m_Frequency;InsistCallBack();}}break;default:break;}}}#endregion#region 持续回调 根据Frequency数据间隔进行调用/// summary/// 持续回调 根据Frequency数据间隔进行调用/// /summarypublic virtual void InsistCallBack(){}#endregion#region 层数回调 根据当前层数进行回调/// summary/// 根据层数进行回调/// /summary/// param namelayer/parampublic virtual void LayerCallBack(int layer){}/// summary/// 减少层数/// /summarypublic virtual void RemoveLayerCallBack(){m_buffInfo.m_TimingLayer--;}#endregion#region 离开buff/// summary/// 离开buff/// /summarypublic virtual void BuffOnExit(){if (m_Self ! null){m_Self.RemoveBuff(this);}Dispose();Destroy(this);}#endregion#region 重复添加buff/// summary/// 重复添加/// /summarypublic virtual void RepeatAdd(){Debug.LogError(重复添加buff);switch (m_buffInfo.buffOverlap){//计时结束移除 重新复制是将时间叠加case BuffOverlap.OnlyStackedTimeWithLimitTime:m_buffInfo.m_LimitTime m_CtrlLimitTime;break;case BuffOverlap.OnlyStackedResterTimeWithLimitTime:m_buffInfo.m_TimingTime 0;break;case BuffOverlap.OnlyStackedLimitLayer:if (m_buffInfo.m_TimingLayer m_buffInfo.m_LimitLayer){m_buffInfo.m_TimingLayer 1;LayerCallBack(m_buffInfo.m_TimingLayer);}break;case BuffOverlap.OnlyStackedLimitLayerWithResetLimitTime:m_buffInfo.m_TimingTime 0;if (m_buffInfo.m_TimingLayer m_buffInfo.m_LimitLayer){m_buffInfo.m_TimingLayer 1;LayerCallBack(m_buffInfo.m_TimingLayer);}break;case BuffOverlap.MoreStackedLimitTime:break;case BuffOverlap.OnlyStackedOnePermanent:break;case BuffOverlap.OnlyStackedLoopTimeCallPermanent:break;case BuffOverlap.OnlyStackedLimitTime:break;case BuffOverlap.OnlyStackOnePermanentWithLimitLayer:break;default:break;}}#endregion#region FixedUpdateprivate void FixedUpdate(){BuffOnStay();}#endregion#region 释放/// summary/// 释放接口/// /summarypublic virtual void Dispose(){m_buffInfo.Dispose();m_Self null;m_Other null;m_IsEnable false;m_CtrlLimitTime 0;m_CtrlFrequencyTimer 0;Debug.LogError(移除释放buff);}#endregion } using System.Collections; using System.Collections.Generic; using UnityEngine; using System;/// summary /// 展示类型 /// /summary public enum ShowType {None 0,/// summary/// 需要展示UI/// /summaryShow 1,/// summary/// 无需展示UI/// /summaryHide 2, }/// summary /// buff类型 获取buf名 找buf实体类和控制类 /// /summary public enum BuffType {None 0,/// summary/// 破甲buff/// /summaryPoJiaBuff 1,/// summary/// 流血buff/// /summaryLiuXueBuff 2,/// summary/// 中毒buff/// /summaryZhongDuBuff 3, }/// summary /// 挂载类型 /// /summary public enum MountType {None 0,/// summary/// 单挂载/// /summaryOnly 1,/// summary/// 多次挂载/// /summaryMore 2, }/// summary /// buff叠加类型 /// /summary public enum BuffOverlap {None 0,/// summary/// 同时只能挂载单脚本计时结束移除 重复挂载时将时间进行叠加 (所需字段 LimitTime(限制时间) TimingTime(计时时间))/// /summaryOnlyStackedTimeWithLimitTime 1,/// summary/// 同时只能挂载单脚本计时结束移除重复挂载时将时间进行重置 所需字段 LimitTime(限制时间) TimingTime(计时时间)/// /summaryOnlyStackedResterTimeWithLimitTime 2,/// summary/// 同时只能挂载单脚本永久存在重复挂载时将层数进行叠加(有层数上限) (所需字段 LimitLayer(限制层数) TimingLayer(计算层数))/// /summaryOnlyStackedLimitLayer 3,/// summary/// 同时只能挂载单脚本计时结束移除重复挂载时将层数进行叠加并将时间重置(有层数上限)所需字段 LimitLayer(限制时间) TimingTime(计时时间) LimitLayer(限制层数) TimingLayer(计算层数)/// /summaryOnlyStackedLimitLayerWithResetLimitTime 4,/// summary/// 同时多次挂载同脚本计时结束移除可以多次重复挂载所需字段 LimitTime() TimingTime(计时时间)/// /summaryMoreStackedLimitTime 5,/// summary/// 仅堆叠一次 永久存在 /// /summaryOnlyStackedOnePermanent 6,/// summary/// 仅堆叠一次 永久存在 每间隔时间执行一次 所需字段 LimitTime(限制时间) TimingTime(计时时间)/// /summaryOnlyStackedLoopTimeCallPermanent 7,/// summary/// 仅堆叠一次 倒计时结束 所需字段 LimitTime(限制时间) TimingTime计时时间/// /summaryOnlyStackedLimitTime 8,/// summary/// 仅堆叠一次永久存在并且需要展示层数 所需字段 LimitLayer(限制层数) TimingLayer(计算层数)/// /summaryOnlyStackOnePermanentWithLimitLayer 9, }/// summary /// 执行次数类型 /// /summary public enum BuffCalculateType {None 0,/// summary/// 一次/// /summaryOnce 1,/// summary/// 每次都执行跟随时间间隔走/// /summaryLoop 2, }/// summary /// 关闭类型 /// /summary public enum BuffShutDownType {None 0,/// summary/// 关闭所有/// /summaryAll 1,/// summary/// 单层关闭/// /summaryLayer 2, }/// summary /// Buff基类 /// /summary public class BuffEntityBase : IDisposable {/// summary/// buff Id/// /summarypublic int buffID;/// summary/// buff路径/// /summarypublic string buffUrl;/// summary/// buff Name/// /summarypublic string buffName;/// summary/// buff 描述/// /summarypublic string buffDesc;/// summary/// 此buff是否有UI展示/// /summarypublic ShowType showType ShowType.None;/// summary/// buff 类型名 反射string为class使用/// /summarypublic BuffType buffType BuffType.None;/// summary/// buff 挂载类型是否可以挂载多个/// /summarypublic MountType mountType MountType.None;/// summary/// buff重叠类型/// /summarypublic BuffOverlap buffOverlap BuffOverlap.None;/// summary/// 执行次数/// /summarypublic BuffCalculateType buffCalculateType BuffCalculateType.None;/// summary/// buff关闭类型/// /summarypublic BuffShutDownType buffShutDownType BuffShutDownType.None;/// summary/// 限制时间/// /summarypublic float m_LimitTime;/// summary/// 计时时间/// /summarypublic float m_TimingTime;/// summary/// 限制层数/// /summarypublic int m_LimitLayer;/// summary/// 计算层数/// /summarypublic int m_TimingLayer;/// summary/// 间隔时间 0代表不跟间隔走/// /summarypublic float m_Frequency 1;/// summary/// 执行数值 比如召唤怪物1次 增加攻速5% 攻击力翻倍/// /summarypublic float m_NumValue;/// summary/// 释放接口/// /summarypublic virtual void Dispose(){buffID 0;buffUrl null;buffName null;buffDesc null;showType ShowType.None;buffType BuffType.None;mountType MountType.None;buffOverlap BuffOverlap.None;buffCalculateType BuffCalculateType.None;buffShutDownType BuffShutDownType.None;m_LimitTime 0;m_TimingTime 0;m_LimitLayer 0;m_TimingLayer 0;m_Frequency 0;m_NumValue 0;} } RoleAttribute这个类主要是存放记录当前生物所包含的buff这样方便来管理。 using System.Collections.Generic; using UnityEngine;/// summary /// 人物基类 /// /summary public class RoleAttribute: MonoBehaviour {/// summary/// buff控制列表/// /summarypublic ListBuffCtrlBase m_buffLst new ListBuffCtrlBase ();/// summary/// 添加Buff/// /summary/// param namebuffCtrlBase/parampublic void AddBuff(BuffCtrlBase buffCtrlBase) {m_buffLst.Add(buffCtrlBase);}/// summary/// 移除Buff/// /summarypublic void RemoveBuff(BuffCtrlBase buffCtrlBase) {if(m_buffLst.Contains(buffCtrlBase)) m_buffLst.Remove(buffCtrlBase);}/// summary/// 是否包含该buff/// /summary/// param namebuffCtrlBase/param/// returns/returnspublic bool IsContainsBuff(BuffCtrlBase buffCtrlBase) {return m_buffLst.Contains (buffCtrlBase);}/// summary/// 是否包含该Id的buff/// /summary/// param nameId/param/// returns/returnspublic bool IsContainsBuff(int Id) {for (int i 0; i m_buffLst.Count; i) {if (m_buffLst[i].m_buffInfo.buffID Id) return true;}return false;}/// summary/// 是否包含该类型的buff/// /summary/// param namebuffType/param/// returns/returnspublic bool IsContainsBuff(BuffType buffType) {for (int i 0; i m_buffLst.Count; i){Debug.LogError(m_buffLst[i].m_buffInfo.buffType.ToString());if (m_buffLst[i].m_buffInfo.buffType buffType) return true;}return false;}/// summary/// 获取buff控制类/// /summary/// param namebuffType/param/// returns/returnspublic BuffCtrlBase GetBuffCtrl(BuffType buffType) {for (int i 0; i m_buffLst.Count; i){if (m_buffLst[i].m_buffInfo.buffType buffType) return m_buffLst[i];}return null;}/// summary/// 获取buff控制类/// /summary/// param namebuffType/param/// returns/returnspublic BuffCtrlBase GetBuffCtrl(int Id){for (int i 0; i m_buffLst.Count; i){if (m_buffLst[i].m_buffInfo.buffID Id) return m_buffLst[i];}return null;}/// summary/// 获取buff控制类集合/// /summary/// param namebuffType/param/// returns/returnspublic ListBuffCtrlBase GetBuffCtrls(BuffType buffType) {ListBuffCtrlBase lst new ListBuffCtrlBase ();for (int i 0; i m_buffLst.Count; i){if (m_buffLst[i].m_buffInfo.buffType buffType) lst.Add(m_buffLst[i]);}return lst;} }BuffManager这个则是管理具体给谁添加buff和移除buff的管理类。 using LitJson; using System; using System.Collections.Generic; using UnityEngine;/// summary /// Buff管理器 /// /summary public class BuffManager : MonoBehaviour {/// summary/// buff组件单例/// /summarypublic static BuffManager Instance;// Start is called before the first frame updatevoid Awake(){Instance this;}#region 添加Buff/// summary/// 创建buff/// /summarypublic void AddBuff(RoleAttribute self, RoleAttribute other, BuffType buffType){Type t Type.GetType(buffType.ToString() Ctrl);//buff数据string buffData GetBuffJsonStr(buffType);//如果buff数据为nullif (string.IsNullOrEmpty(buffData)){Debug.LogError(当前buff还未配置无法添加buff);return;}JsonData data JsonMapper.ToObject(buffData);//挂载类型MountType mount (MountType)int.Parse(data[mountType].ToString());//buff控制层脚本BuffCtrlBase bcb null;//多个挂载if (mount MountType.More){bcb self.gameObject.AddComponent(t) as BuffCtrlBase;self.AddBuff(bcb);bcb.BuffOnEnter(self, other, GetBuffJsonStr(buffType));}//单挂载else{bool IsAdd self.IsContainsBuff(buffType);Debug.LogError(IsAdd IsAdd);//未挂载过if (!IsAdd){bcb self.gameObject.AddComponent(t) as BuffCtrlBase;self.AddBuff(bcb);bcb.BuffOnEnter(self, other, GetBuffJsonStr(buffType));}//已经挂载过else{bcb self.GetBuffCtrl(buffType);bcb.RepeatAdd();}}}#endregion#region 移除buf主角、敌人/// summary/// 移除人物身上的buf/// /summary/// param namerole/param/// param namebuffType/parampublic void RemoveBuff(RoleAttribute role, BuffType buffType){role.GetBuffCtrl(buffType)?.BuffOnExit();}/// summary/// 移除人物身上的全部该buf/// /summary/// param namerole/param/// param namebuffType/parampublic void RemoveAllBuff(RoleAttribute role, BuffType buffType){ListBuffCtrlBase lst role.GetBuffCtrls(buffType);lst.ForEach(cb cb.BuffOnExit());}#endregion#region 获取buff信息/// summary/// 根据buff类型 获取buff的json数据/// /summarypublic string GetBuffJsonStr(BuffType buffType){TextAsset buffdata Resources.LoadTextAsset(string.Format(BuffData/{0}/{0}, buffType.ToString()));if (buffdata null){Debug.LogErrorFormat(未找到对应的{0}{1} , buffType.ToString(), buff数据检查是否配置buff文件);return null;}return buffdata.text;}/// summary/// 根据buff类型 获取buff的JsonData/// /summarypublic JsonData GetBuffJsonData(BuffType buffType){TextAsset buffdata Resources.LoadTextAsset(string.Format(BuffData/{0}/{0}, buffType.ToString()));if (buffdata null){Debug.LogErrorFormat(未找到对应的{0}{1} , buffType.ToString(), buff数据检查是否配置buff文件);return null;}return JsonMapper.ToObject(buffdata.text);}/// summary/// 根据buff的Id 获取buff的json数据/// /summary/// returns/returnspublic string GetBuffJsonStr(int Id){if (Id Enum.GetNames(typeof(BuffType)).Length - 1){Debug.LogError(Id超过buff上限,未配置对应的buff,请先配置);return null;}BuffType bt (BuffType)Id;return GetBuffJsonStr(bt);}/// summary/// 根据buff的Id 获取buff的JsonData/// /summary/// returns/returnspublic JsonData GetBuffJsonData(int Id){//buff数据string buffData GetBuffJsonStr(Id);if (string.IsNullOrEmpty(buffData)){return null;}return JsonMapper.ToObject(buffData);}#endregion} 四、框架使用 buff数据 文中我放了三个不同类型的buff具体的json如下图 Json数据以及工具 json如果太长看不太明白可以用在线解析工具 解析的如下图 这里我只讲几个比较关键的点至于一眼能看懂的我就不详细说了。 ShowType 这里主要是后面接入UI准备是否展示接口 BuffType 这里也不需要多说如果你要添加新的buff的话需要在这里创建一个新枚举按照我下面创建的命名方式创建的json文件放在下面的文件夹下需要自行创建 MountType 这个意思是你创建的脚本是否可以在同一个对象上挂载多个如果你想能挂载无数个则用多挂载如果想要单挂载跌层数则选择单挂载 BuffOverlap 这里主要是buff的叠加类型这里我创建了几个比较常用的方式具体的逻辑是在BuffCtrlBase中的RepeatAdd方法和BuffOnStay方法 BuffShutDownType 这个参数也是为后面接入做准备留的接口因为现在关闭其实都是有的可以关闭多个也可以关闭一个所以这里暂时是不需要具体的方法都在BuffManager中。 BuffCalculateType 这里是关于buff回调执行的问题如果是持续的buff则可以选择Loop在设置固定时间进行回调如果只有一次比如属性提升的buff则可以选择Once。这里需要配合json的m_Frequency来使用这里如果不为0并且 BuffCalculateType类型为Loop则相当于多少秒执行一次回调如下。 时间和层数这里也不过多说明了 m_LimitTime: 0, m_TimingTime: 0, m_LimitLayer: 0, m_TimingLayer: 0,这几个参数大概看下就明白了具体逻辑也在BuffCtrlBase中 如何给生物添加buff 通过BuffManager来对生物添加移除buff这里注意需要挂载的生物是需要集成RoleAttribute的 五、总结 以上是我对网上一些面向过程的buff系统总结写出来的如果有问题或者不明白的地方可以联系我同事也感谢大家一直以来的支持。
http://www.pierceye.com/news/18049/

相关文章:

  • 广东的一起做网站wordpress下不了插件
  • 淘宝购物网站aso优化技巧大aso技巧
  • 光明新区做网站网站 只做程序
  • 网站维护界面设计百度网盟推广的 合作网站
  • 天津建站模板源码微信公众号网站怎么做
  • 机械类毕业设计代做网站推荐wordpress page.php
  • 做慕斯蛋糕那个网站有视频海尔电子商务网站建设预算
  • 网站建设的意义竞价推广平台有哪些
  • 网站建设需要备案吗百度推广代运营
  • 建立石墨碳素网站怎么做柳州团购汽车网站建设
  • 物流网站模板下载seo关键词排名优化推荐
  • 购物帮–做特惠的导购网站四川省建设建设监理协会网站
  • 网站流量不够怎么办网店代运营公司有哪些
  • 制作静态动漫网站模板网站开发专业建设
  • 网站如何做电脑销售四川网络科技有限公司
  • 做离心开关的企业的网站衡水移动网站建设报价
  • 重庆网站建设leco tec微信端网站页面设计
  • 全景网站模版常德人才网
  • 中煤建设协会网站黑帽seo技术有哪些
  • 做音乐网站要注意什么网络项目平台
  • 有没有专门做花鸟鱼虫的网站网站默认图片素材
  • 利用分类信息网站做推广抖音seo优化排名
  • 茂名手机网站建设公司建好的网站怎么用
  • 大连网站制作学校iot物联网平台开发
  • 竞价网站和优化网站的区别你注册过的那些网站
  • 南宁住房和城乡建设局网站辽宁建设工程信息网盲盒系统
  • 曲靖高端网站制作产品做国外网站有哪些
  • 做一个网站每年多少钱天下商机创业网
  • asp做一个简单网站wordpress 图片名乱码
  • 如何做流量充值网站中信建设有限责任公司内部网站