关于自己编写简单游戏编辑器的介绍

article/2025/10/28 11:59:50

该编辑器编写的初衷是为了帮助游戏一些功能的开发比如新手引导,成就等等。现在编写的是一个框架,具体功能需要自行扩展。

 

目录

一、编辑器结构(原始数据+触发器)

 1、编辑器总体结构

2、原始数据

3、触发器数据

4、枚举数据

5、编辑数据存储

二、运行时结构

三、一个完整的实例


 

一、编辑器结构(原始数据+触发器)

 1、编辑器总体结构

编辑器有四大数据模块组成它们分别是原始数据、触发器数据、枚举数据结构、数据存储数据结构。下面会逐一介绍每个数据,关于它们的数据构成如何扩展等。

原始数据是最基本的数据,它是组成整个编辑器数据的基石,标识出该数据是做什么的。

触发器数据在编辑器和运行时都是需要用的数据,在编辑器中它用来存储编辑好的数据,在运行时中它用来处理游戏传出的数据。可以看出触发器数据在整个编辑器和运行时中有着重要的地位。

枚举数据结构是用于辅助类的数据,该数据用于选择器数据。

数据存储 分为编辑数据存储和导出数据存储,编辑数据用于保存编辑器数据,导出数据用于运行时数据的运用。

2、原始数据

原始数据有一个总类OrigDataParent。

OrigDataParent是一个抽象类,包含四个字段,变量name表示数据的名称,它将在选择[事件/环境/动作]中显现该名字。变量id表示该段数据的唯一id,它对应着不同的枚举值,[事件/环境/动作]对应的不同的枚举,这个id代表该唯一的原始数据,在触发器中的origId就是对应着该id,[事件/环境/动作]三个不同的枚举在运行时中有着唯一区别的作用。变量descrip表示数据描述,用来给使用者一个具体的解释。变量type表示所属类型它用于为原始数据分类型,对应着三个不同的枚举分别是OrigEventTypeEnum/OrigConditionTypeEnum/OrigActionTypeEnum。

OrigDataParent继承了接口IOrigData,该接口包含了两个方法Show()和Save (params object[] obj),其中Show用来显示原始数据中的内容供使用者填写/选择数据,后面将会举例说明。Save用来保存使用者编辑的数据。

另外比较重要的一点是为了能够读取数据的方便开发者扩展新的触发器时需要给出指定的命名空间DataStruct

下面是元数据OrigDataParent与接口IOrigData的代码。

 public interface IOrigData{/// <summary>/// 显示Panel数据/// </summary>/// <returns></returns>List<Control> Show();/// <summary>/// 保存数据/// </summary>/// <param name="obj"></param>TriggerDataParent Save (params object[] obj) ;}namespace DataStruct
{[Instantiation]public abstract class OrigDataParent : IOrigData{public string name;//数据名称/// <summary>/// 唯一id/// 对应ThreeOrigEnumType中三个枚举中的值/// </summary>public int id;/// <summary>/// 数据描述/// </summary>public string descrip;/// <summary>/// //所属类型,默认全部/// 对应枚举/// OrigEventTypeEnum/OrigConditionTypeEnum/OrigActionTypeEnum/OrigOtherTypeEnum/// 的值/// </summary>public int type = 0;public OrigDataParent(string name, int id){this.name = name;this.id = id;}/ <summary>/ 保存数据的方法/ </summary>/ <param name="obj">obj[0]=EditorTriggerDataStruct</param>//public abstract void Save(params object[] obj);public abstract TriggerDataParent Save(params object[] obj);/// <summary>/// 显示内容的方法/// </summary>/// <returns></returns>public abstract List<Control> Show();public virtual string Descrip(){return name + "——" + descrip;}public override string ToString(){return name;}}
}

 

原始数据下面分三个类型,事件、环境、动作,这三个类型都有一个父类它们分别是OrigEventDataParent、OrigConditionDataParent、OrigActionDataParent它们都继承父类OrigDataParent。这三个类也均是抽象类,具体内容可见项目代码。

 

3、触发器数据

触发器数据有一个总类TriggerDataParent,它是一个抽象类。

TriggerDataParent中有两个字段,变量origId它对应于原始数据唯一的id,标识该触发器要用于做什么。变量fullName表示该触发器的完全限定名,该字段不需要开发者维护,该字段仅用于数据的存储与读取。另外比较重要的一点是为了能够读取数据的方便开发者扩展新的触发器时需要给出指定的命名空间DataStruct。下面是该抽象类的具体内容。

public interface IListVoluation{/// <summary>/// 传入一个List<object> 类型/// 将其转化为list具体类型/// </summary>/// <param name="list"></param>void listVoluation(List<object> list);}namespace DataStruct
{/// <summary>/// 触发器数据总类/// </summary>[TriggerTypeAttri]public abstract class TriggerDataParent : IListVoluation{/// <summary>/// 对应原始数据的唯一id/// </summary>public float origId;public string fullName;public TriggerDataParent(float origId){this.origId = origId;fullName = GetType().FullName;}public TriggerDataParent(){fullName = GetType().FullName;}public void SetOrigId(int origId){this.origId = origId;}/// <summary>/// 创建额外树节点,/// 这个节点将作为本身节点的子节点/// 可以参考TriggerMultipleConditionData的重写方法--creatSelfTreeNode/// 如无特殊需要不必重写/// </summary>/// <returns></returns>public virtual TreeNode creatSelfTreeNode(){return null;}/// <summary>/// 对触发器的额外描述/// 如无特殊需要不必重写/// </summary>/// <returns></returns>public virtual string Descript(){return null;}/// <summary>/// 如果子类中有List成员变量,请务必实现该方法/// 传入一个List<object> 类型,将其转化为list具体类型/// </summary>/// <param name="list">传入的list是对应于所需要的list,用于数据读取</param>public virtual void listVoluation(List<object> list){}}
}

触发器结构下面分三个类型,事件、环境、动作,这三个类型都有一个父类它们分别是TriggerDataParent、TriggerConditionDataParent、TriggerActionDataParent它们都继承父类TriggerDataParent。这三个类也均是抽象类,具体内容可见项目代码。

4、枚举数据

枚举数据是自定义的一个类EnumClassParent,它用来作为选择器数据,所有的选择器数据都要继承该父类,这个类不参与存储,在编辑器开始运行时将会运用反射自动加载所有继承该类的子类。该类有四个字段,它们分别是:listEnum它是一个list列表类型是EnumItem,用来缓存枚举单位;name它表示选择器的名字;enumType枚举类型值,对应于EnumType枚举中的值;字典dicEnums。下面给出该代码:

 public class EnumItem{public string name;public int value;public EnumItem(string name, int value){this.name = name;this.value = value;}}[Instantiation]public abstract class EnumClassParent{public List<EnumItem> listEnum = new List<EnumItem>();public string name;/// <summary>/// 对应于EnumType的值/// </summary>public int enumType;/// <summary>/// /key表示EnumItem中的value值/// </summary>[JsonIgnore]public Dictionary<int, EnumItem> dicEnums = new Dictionary<int, EnumItem>();public EnumClassParent(string name, int enumType){this.name = name;this.enumType = enumType;}protected void creat(string name, int value = -1){if (value == -1){value = listEnum.Count;}EnumItem item = new EnumItem(name, value);listEnum.Add(item);if (dicEnums.ContainsKey(item.value)){dicEnums[item.value] = item;}else{dicEnums.Add(item.value, item);}}public void setData(){if (listEnum.Count > 0){foreach (var item in listEnum){if (dicEnums.ContainsKey(item.value)){dicEnums[item.value] = item;}else{dicEnums.Add(item.value, item);}}}}}/// <summary>/// 枚举类型标识/// </summary>public enum EnumType{/// <summary>/// 对比计算器/// </summary>ContrastCalculator,/// <summary>/// ui的类型/// </summary>UIType,/// <summary>/// 触发器枚举/// </summary>Trigger,/// <summary>/// 创建某个物体的枚举/// </summary>CreatItem,/// <summary>/// 单位类型/// </summary>ItemType,/// <summary>/// 玩家GM命令/// </summary>PlayerGM,}

下面给出一个具体的选择器的代码:

namespace DataStruct
{/// <summary>/// 对比计算器/// </summary>public class EnumContrastCalculator : EnumClassParent{public EnumContrastCalculator() : base("对比计算器", (int)EnumType.ContrastCalculator){creat("等于",1000);creat("不等于",1001);creat("小于等于",1002);creat("大于等于",1003);creat("小于",1004);creat("大于",1005);        }}
}

改代码在编辑器运行是对应的数据显示:

5、编辑数据存储

编辑器数据的存储结构由三个类构成,EditorTriggerDataStruct表示一个完整的触发器,其中包括该触发器内所有的事件环境动作数据,EditorData表示整个类的数据结构,EditorDataSave存储所有的类的数据同时也是保存的json数据。下面的一张图将会解释这三个类的关系。

该数据不需要开发者再次管理,整套管理流程已经书写完毕。

 

二、运行时结构

对于不同的游戏运行时结构会有所不同,现在给出一个特定的运行时结构。该运行时是在服务器使用。

1、编辑器导出数据的结构

ExportTriggerDataStruct类作为一个触发的结构它包括事件/环境/条件着三类数据,变量triggerStructIndex表示该触发器在该工程中的唯一序列,用于区别于其他的导出触发器数据结构。ExportTriggerDataStruct中有三个方法它们用于处理事件/环境/动作这些数据。下面给出代码:

@DataStructAnnotat
@Scope("prototype")
@Service
public class ExportTriggerDataStruct implements IListVoluation
{public ArrayList<TriggerEventDataParent> list_event = new ArrayList<TriggerEventDataParent>();public ArrayList<TriggerConditionDataParent> list_condition = new ArrayList<TriggerConditionDataParent>();public ArrayList<TriggerActionDataParent> list_action = new ArrayList<TriggerActionDataParent>();public String fullName;public float triggerStructIndex;@Overridepublic void listVoluation(ArrayList<Object> list){if (list == null || list.size() <= 0){return;}for (Object obj : list){addTriggerData((TriggerDataParent) obj);}}private void addTriggerData(TriggerDataParent data){if (data instanceof TriggerEventDataParent){TriggerEventDataParent de = (TriggerEventDataParent) data;de.triggerIndex = list_event.size();de.triggerStructIndex = triggerStructIndex;list_event.add(de);}else if (data instanceof TriggerConditionDataParent){TriggerConditionDataParent dc = (TriggerConditionDataParent) data;list_condition.add(dc);}else if (data instanceof TriggerActionDataParent){TriggerActionDataParent da = (TriggerActionDataParent) data;list_action.add(da);}}/*** 接受处理事件的结果* * @param index* @param res*/public boolean receiveEventResult(int userId, int index, boolean res){if (res){return judgeConditionDataParocessing(userId);}return false;}/*** 判断环境数据的处理结果* @param userId* @return*/public boolean judgeConditionDataParocessing(int userId){if (list_condition != null && list_condition.size() > 0){for (TriggerConditionDataParent con : list_condition){boolean res = con.DataProcessing(userId);if (!res){Tool.print_debug_level0("条件不满足不执行动作。对应的原始数据id=" + con.origId);return false;}}}return actionDataProcessing(userId);}/*** 执行动作* @param userId* @return*/public boolean actionDataProcessing(int userId){if (list_action != null && list_action.size() > 0){for (TriggerActionDataParent data : list_action){boolean res = data.DataProcessing(userId);Tool.print_debug_level0("执行动作后的反馈。res=" + res + ",ActionData origId=" + data.origId);}}return true;}}

ExportData类中包含整个工程中所有的ExportTriggerDataStruct,我们从json数据中读取的最后会得到一个ExportData类,ExportData类继承了一个IListVoluation接口。listVoluation方法的作用见IListVoluation接口中的方法。代码如下:

@DataStructAnnotat 
@Scope("prototype")
@Service
public class ExportData implements IListVoluation
{public ArrayList<ExportTriggerDataStruct> listChuFaQi;public String fullName;@Overridepublic void listVoluation(ArrayList<Object> list){if (list == null || list.size() <= 0){return;}listChuFaQi = new ArrayList<ExportTriggerDataStruct>();for (Object data : list){if (data instanceof ExportTriggerDataStruct){ExportTriggerDataStruct export = (ExportTriggerDataStruct) data;listChuFaQi.add(export);}}Tool.print_debug_level0("数据加载完成!!!");}}public interface IListVoluation
{/*** 传入一个List<object> 类型 将其转化为list具体类型*  若子类中有ArrayList或者其他的集合请务必实现该方法* 否则会导致数据丢失* @param list*/void listVoluation(ArrayList<Object> list);
}

由于在这个应用中我们遇到了类的继承目前为止小W并没有找到合适的此类的json数据解析,所以就自己写了一个json数据解析,小W会再写另一边文章介绍这类json的解析,有兴趣的可以看一下。

2、触发器数据结构的介绍

触发器数据用一个共同的父类TriggerDataParent这个类是一个抽象的于上述的编辑器的TriggerDataParent是一样的,只是方法有所区别,详细的见项目。

事件:TriggerEventDataParent继承父类TriggerDataParent,其中有一个数据处理类用于处理该事件的中传过来的数据,该数据具体怎样处理有开发者自己所需决定。listVoluation方法的作用见IListVoluation接口中的方法。它的代码如下:

public abstract class TriggerEventDataParent extends TriggerDataParent
{/// <summary>/// 数据在所在的触发器结构中的唯一次序/// 该数值在程序启动后自动生成/// 不需要额外维护/// </summary>public int triggerIndex;/// <summary>/// 该数据所在触发器结构自己的顺序/// 该数据在游戏启动时自动赋值/// 无需额外维护/// </summary>public float triggerStructIndex;@Overridepublic void listVoluation(ArrayList<Object> list){}/*** 每个事件子类均需要实现该方法* * @param origId*                原始数据对应的唯一id* @param obj*                需要的参数,需要转化为自己需要的类型* @return*/public abstract boolean dataProcessing(float origId, Object... obj);
}

环境:TriggerConditionDataParent有一个数据处理的方法用于处理该环境中的数据。代码如下:

public abstract class TriggerConditionDataParent extends TriggerDataParent
{/*** 实现条件类,所有条件子类均需实现该抽象方法* * @return*/public abstract boolean dataProcessing(int userId);
}

动作:TriggerActionDataParent有一个数据处理的方法用于处理该环境中的数据。代码如下:

public abstract class TriggerActionDataParent extends TriggerDataParent
{/*** 实现动作类,所有动作子类均需实现该抽象方法* * @return*/public abstract boolean DataProcessing(int userId);
}

3、游戏运行时数据处理

运行时需要用的是关于触发器的类,而关于原始数据的类作为一个枚举值或者常量作为原始数据。

GameRunTimeProcessing中包含一个工程中的数据,这其中有一个获取到事件数据的方法receiveEventTrigger,代码如下:

/*** 游戏数据处理* * @author Will**/
public class GameRunTimeProcessing {/*** 所有触发器结构 key:triggerStructIndex*/private HashMap<Float, ExportTriggerDataStruct> map_allTriggerStructs = new HashMap<Float, ExportTriggerDataStruct>();/*** 所有的事件数据 key:origId*/private HashMap<Float, ArrayList<TriggerEventDataParent>> map_allEventDtas = new HashMap<Float, ArrayList<TriggerEventDataParent>>();public GameRunTimeProcessing() {}public GameRunTimeProcessing(Object obj) {if (obj instanceof ExportData) {ExportData data = (ExportData) obj;if (data.listChuFaQi != null && data.listChuFaQi.size() > 0) {for (ExportTriggerDataStruct export : data.listChuFaQi) {map_allTriggerStructs.put(export.triggerStructIndex, export);addAllEventData(export.list_event, export.triggerStructIndex);}}}}private void addAllEventData(ArrayList<TriggerEventDataParent> list, float triggerStructIndex) {if (list == null || list.size() <= 0) {return;}for (TriggerEventDataParent trigger : list) {trigger.triggerStructIndex = triggerStructIndex;if (map_allEventDtas.containsKey(trigger.origId)) {map_allEventDtas.get(trigger.origId).add(trigger);} else {ArrayList<TriggerEventDataParent> trigger_list = new ArrayList<TriggerEventDataParent>();trigger_list.add(trigger);map_allEventDtas.put(trigger.origId, trigger_list);}}}/*** 获取事件触发器* @param userId 玩家id* @param origId 原始数据id* @param objs 事件触发器处理数据所需的参数,它是一个数组* @return*/public boolean receiveEventTrigger(int userId, float origId, Object... objs) {Tool.print_debug_level0("接受到事件触发器。origId" + origId + ",map_allEventDtas.size()=" + map_allEventDtas.size());if (map_allEventDtas.containsKey(origId)) {Tool.print_debug_level0("map_allEventDtas.get(origId).size()=" + map_allEventDtas.get(origId).size());if (map_allEventDtas.get(origId).size() > 0) {for (TriggerEventDataParent data : map_allEventDtas.get(origId)) {boolean res = data.DataProcessing(origId, objs);ExportTriggerDataStruct trigger_st = map_allTriggerStructs.get(data.triggerStructIndex);boolean returnRes = trigger_st.receiveEventResult(userId, data.triggerIndex, res);Tool.print_debug_level0("事件发生之后处理数据的结果=" + returnRes);return returnRes;}} else {return false;}}return false;}}

三、一个完整的实例

1、玩家GM命令为玩家添加装备

描述:在聊天的输入框输入指定的字符串获取装备。

a、原始数据结构

原始数据事件,代码如下:

//命名空间固定为DataStruct
namespace DataStruct
{/// <summary>/// 原始事件数据需继承原始数据事件类OrigEventDataParent/// </summary>public class OrigEventPlayerGMStr : OrigEventDataParent{private string GM_str;//玩家GM命令起始字符串public OrigEventPlayerGMStr() : base("玩家GM命令事件(指定起始字符串)", (int)OrignalEventDataEnum.playerGM_str){descrip = "通过聊天窗口添加命令,比如(添加装备):add ";type = (int)OrigEventTypeEnum.玩家;}/// <summary>/// 保存触发器数据/// </summary>/// <param name="obj"></param>/// <returns></returns>public override TriggerDataParent Save(params object[] obj){TriggerEventPlayerGMStr data = DataHandleManage.editorHandle.CreatNewTriggerDataClass<TriggerEventPlayerGMStr>(id);data.SetData(GM_str);return data;}/// <summary>/// 再panel中显示的数据,下面的图片中将会给出这个方法的用处/// </summary>/// <returns></returns>public override List<Control> Show(){List<Control> list = new List<Control>();Label label = DataHandleManage.orignalHandle.creatLabel(name + "请输入GM命令起始字符(请尽量不要与其它已用字符重复):");list.Add(label);TextBox textBox2 = DataHandleManage.orignalHandle.creatTextBox();textBox2.TextChanged += (object sender, EventArgs e) =>{GM_str = textBox2.Text;};list.Add(textBox2);return list;}}
}

运行图片如下:

注意上述图片中的内容是如何显示的按钮是如何调用save方法的都不需要开发者去处理,内部已经处理好了。在此玩家GM命令中不需要环境。

原始数据动作,代码如下:

//指定命名空间DataStruct
namespace DataStruct
{
//原始数据动作继承动作的原始数据父类,此类已经在前面介绍过OrigActionDataParentpublic class OrigActionPlayerChatCommand : OrigActionDataParent{private int player_GM;//玩家GM命令字符串private Button currentButton;//当前选中的buttonpublic OrigActionPlayerChatCommand() : base("玩家聊天命令", (int)OrignalActionDataEnum.playerChatCommand){descrip = "给玩家添加装备。";type = (int)OrigActionTypeEnum.玩家;}/// <summary>/// 保存触发器数据/// </summary>/// <param name="obj"></param>/// <returns></returns>public override TriggerDataParent Save(params object[] obj){TriggerActionPlayerChatCommand data = DataHandleManage.editorHandle.CreatNewTriggerDataClass<TriggerActionPlayerChatCommand>(id);data.SetData(player_GM);return data;}/// <summary>/// 再panel中显示的数据,下面的图片中将会给出这个方法的用处/// </summary>/// <returns></returns>public override List<Control> Show(){List<Control> list = new List<Control>();//这里已经提供创建Label的方法,使用Label时使用该方法Label label = DataHandleManage.orignalHandle.creatLabel(name + ",点击可选择一个聊天命令类型。");list.Add(label);//这里已经提供创建Button的方法,使用Button时使用该方法Button button = DataHandleManage.orignalHandle.creatButton("点击选择");button.MouseClick += ButtonClick;list.Add(button);return list;}//点击Button的事件private void ButtonClick(object sender, MouseEventArgs e){currentButton = (Button)sender;FuncDelegate func = new FuncDelegate(selectUIType);DataHandleManage.openTypeSelectForm(AllDataManage.allEnumClass.dicEnumParent[(int)EnumType.PlayerGM], func);}private void selectUIType(params object[] uiType){EnumItem item = (EnumItem)uiType[0];this.player_GM = item.value;currentButton.Text = item.name + "--点击选择";}}
}

运行图片如下:

b、触发器代码结构

触发器数据事件,代码如下:

//使用指定命名空间DataStruct
namespace DataStruct
{//该事件触发器需继承触发器事件类 TriggerEventDataParentpublic class TriggerEventPlayerGMStr : TriggerEventDataParent{public  string GM_str;public void SetData(string GM_str){this.GM_str = GM_str;}//描述该触发器内容,若有该触发器自己的自定义的变量则需要重写该方法用于展示该条触发器信息public override string Descript(){string des = "";OrigEventDataParent orig = AllDataManage.origData.dicEventData[(int)origId];//string name = AllDataManage.allEnumClass.dicEnumParent[(int)EnumType.PlayerGM].dicEnums[(int)player_GM].name;des = orig.name + "(自定义的起始命令:" + this.GM_str + ")";return des;}}
}

触发器数据动作,代码如下:

//使用指定的命名空间DataStruct
namespace DataStruct
{
//该动作触发器需继承触发器动作类TriggerActionDataParentpublic class TriggerActionPlayerChatCommand : TriggerActionDataParent{public float player_GM;public void SetData(int player_GM){this.player_GM = player_GM;}//描述该触发器内容,若有该触发器自己的自定义的变量则需要重写该方法用于展示该条触发器信息public override string Descript(){string des = "";OrigActionDataParent orig = AllDataManage.origData.dicActionData[(int)origId];string name = AllDataManage.allEnumClass.dicEnumParent[(int)EnumType.PlayerGM].dicEnums[(int)player_GM].name; ;des = orig.name + "(" + name + ")";return des;}}
}

运行图片如下:

 

 

 


http://chatgpt.dhexx.cn/article/l3TC3c3Y.shtml

相关文章

【图文教程】CAD 卸载工具(免费),教你卸载CAD

【图文教程】CAD 卸载工具&#xff08;免费&#xff09;&#xff0c;教你卸载CAD 很多朋友出现无法卸载CAD&#xff0c;或者卸载了CAD就无法安装、安装失败CAD的情况。 分享一个卸载工具&#xff0c;很简单&#xff0c;让你告别卸载软件烦恼。 准备工作 软件下载&#xff1a; …

CAD 卸载工具,完美彻底卸载清除干净CAD各种残留注册表和文件【转载】

一些同学安装CAD出错了&#xff0c;也有时候想重新安装CAD的时候会出现这种本电脑已安装CAD&#xff0c;你要是不留意直接安装&#xff0c;只会安装CAD的附件&#xff0c;CAD是安装不上的。这种原因呢就是大家在之前卸载CAD时没有把CAD残留信息删除&#xff0c;下面我来教大家把…

CAD 卸载工具,完美彻底卸载清除干净cad各种残留注册表和文件

CAD提示安装未完成&#xff0c;某些产品无法安装该怎样解决呢&#xff1f;&#xff0c;一些朋友在win7或者win10系统下安装CAD失败提示CAD安装未完成&#xff0c;某些产品无法安装&#xff0c;也有时候想重新安装CAD的时候会出现本电脑windows系统已安装CAD&#xff0c;你要是不…

cad卸载工具_如何卸载AutoCAD 附上清理注册表方法

AutoCAD安装过&#xff0c;清理电脑不小心删除了&#xff0c;重新安装提示已安装&#xff0c;我相信很多用AutoCAD都遇到过这种情况&#xff0c;我看网上很多方法都是教你删除注册表的Autodesk和7D2F38...&#xff0c;这种方法有些时候并不管用&#xff0c;如果电脑还装了3dmax…

cad卸载工具_使用感极好的5款软件分享,款款高逼格,下载之后就没舍得卸载...

想要在繁忙的工作中偷闲&#xff1f;通常你要拥有极高的效率&#xff0c;如何能最快速的完成工作内容&#xff0c;相信大家都会有自己的独家秘籍&#xff0c;往往快速完成工作都会有一个弊端&#xff01; 工作质量不是很美好&#xff0c;如何能又快又高质量呢&#xff1f;如果你…

cad卸载工具_「Windows」不足10M的卸载软件,卸载得可真干净啊

前言&#xff1a; 相信大家都遇见过在卸载CAD、Office、UG之类的软件时&#xff0c;始终卸载不干净&#xff0c;导致无法重装的情况&#xff0c;还有些流氓软件甚至卸载不掉&#xff0c;卸载了还给你推广告&#xff0c;占用你的硬盘内存&#xff0c;是可忍孰不可忍&#xff01;…

CAD专用卸载修复工具,一键完全彻底卸载删除CAD软件的专用卸载工具

Autodesk CAD卸载工具(AUTO Uninstaller)是专门为了针对Autodesk CAD软件卸载不干净而导致CAD安装失败问题进行研发的Autodesk CAD一键卸载工具。现在虽然像360或者其他一些卸载软件提供了强力卸载CAD的工具&#xff0c;可以将CAD的注册表和一些CAD安装目录的CAD残留信息删除&a…

cad2004教程_CAD卸载教程

大家好,欢迎来到你的工具。当我发现大家遇到问题,急着解决,需要打开好几个网站开始搜索,来回切换,仍然找不到合适的方法,让人抓狂的时候,我知道是时候该做点什么了。 关于CAD的安装教程,网上已经有太多了,但是关于CAD的卸载教程,却依然很少,而CAD的卸载却是困扰大家…

axure 彻底删除lib_【AutoCAD 卸载工具,完全彻底删除清理干净AutoCAD各种残留注册表和文件】...

AutoCAD卸载工具&#xff0c;完全彻底删除干净AutoCAD各种残留注册表和文件。AutoCAD安装失败&#xff0c;怎么完全彻底删除清理干净AutoCAD各种残留注册表和文件呢&#xff1f;有些同学想把AutoCAD重新安装&#xff0c;但是AutoCAD安装失败显示失败&#xff0c;有时AutoCAD安装…

CAD卸载重新安装方法,使用清理卸载工具完全彻底删除干净CAD各种残留注册表和文件。

CAD没有按照正确方式卸载&#xff0c;导致CAD安装失败。现在虽然360或者其他一些卸载软件提供了强力卸载清理CAD的工具&#xff0c;可以将CAD注册表和一些CAD目录的CAD残留信息删除干净&#xff0c;但仍不能确保将CAD所有相关dll程序文件、exe可执行文件和注册表信息全部彻底删…

完全卸载CAD方法

如何完全卸载&#xff08;删除&#xff09;cad吗&#xff1f; 发表评论 109,011 A 所属分类&#xff1a; 安装激活 很久前发过一篇文章&#xff1a;安装CAD时提示已经安装了怎么办&#xff1f;&#xff0c;有需要的可点开看看。 常常在卸载重装CAD时发现装不上了&#xff0c;提…

Autodesk官方卸载工具软件安装教程

Autodesk卸载工具是一个专门用于Autodesk软件的卸载工具&#xff0c;可以自动识别电脑中的所有Autodesk软件,只需一键点击就能将Autodesk的软件完美卸载&#xff0c;并且不保留任何痕迹&#xff0c;这款卸载工具就可以帮助用户全面卸载Autodesk软件。 目录 一、软件下载 二、安…

cad卸载工具_装不上也卸不掉,我的CAD仿佛已没救!...(CAD/MAX完美安装工具)...

CAD/3D/REVIT/MAYA安装失败&#xff1f; 你是不是遇到&#xff1a;CAD/3dmax/maya/Revit/Inventor 安装失败或者安装不了的问题了呢&#xff1f; --文末附&#xff1a;AUTODESK完美卸载安装工具-- AUTODESK系列软件着实令人头疼&#xff0c;CAD/3dmax/maya/Revit 安装失败之后…

cad卸载_CAD一键卸载工具

提示:下载地址在文章最结尾处 软件 介绍 Autodesk卸载工具(AUTO Uninstaller)是专门为了针对Autodesk类软件卸载不干净而导致autodesk安装失败问题进行研发的autodesk一键卸载工具。现在虽然360或一些卸载软件提供了强力卸载autodesk的工具,可以将autodesk注册表和一些autode…

cad卸载工具_一辈子都不会卸载的百款AutoCAD插件,款款精品打包带走!

一辈子都不会卸载的百款AutoCAD插件&#xff0c;款款精品打包带走&#xff01; 经常需要用CAD绘图的人&#xff0c;肯定都有一个共同的烦恼&#xff0c;那就是绘图的效率很低&#xff0c;一张图总是要做很久。其实&#xff0c;想要提高绘图的效率&#xff0c;有一个很简单的方法…

cad卸载工具_如何彻底卸载CAD?

made by Lumion 2018.11.3 这里,除了BIM,就是建筑相关干货、工具、教程分享,小鱼当的建筑BIM日志。 用时一时爽,完事嫌人丑,尼玛总崩溃,卸载!!! 不行,后悔了,没有CAD的日子,还怎么边掉发边画图? 再重装的时候就会发现,装不上了,却显示已经安装,这是因为上一次卸…

cad卸载工具_Adobe软件卸载与常见问题解决方案

请点击上方蓝字&#xff0c;关注公众号 大家好&#xff0c;我们是微信公众号&#xff1a;你的工具。当我们发现大家遇到问题&#xff0c;急着解决&#xff0c;需要打开好几个网站开始搜索&#xff0c;来回切换&#xff0c;仍然找不到合适的方法&#xff0c;让人抓狂的时候&…

cad完全卸载工具

不知道为什么有时候卸载了电脑之前的cad软件后,再安装一个新的cad时会有安装不上的情况?那么这时可以配合cad完全卸载工具来试试,这是专门针对这个问题而推出的一款电脑卸载工具,有了该工具即可轻轻松松的帮助用户将电脑中cad的注册表和一些CAD安装目录的CAD残留信息删除。…

CAD专用卸载工具,完美彻底卸载清除干净cad各种残留注册表和文件。

CAD专用卸载工具&#xff0c;完美彻底卸载清除干净cad各种残留注册表和文件。有的同学由于一些原因想把cad卸载掉然后重新安装&#xff0c;但是cad安装到一半就失败了或者显示已安装或者未完成&#xff0c;还有的同学会遇到“安装错误1625&#xff1a;系统策略禁止这个安装&…

【CAD 卸载工具,完美彻底卸载清除干净auto系列软件cad max revit maya等各种残留注册表和文件】

cad卸载工具&#xff0c;非常完善的auto系列软件卸载工具&#xff0c;专业删除清理cad max等auto软件安装残留&#xff0c;不管是否已经卸载&#xff0c;都可以清理残留。 有时候我们重装cad的时候&#xff0c;会发现安装显示安装失败或者错误1625 错误1603 错误1402 1406等问题…