/// <summary> /// 获取所有要打包脚本的资源路径 /// </summary> /// <returns></returns> private ArrayList GetBundleScripts() { ArrayList fileList = new ArrayList(); BundleEventTriggerDesigner[] bundleEventTriggers = prefabs.GetComponentsInChildren <BundleEventTriggerDesigner>(); if (bundleEventTriggers != null && bundleEventTriggers.Length > 0) { for (int i = 0; i < bundleEventTriggers.Length; i++) { BundleEventTriggerDesigner betd = bundleEventTriggers[i]; for (int j = 0; j < betd.bundleEventTriggerInfos.Count; j++) { BundleEventTriggerInfo beti = betd.bundleEventTriggerInfos[j]; string path = AssetDatabase.GetAssetPath(beti.method); //转换目录格式 string temp = Application.dataPath; path = temp.Replace("/Assets", "") + "\\" + path; path = path.Replace("/", "\\"); if (!fileList.Contains(path)) { fileList.Add(path); } } } } return(fileList); }
private void LoadJsonForTrigger(AssetBundle content, Transform root) { TextAsset aa = content.LoadAsset <TextAsset>("eventTriggerConfig"); AllTriggerToDesingerJson p = JsonConvert.DeserializeObject <AllTriggerToDesingerJson>(aa.text); for (int i = 0; i < p.allJson.Count; i++) { string triggerName = p.allJson[i].objName; List <BundleEventTriggerInfo> bundleEventTriggerInfos = new List <BundleEventTriggerInfo>(); BundleEventTriggerInfo temp = new BundleEventTriggerInfo(); triggerInfoCache.Add(triggerName, bundleEventTriggerInfos); List <BundleEventTriggerJson> bundleEventTriggerJsons = p.allJson[i].bundleEventTriggerDesigners.bundleEventTriggerJsons; for (int j = 0; j < bundleEventTriggerJsons.Count; j++) { GameObject target; UnityEngine.Object method; BundleEventTriggerType triggerType; target = GameObject.Find(bundleEventTriggerJsons[j].target).gameObject; //method = dll.GetType(bundleEventTriggerJsons[j].method); //需要构建一个用名称改成的mehtod以供Trigger判断 //未完待续 MonoBehaviour[] mb = target.GetComponents <MonoBehaviour>(); temp.target = target; temp.method = target; temp.triggerType = (BundleEventTriggerType)bundleEventTriggerJsons[j].triggerType; bundleEventTriggerInfos.Add(temp); } triggerInfoCache[triggerName] = bundleEventTriggerInfos; } }
//留作测试用生成预览 //public BundleEventTriggerDesigner selfDesigner; public void AddTriggerByInfo(BundleEventTriggerInfo info) { if (info != null) { selfBundleEventTriggerInfo.Add(info); } }
public void AddTriggerByElement(GameObject _target, UnityEngine.Object _method, BundleEventTriggerType _triggerType) { BundleEventTriggerInfo temp = new BundleEventTriggerInfo(_target, _method, _triggerType); if (temp != null) { selfBundleEventTriggerInfo.Add(temp); } }
/// <summary> /// 显示List界面 /// </summary> void SetupBundleEventTriggerList() { SerializedProperty serializedProperty = serializedObject.FindProperty("bundleEventTriggerInfos"); if (serializedProperty != null) { eventInfo = new ReorderableList(serializedObject, serializedProperty, true, true, true, true); //标题 eventInfo.drawHeaderCallback = (Rect rect) => { EditorGUI.LabelField(rect, "Bundle触发器设置 Target物体 执行脚本 触发类型"); }; //元素绘制 eventInfo.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => { SerializedProperty element = eventInfo.serializedProperty.GetArrayElementAtIndex(index); rect.y += 2; //脚本 SerializedProperty _method = element.FindPropertyRelative("method"); //参数类型 SerializedProperty _mode = element.FindPropertyRelative("triggerType"); //目标物体 SerializedProperty _target = element.FindPropertyRelative("target"); EditorGUI.PropertyField(new Rect(rect.x, rect.y, 120, EditorGUIUtility.singleLineHeight), _target, GUIContent.none); EditorGUI.PropertyField(new Rect(rect.x + 120, rect.y, rect.width - 120 - 120, EditorGUIUtility.singleLineHeight), _method, GUIContent.none); //根据有无脚本绘制界面 if (_method.objectReferenceValue != null) { EditorGUI.PropertyField(new Rect(rect.x + rect.width - 120, rect.y, 120, EditorGUIUtility.singleLineHeight), _mode, GUIContent.none); //执行 if (_mode.enumValueIndex > 1) { //根据选择参数类型填入参数 //待续 switch (_mode.enumValueIndex) { case (int)PersistentListenerMode.EventDefined:; break; default:; return; } } } }; //添加 + 按钮的下拉菜单 //菜单内容根据文件夹结构自动适配 eventInfo.onAddDropdownCallback = (Rect buttonRect, ReorderableList list) => { //一个目录 标准模板脚本 var menu = new GenericMenu(); //Mod文件夹下的资产GUID //得到GUIDs字符串数组 var guids = AssetDatabase.FindAssets("", new[] { "Assets/BundleScript/CustomEventTemplateScripts" }); //遍历CustomEventTemplateScripts文件夹下的子目录 foreach (var guid in guids) { var path = AssetDatabase.GUIDToAssetPath(guid); //增加一个目录项 //AddItem会自动把WaveCreationParams传入ClickHandLer函数中 menu.AddItem(new GUIContent("TemplateEvent(自带模板)/" + System.IO.Path.GetFileNameWithoutExtension(path)), false, ClickHandLer, new EventInfoCreationParams() { target = null, scriptPath = path, mode = BundleEventTriggerType.GazeClick }); } //第二个目录 //自定义内容 ReadCustomStcriptsPath(); if (!string.IsNullOrEmpty(customScriptspath) && customScriptspath != "") { guids = AssetDatabase.FindAssets("", new[] { customScriptspath }); //遍历CustomEventTemplateScripts文件夹下的子目录 foreach (var guid in guids) { var path = AssetDatabase.GUIDToAssetPath(guid); //增加一个目录项 //AddItem会自动把WaveCreationParams传入ClickHandLer函数中 menu.AddItem(new GUIContent("CustomEvent(自定义)/" + System.IO.Path.GetFileNameWithoutExtension(path)), false, ClickHandLer, new EventInfoCreationParams() { target = null, scriptPath = path, mode = BundleEventTriggerType.GazeClick }); } } menu.ShowAsContext(); }; //移除菜单回调 eventInfo.onRemoveCallback = (ReorderableList list) => { if (EditorUtility.DisplayDialog("警告", "删除该元素?", "是", "否")) { //被移除的物体上脚本处理 BundleEventTriggerInfo removeIndo = bundleEventTriggerDesigner.bundleEventTriggerInfos[list.index];//被移除物体配置信息 UnityEngine.Object @object = removeIndo.target; if (@object != null) { //有脚本 BundleEventInfoBase bundleAction = ((GameObject)@object).GetComponent <BundleEventInfoBase>(); if (bundleAction != null) { //删除对应脚本 Type type = ((MonoScript)removeIndo.method).GetClass();; DestroyImmediate(((GameObject)@object).GetComponent(type)); } } ReorderableList.defaultBehaviours.DoRemoveButton(list); } }; //界面改变回调 eventInfo.onCanAddCallback = (ReorderableList list) => { for (int i = 0; i < list.count; i++) { //每次界面对Target物体做修改时,物体不同就要处理 //原来的物体去掉添加的脚本,当前新选择添加脚本 SerializedProperty element = eventInfo.serializedProperty.GetArrayElementAtIndex(i); UnityEngine.Object last = bundleEventTriggerDesigner.bundleEventTriggerInfos[i].target; //原来 UnityEngine.Object cur = element.FindPropertyRelative("target").objectReferenceValue; //当前 if (last != cur) { //去掉旧物体上的脚本 if (last != null) { BundleEventInfoBase bundleAction = ((GameObject)last).GetComponent <BundleEventInfoBase>(); if (bundleAction != null) { //生成之前物体脚本 DestroyImmediate(bundleAction); } } //增加当前物体脚本 if (cur != null) { Type type = ((MonoScript)bundleEventTriggerDesigner.bundleEventTriggerInfos[i].method).GetClass(); ((GameObject)cur).AddComponent(type); #region 能重复添加 //Type type = ((MonoScript)bundleEventTriggerDesigner.bundleEventTriggerInfos[i].method).GetClass(); //if (((GameObject)cur).GetComponent<BundleEventInfoBase>() == null) //{ // ((GameObject)cur).AddComponent(type); //} //else //{ // Debug.Log("物体"+((GameObject)cur).name +"重复添加脚本" + type.Name); //} #endregion } } } return(true); }; } }