关于editor:解决Editormd上传图片获取不到图片地址问题

Editor.md图片上传获取不到图片地址,Editor.md图片上传iframe存在跨域状况,几经调试都不好用,最初采取代替计划,还不存在跨域状况。最近我的项目中要反对markdown 编辑器,当初根本做技术的没有不晓得Markdown 的,因为切实是太强大了,只须要理解很简略的几个操作,即可编辑十分柔美的文章,包含TeX迷信公式(基于KaTeX)、流程图 Flowchart 和 时序图 ,不在让你浪费时间在格局的调整。背景是在PC端应用,间接引入JQuery和Markdown.md插件进行应用 editor.md目录介绍这边须要阐明一下 editor.md目录,本文介绍的版本为v1.5.0,在首页下载实现,解压editor.md-master.zip文件,能够看到如下图的目录构造: 图中红色框内是咱们要援用到我的项目的文件和目录。 css目录中可抉择editormd.min.css放在对应的我的项目css目录中;js可抉择editormd.min.js搁置在对应我的项目的js目录中,须要留神的是同时须要引入jQuery,这里应用jquery.min.js;examples文件夹中是一部分外围性能的demo,在应用的过程中用到对应的组件或性能可关上参考;fonts是须要用到字体,可一并引入我的项目;images是一些加载类的图片;lib是editor.md依赖的第三方js资源,比方流程图的js资源;plugins次要是编辑器下面的操作性能插件,比方图片上传等,可抉择应用的进行加载; 导入到web 我的项目中的目录如下: 页面中须要引入的文件,其余插件依据须要再减少<!-- 页面中增加css --><link rel="stylesheet" href="./css/style.css" /><link rel="stylesheet" href="./css/editormd.css" /> <!-- 页面中增加div --><div id="editormd"> <textarea style="display:none;">### Hello Editor.md !</textarea></div><!-- 页面中增加js --><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/jqueryform@4.3.0.min.js"></script><script type="text/javascript" src="js/editormd.min.js"></script><script type="text/javascript" src="js/showdown@1.9.1.min.js"></script><script>var testEditor = editormd("editormd", { width: "90%", height: 'calc(100vh - 85px)', path : './lib/', // theme : "dark", // previewTheme : "dark", // editorTheme : "pastel-on-dark", // markdown : content?content:'![](https://img1.446677.xyz/2021/07/04/81903e6c0536ef3a87783a6e7afc3093.jpg) ![](https://img1.446677.xyz/2021/07/08/889db52a8e84a58e9bf63970f3a01e92.jpg)', markdown : content, codeFold : true, //syncScrolling : false, saveHTMLToTextarea : true, // 保留 HTML 到 Textarea searchReplace : true, //watch : false, // 敞开实时预览 htmlDecode : "style,script,iframe|on*", // 开启 HTML 标签解析,为了安全性,默认不开启 //toolbar : false, //敞开工具栏 //previewCodeHighlight : false, // 敞开预览 HTML 的代码块高亮,默认开启 emoji : true, taskList : true, tocm : true, // Using [TOCM] tex : true, // 开启迷信公式TeX语言反对,默认敞开 flowChart : true, // 开启流程图反对,默认敞开 sequenceDiagram : true, // 开启时序/序列图反对,默认敞开, //dialogLockScreen : false, // 设置弹出层对话框不锁屏,全局通用,默认为true //dialogShowMask : false, // 设置弹出层对话框显示通明遮罩层,全局通用,默认为true //dialogDraggable : false, // 设置弹出层对话框不可拖动,全局通用,默认为true //dialogMaskOpacity : 0.4, // 设置通明遮罩层的透明度,全局通用,默认值为0.1 //dialogMaskBgColor : "#000", // 设置通明遮罩层的背景色彩,全局通用,默认为#fff imageUpload : true, imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], imageUploadURL : "https://api.xxxx.com/api/v1/editorMdImgUpload", onload : function() { /*上传图片胜利后能够做一些本人的解决*/ console.log('onload', this); //this.fullscreen(); //this.unwatch(); //this.watch().fullscreen(); //this.setMarkdown("#PHP"); //this.width("100%"); //this.height(480); //this.resize("100%", 640); }});</script>复制代码id为editormd,前面的js代码中须要用到。而且源码外部也是通过这个作为前缀的。通过form表单提交时后盾可通过content-editormd-markdown-doc获取到对应的markdown文档内容。比方Java中可通过request.getParameter(“content-editormd-markdown-doc”)留神:此处须要留神的是,无论须要html格局的内容还是markdown格局的内容,都只须要写一个textarea。此处有一个很大的坑。不少其余教程中说须要两个textarea,那么会导致后一个textarea后盾取得的数据是一个数组,而不是单纯的HTML内容。编辑器中的编辑配置:path门路须要指定到我的项目中对应的lib的门路。如果设置不对markdown 无奈渲染进去。saveHTMLToTextarea设置为true示意,转化为html格局的内容也同样提交到后盾。好,到这边你就能够看到页面成果了。如下: ...

June 17, 2022 · 1 min · jiezi

关于editor:Twaver-HTML5中的-CloudEditor-进行Angular2-重写

Twaver HTML5中的 CloudEditor 进行Angular2 重写 背景业务进度紧迫,于是破费俩天工夫对 twaver 的 CloudEditor 进行Angular2 重写革新以实现twaver初始视图构造的引入; 初识twavertwaver是一个商业闭源的绘图引擎工具, 相似的开源产品有 mxgraph, jointjs, raphael等; 重写起因长处 不减少引入三方件,manageone以后火车版本上曾经存在twaver,可间接应用;合乎业务场景, twaver官网提供了以后开发的利用场景样例且官网样例丰盛;性能稳定性已验证,公司有产品曾经应用其作出更简单场景的性能,沟通后首次判断二次开发问题不大;Angular2框架兼容, twaver的技术栈应用原生js实现与以后应用Angular2框架无缝集成;毛病 官网demo中大量应用jquery库操作dom,jqueryUI库实现UI组件和款式,首次引入须要对这些额定的三方件性能进行剥离和剔除;没有源码,不利于调试和排查问题;相熟度低,以后组内没人理解twaver;CloudEditor主体内容:|-- CloudEditor |-- CloudEditor.html |-- css | |-- bootstrap.min.css | |-- jquery-ui-1.10.4.custom.min.css | |-- jquery.ui.all.css | |-- images | |-- animated-overlay.gif |-- images | |-- cent32os_s.png | |-- zoomReset.png |-- js |-- AccordionPane.js |-- category.js |-- editor.js |-- GridNetwork.js |-- images.js |-- jquery-ui-1.10.4.custom.js |-- jquery.js重写的次要准则:输入文件均以Typescript语言实现,并减少类型申明文件;剥离间接操作dom的操作,即移除jquery库;改写twaver中过久的语法,ES6语法革新;左树菜单CloudEditor中左树菜单次要是一个手风琴成果的列表,其实现是应用AccordionPanel.js这个文件,其内容是应用动静拼接dom的形式动静生成右面板的内容;咱们应用Angular的模板个性,将其改写为Angular组件menu ,将原来JS操作dom的低效操作全副移除。 AccorditonPanel剖析// 这里申明了一个editor命名空间下的函数变量AccordionPaneeditor.AccordionPane = function() { this.init();};// 外部办法根本都是为了生成左树菜单构造,如下办法createView: function() { var rootView = $('<div id="accordion-resizer" class="ui-widget-content"></div>'); this.mainPane = $('<div id="accordion"></div>'); this.setCategories(categoryJson.categories); rootView.append(this.mainPane); return rootView[0];}, // 生成菜单题目 initCategoryTitle: function(title) { var titleDiv = $('<h3>' + title + '</h3>'); this.mainPane.append(titleDiv); }, // 生成菜单内容 initCategoryContent: function(datas) { var contentDiv = $('<ul class="mn-accordion"></ul>'); for (var i = 0; i < datas.length; i++) { var data = datas[i]; contentDiv.append(this.initItemDiv(data)); } this.mainPane.append(contentDiv); }, // 生成菜单项 initItemDiv: function(data) { var icon = data.icon; var itemDiv = $('<li class="item-li"></li>'); var img = $('<img src=' + icon + '></img>'); img.attr('title', data.tooltip); var label = $('<div class="item-label">' + data.label + '</div>'); itemDiv.append(img); itemDiv.append(label); this.setDragTarget(img[0], data); return itemDiv; },应用tiny组件重写构造<div id='left-tree-menu'> <tp-accordionlist [options]="menuData"> <!--自定义面板内容--> <ng-template #content let-menuGroup let-i=index> <div *ngFor="let item of menuGroup.contents" [id]="item.label" class="item" [attr.data-type]="item.type" [attr.data-width]="item.width" [attr.data-height]="item.height" [attr.data-os]="item.os" [attr.data-bit]="item.bit" [attr.data-version]="item.version" [title]="item.tooltip"> <img [src]="item.icon" (dragstart)="dragStartMenuItem($event, item)"/> <div class="item-label">{{item.label}}</div> </div> </ng-template> </tp-accordionlist></div>重写后组件逻辑次要是解决数据模型与UI组件模型的映射关系 ...

October 11, 2021 · 6 min · jiezi

关于editor:纹理的外部格式对其内存的影响

1)纹理的内部格局对其内存的影响2)更换Mac平台后我的项目中的局部DLL生效3)打Shader包的时候是否须要将cginc打进去4)内置Standard的代替计划 这是第264篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) TextureQ:原来一个Prefab用到的图是16MB,4096*4096像素,而后用PS压缩了一下变成600KB(分辨率不变)。打AssetBundle测试,除了AssetBundle的大小由27MB变成了20MB,在内存中的Texture 2D都是一样的。因为在Unity设置的压缩格局是一样的,所以在Unity外面看到的内存也是一样大的,难道Unity外面的图片大小跟原图大小没关系?原图大小用PS压缩/不压缩除了AssetBundle收益,在不改Unity中图片压缩格局的前提下,内存就没收益了吗? 我猜测是不是Unity读取的原图,在运行时都是依据原图,而后依据Unity外面设置的压缩格局本人在内存中是一份新的图,就跟原图没什么关系了? A1:图片导入Unity,就会按设置的格局和压缩变成Unity本人的格局,此时的内存大小就和图片原始大小无关了。这时要到Inspector里的下方看图片的压缩格局和内存大小。猜测是Unity把图片导入时,主动转换了一份本人的格局存储到了Library里,所以真正加载显示的就不是原始那张图片了。感激林健@UWA问答社区提供了答复 A2:首先咱们要明确一个概念,咱们在电脑上看到的png格局或者jpg格局的图片,png / jpg只是这张图片的容器,它们是通过绝对应的压缩算法将原图每个像素点信息转换为用另一种数据格式示意,以此达到压缩目标,缩小图片文件大小。 当Unity将这张图片加载进内存时,这些文件会被转换为特定的格局,调取速度更快,占据内存更少,比方ASTC_6X6等。 纹理加载进内存后,大小计算公式如下:纹理内存大小(字节)=纹理宽度 x 纹理高度 x 像素字节像素字节 = 像素通道数(R/G/B/A)x 通道大小(1字节/半字节) 感激马三小伙儿@UWA问答社区提供了答复 EditorQ:我的项目须要开发Mac OSX平台利用,换到苹果电脑之后sqlite3.dll和user32.dll生效了,在网上下了很多替换的都不行,其它的DLL都能够,请问如何兼容这两个DLL呢? A:你的sqlite3.dll应该是只能利用于Windows平台,Mac上须要对应平台的Sqlite库。user32.dll这个很显著是个Windows平台的动态链接库,Mac上无奈应用。 我又搜寻了一下材料,发现在iOS、Mac上如同不须要额定地去导入原生的Sqlite库,它们有自带预编译好的Sqlite库。你所须要做的是:将Mono.Data.Sqlite.dll这个文件从引擎目录拷贝进去,搁置在Plugins目录下。 具体能够参考这两篇教程:《Unity工具—Mono.Data.Sqlite 应用》 集成流程看这个:《Setup Database (SQLite) for Unity》 我依照下面的步骤做了一个Demo测试了一下,Windows和Mac上都能够失常的运行。 感激马三小伙儿@UWA问答社区提供了答复< ShaderQ:原本我的项目中用的是内置的Standard,为了缩小变体的起因,将Built in的Shader蕴含cginc文件的全副放到本地。打Shader的时候,须要把援用到的cginc文件也打进Shader包内吗?看到有说其实cginc的代码片段被编译到了Shader中,依照这种说法不就应该只有打Shader就行,对应的cginc是否还须要打进去? A1:不须要,打包时候Shader会编译成对应平台的Shader,曾经主动将cginc的代码合并进来了。感激范世青@UWA问答社区提供了答复 A2:不须要的,举个例子,如下一个简略的CG,其中定义了vert和frag函数,及2个uniform和一个常量: 同时创立一个“Shader1”应用这个CG的vert&frag实现: 在Shader的Inspector面板抉择对应平台编译,Shader的编译相似C++的编译,#include能够了解为将文件内容开展,编译完的后果如下,Vertex Program: Fragment Program: Shader打包就是编译的过程,所以不须要把CG/cginc等打包。 感激羽飞@UWA问答社区提供了答复 ShaderQ:应用内置的Standard,一方面有变体,另一方面应用一次7MB内存,有没有比拟不错的替换计划?也能够本人写一些漫反射、金属、高光等属性,想问一下有没有更好用的? A1:首先,内置Shader在理论我的项目中确实不被举荐应用,因其Keyword导致变体十分多,最终Shader本身或ShaderLab的内存占用会比拟高,这个统计受到Unity版本的影响。 该点可参考:《Shader内存统计与版本关系》 其实本人写Shader是最可控的形式了,能够依据本人的我的项目写一些有针对性的成果,如果只须要一些惯例的成果,能够参考Standard Shader的源码,用一些Unity封装好的基于PBR光照模型的办法。 感激翟孟飞@UWA问答社区提供了答复 A2:通过本地目录Editor\Data\CGIncludes中的cginc文件和官网下来的Built in Shader把你须要的成果都抽出来缩小Shader的变种数量。打包的Shader和对应的cginc是主动打在一起的。感激萧小俊@UWA问答社区提供了答复 A3:不倡议应用内置Shader,起因题主也写了。默认的Shader更多的是给到一个大而全的抉择,比拟适宜疾速做原型Demo。 理论我的项目开发中倡议还是依据美术的理论需要本人从头来写,局部性能能够参考内置Shader的代码,这样既能满足美术需要,又能满足性能的要求。 感激范君@UWA问答社区提供了答复 A4:这个Standard就是把以前的一些Built in的Shader交融在一起了,实现的成果的确是多了,然而也显得很臃肿,还是倡议本人拆分定制不同的Shader,或者下载Built in外面的Shader。感激Lim@UWA问答社区提供了答复 20210824更多精彩问题等你答复~ 1.Vulkan API的性能及兼容性2.Unity TMP字体计划如何抉择3.如何实现AAB包的增量更新 封面图来源于:ChromaPackChromaPack - Unity的有损纹理压缩插件。 明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。 ...

August 30, 2021 · 1 min · jiezi

关于editor:Addressable热更新资源类型的疑问

1)Addressable热更新资源类型的疑难2)本地删除FBX的DefaultMaterial在Unity重启后生效3)如何实现MeshRenderer的成果4)UGUI动静加载Item的DrawCall问题5)Loading.CheckConsistency [Editor Only]编辑器上的优化问题 这是第250篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) AddressableQ:Addressable能够热更新Text/Xml等原始资源,不走AssetBundle吗?正在思考是否应用Addressable作为热更新计划,有一些资源不想走AssetBundle,想间接读取,不晓得Addressable是否反对? A:Addressable目前没有间接反对Raw资源,根本都是走AssetBundle的。 一个思路就是把这些资源独自打AssetBundle,以AssetBundle为载体,逻辑上还是当成独自的Text,Binary去读取;另外一个思路就是做扩大革新。 能够看到有TextDataProvider这个Provider类,外部用“File.ReadAllText(path);”获取资源,因而其实能够去实现一下AddressableAssetGroupSchema和BuildScriptBase,做一个RawAssetSchema和BuildScriptRawAsset的扩大来打包。 感激黄程@UWA问答社区提供了答复 EditorQ:用了Addressables零碎,打包AssetBundle有Default Material有冗余,在打包机上运行脚本把FBX的默认材质删除后变紫,然而从新关上工程后默认材质又回来了,导致冗余还在。(Unity版本2018.4.34) 删除材质的脚本: using System;using UnityEngine;using System.Collections;using System.IO;using UnityEditor;using Object = UnityEngine.Object;class DisableMaterialImport : AssetPostprocessor { [MenuItem("Tools/Reimport All Model")] public static void ReimportAllModel() { var assetPaths = AssetDatabase.GetAllAssetPaths(); Array.Sort(assetPaths); Debug.LogWarning(string.Format("Total assets count: {0}", assetPaths.Length)); int processedCount = 0; foreach (string assetPath in assetPaths) { string normalizedAssetPath = assetPath.ToLower(); if (!normalizedAssetPath.EndsWith(".fbx") && !normalizedAssetPath.EndsWith(".obj") && !normalizedAssetPath.EndsWith(".3ds")) { continue; } var modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter; if (modelImporter == null || modelImporter.importMaterials) { continue; } AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ImportRecursive | ImportAssetOptions.ForceUpdate); Debug.Log(assetPath, AssetDatabase.LoadMainAssetAtPath(assetPath)); processedCount++; } Debug.LogWarning(string.Format("Total processed model count: {0}", processedCount)); AssetDatabase.SaveAssets(); } private static void FixedModelImport(ModelImporter modelImporter, GameObject model) { //Debug.Log("FixedModelImport "+model); var renderers = model.GetComponentsInChildren<Renderer>(true); if (renderers == null) { return; } modelImporter.importMaterials = false; modelImporter.importBlendShapes = false; modelImporter.importAnimation = false; modelImporter.isReadable = false; modelImporter.optimizeMesh = true; foreach (var renderer in renderers) { if (renderer == null) { continue; } renderer.sharedMaterials = new Material[renderer.sharedMaterials.Length]; }/* var animator = model.GetComponent<Animator>(); if(animator!=null) Object.DestroyImmediate(animator);*/ }A1:我这边试验过,不会变回来啊,会不会是把工程回滚了。另外这个脚本的ReimportAllModel只对自身就没有勾选Import Materials的模型无效。感激Prin@UWA问答社区提供了答复 ...

May 26, 2021 · 2 min · jiezi

关于editor:年轻人的第一个VSCode扩展

序言入坑VS Code前,我曾经是一名久经考验的Emacs老用户了,因而开始正式应用VS Code后,我第一工夫启用了它的Emacs Keymap。但不久我便发现,这套键映射短少一个重要的快捷键——ctrl-l。 在Emacs中,ctrl-l对应的命令是recenter-top-bottom,它用于将光标所在的行轮替地滚动到可视区域(即Emacs中的window)的两头、顶部,以及底部(如下图所示) 这是我高频应用的一个性能,尤其是跳转到函数的定义的首行后,我习惯于连按两次,将其滚动到window的顶部以便在一屏中看到尽量多的内容。 为了防止反复创造轮子,我先搜寻了一番,找到了一个声称实现了该性能的扩大Recenter Top Bottom。惋惜的是,装置后并不失效。 难道只能冤屈本人用鼠标小心翼翼地将光标所在行滚到顶部了吗?当然不是。既然没有开箱即用的,那便本人写一个VS Code的扩大实现这个性能吧。 年轻人的第一个VS Code扩大创立VS Code扩大的我的项目要想入门VS Code扩大的开发,官网便提供了一份不错的教程。一个扩大有许多的“八股文”代码,能够用yo和generator-code来疾速生成 npm install -g yo generator-codeyo code到这里,便失去了一个名为helloworld的目录了。用VS Code关上它,接下来要在其中大展身手。 实现将光标所在行垂直居中的性能VS Code扩大的外围逻辑定义在文件src/extension.ts中。在yo生成的示例代码中,用registerCommand注册了一个名为helloworld.helloWorld的命令,其逻辑是简略地在右下角弹出一句Hello VS Code from HelloWorld!。这个回调函数,便是业务逻辑的落脚点。 要想实现将光标所在行滚动到两头的性能,首先要晓得VS Code为开发者提供了哪些反对。在摸索了一通从VS Code的API文档后,我有了以下的线索: 通过vscode.window.activeTextEditor能够获得以后聚焦的编辑器——其值可能为空(undefined);TextEditor实例的属性.selection.active能够获得以后光标的地位;TextEditor实例有一个办法revealRange能够滚动文原本扭转展现的范畴,它须要一个vscode.Range类的实例,以及一个vscode.TextEditorRevealType类型的枚举值;vscode.TextEditorRevealType.InCenter的成果是将所给定的范畴展现在两头,vscode.TextEditorRevealType.AtTop则是置顶。有了这些常识储备,实现这样的一个回调函数便是信手拈来的事件了 function recenterTop() { const editor = vscode.window.activeTextEditor; if (!editor) { return; } const cursorPosition = editor.selection.active; editor.revealRange(new vscode.Range(cursorPosition, cursorPosition), vscode.TextEditorRevealType.InCenter);}因为临时没有配置该命令的快捷键,只能用VS Code的命令面板来调用 实现将光标所在行置顶的性能接下来我将实现间断调用两次helloworld.helloWorld命令,把光标所在行滚动到顶部的成果。在Emacs中,能够很轻松地晓得一个命令是否被间断运行——Emacs有一个名为last-command的变量存储着上一个命令的名称,只须要查看其是否等于recenter-top-bottom即可。但VS Code没有裸露这么弱小的性能,只能另辟蹊径。 我的策略是,如果调用helloworld.helloWorld时光标的地位,与上一次调用该命令时的地位雷同,就认为是间断调用。为此,须要两个在函数recenterTop之外定义的变量: previousPosition负责记录上一次调用recenterTop时光标的地位,它的初始值为null;revealType存储着上一次调整展现范畴时传递给TextEditor实例的revealRange办法的第二个参数的值,它的初始值也为null。我的指标是尽量模仿Emacs中的recenter-top-bottom所具备的、交替应用居中、置顶成果的特点,因而: 如果revealType为null,意味着这是第一次调用recenterTop,那么成果便是居中。否则;如果这一次与上一次的光标地位不同,意味着在上一次调用recenterTop后调用过其它命令,成果仍然是居中。否则;如果revealType曾经是居中了,就改为置顶。否则;将revealType改为居中。Talk is cheap. Show me the code.let previousPosition: null|vscode.Position = null;let revealType: null|vscode.TextEditorRevealType = null;function recenterTop() { const editor = vscode.window.activeTextEditor; if (!editor) { return; } const cursorPosition = editor.selection.active; if (!revealType) { revealType = vscode.TextEditorRevealType.InCenter; } else if (previousPosition && !cursorPosition.isEqual(previousPosition)) { revealType = vscode.TextEditorRevealType.InCenter; } else if (revealType === vscode.TextEditorRevealType.InCenter) { revealType = vscode.TextEditorRevealType.AtTop; } else { revealType = vscode.TextEditorRevealType.InCenter; } previousPosition = cursorPosition; editor.revealRange(new vscode.Range(cursorPosition, cursorPosition), revealType);}定义快捷键通过命令面板来应用不是我的最终目标,通过快捷键才是。依据VS Code的文档能够晓得,只有在package.json的contributes对象中,新增名为keybindings的属性,并定义命令及按键序列即可。 ...

January 2, 2021 · 1 min · jiezi

关于editor:如何通过Timeline的形式实现技能编辑器

1)如何通过Timeline的模式实现技能编辑器2)Addressable如何通过Group Name取得Group下的Key3)Unity如何获取Sprite在Sprite Packer中的UV值4)AnimatorController在UnityEditor下,如何获取所有的状态名5)Unity为UGUI的Mask做了怎么的解决 这是第228篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) EditorQ:我的项目须要通过Timeline的模式实现做个技能编辑器,时间轴的模式是怎么实现的?整个的技能编辑器有没有相干的参考? A1:倡议学习Timeline的应用办法以及传统技能编辑器是怎么做的,而后再想想看如何联合。上面这篇文章能够先读一读: 《ACT技能编辑器的制作教训分享》该问答由UWA提供 A2:可参考官网的Timeline扩大,2017年Unite也有个相干的主题:https://assetstore.unity.com/packages/essentials/default-playables-95266感激羽飞@UWA问答社区提供了答复 A3:第一,时间轴的模式是怎么实现的? 你能够参考几个Unity 的插件:https://assetstore.unity.com/packages/tools/animation/cinematic-sequencer-slate-56558举荐SLATE,扩大起来比拟不便:https://assetstore.unity.com/packages/tools/animation/flux-18440 第二,技能编辑器思路。有了下面的时间轴框架之后就是基于时间轴去开发不同类型的帧,比方:播放特效帧、动画帧和打击点帧等等。 举个特效的例子: 技能特效不外乎几个参数:特效名、偏移信息和挂接点等等;而后须要去实现执行到这个关键帧的时候具体怎么执行的业务代码,比方依据帧下面的配置的特效名参数加载出这个特效,偏移信息和挂接点参数设置特效的Transform;帧的长度就是这个特效的生命周期,帧执行完退出时做下销毁工作。感激波波@UWA问答社区提供了答复 AddressableQ:Addressable能够通过Group Name取得这个Group下的Key吗? 我把热更新放在了游戏开始时对立做。更新流程大略是:创立一个加载界面(资源在Addressable中是独立的Group,暂且叫startGroup),接着查看Catalog是否有更新,而后拿到所有的Key值下载资源。 这个流程是没有问题的,问题出在:如果在更新时网络中断了,Addressable仿佛会把更新列表里的资源内存开释掉,应用了所有Key来进行下载的加载界面资源会失落(变黑)。经测试,手动把startGroup里的Key排除掉,就没有这个问题。所以通过Group Name如何取得这个Group下的Key?或者有好的更新计划分享吗? A1:有一个外部函数: internal bool GetResourceLocations(object key, Type type, out IList<IResourceLocation> locations) 能够参考一下具体实现,这也是相似GetDownloadSizeAsync这样的函数在外部调用的。至于资源失落问题信息不够不太好判断了。 感激黄程@UWA问答社区提供了答复 A2:能够把startGroup里的资源的Label都设置成了“start”,通过Lable能够拿到Location列表,而后把这个列表中的Key值从总列表外面排除: public static List<string> GetAllKeys(string labelName){ var t = Addressables.ResourceLocators; List<string> keys = new List<string>(); foreach (var location in t) { if (!(location is ResourceLocationMap)) continue; ResourceLocationMap locationMap = location as ResourceLocationMap; locationMap.Locate(labelName, typeof(object), out var startLocationList); foreach (var info in locationMap.Locations) { if(info.Value.Count == 0) continue; string str = info.Value[0].PrimaryKey; bool isHas = false; foreach (var startLocation in startLocationList) { if(startLocation.PrimaryKey == str) { isHas = true; break; } } if (isHas) continue; string key = info.Key.ToString(); if (int.TryParse(key, out var num)) { continue; } if (!keys.Contains(key)) { keys.Add(key); } } } /*foreach (var locator in t) { foreach (var key in locator.Keys) { int value = 0; string str = key.ToString(); if (!int.TryParse(str, out value)) { keys.Add(str); } } }*/ return keys;} 感激大侠陈二狗@UWA问答社区提供了答复 ...

December 15, 2020 · 1 min · jiezi

关于editor:Emacs的avy插件

用Emacs的时候,我习惯将它分成“四个局部” 怎么弄的呢?个别是先按C-x 3分出左右两个window,再到各个window中用C-x 2分出高低两个window——这不是我的笔误,在Emacs的术语中,用来显示一个buffer的区域就叫做一个window。而经常被人们冠名为window的、最外层的窗体,则叫做frame。 这样划分后,屡次按下C-Tab(我把这个快捷键绑定到了命令other-window上),便能够依照左上、左下、右上、右下的程序轮换以后聚焦的window了。 如果须要从其它window中复制内容到以后window中粘贴,操作会麻烦一点。以右上角须要左下角的内容为例: 按三次C-Tab换到左下角的window中——用快捷键是因为我不想去挪鼠标;按k或j高低挪动光标到指标行——用k和j是因为用了evil-mode插件(参见这篇文章);复制内容,再按一次C-Tab回到原来的window中粘贴。听起来可麻烦了。 好在Emacs有一个十分好用的插件,能够把第1和第2个步骤合在一起实现。 avy这个十分好用的插件就是avy,它提供的avy-goto-line函数能够一步到位地实现下面的第1和第2个步骤。 用Emacs的包管理器就能够装置它 M-x package-install RET avy RET接着要为命令avy-goto-line绑定一个喜爱的快捷键 (global-set-key (kbd "M-g f") 'avy-goto-line)至此便能够在Emacs中欢快地应用M-g f来疾速跳转到以后或其它window中的行了。百闻不如一见,我来演示一番。 avy-goto-line家喻户晓,我用org-mode来跟踪本人的学习打算,还会将摸索过程中的一些半成品代码保留到org-mode的条目中。例如,我想要将左下角的window中的三个函数的定义,复制到右上角的代码块中去 于是我先按下M-g f,让avy为每一行赋予一个标记 因为心愿切换到左下角的window的第一行,所以我先按下j 此时,在前一幅截图中不以字母j开始的标记通通隐没了,而以字母j开始的标记则只留下了从第二个字符开始的局部。 再按下字母l,就能够将焦点切换到左下角的window,并且将光标挪动到第一行的行首了。而后只须要选中内容、复制,并返回原来的window中粘贴即可。残缺的过程如下 后记如果在按下组合键M-g f后,接着按下的是数字键的话,avy-goto-line会认为使用者打算跳转到指定的行。它将在Emacs的minibuffer中持续期待输出更多的数字或按下回车。不过我不怎么用这个性能,因为我没有让Emacs显示行号,按行号来跳转对我并不不便。 浏览原文

October 11, 2020 · 1 min · jiezi

关于editor:手指疼写点代码缓解一下

我常常应用Emacs来干写字的活——有时候是写代码、有时候是用org-mode治理待办事项、有时候是用restclient-mode来测试HTTP API。Emacs丰盛的快捷键让我能够双手不离主键盘区就做到很多事件,不过这也带来了别样的懊恼:快捷键按多了,手容易累。 导致手累的第一个因素,是Emacs的不少快捷键须要按住ctrl来应用,而ctrl经常不容易按到。以我的键盘为例,ctrl键散布在主键盘区的最外侧 为了便于尾指按到两侧的ctrl键,我在macOS中替换了command和control键的成果 当须要按住两边的ctrl键(理论按下的是下面照片中的Windows图标键)时,手段须要往外拐过去。这个问题在应用VSCode时同样存在,因为我在VSCode中用的也是Emacs的键映射。 第二个因素是Emacs的一些快捷键太繁琐,导致应用时双手像在键盘上起舞个别到处按来按去,敲击次数过多。例如,让光标上下左右挪动的快捷键别离是ctrl-p、ctrl-n、ctrl-b,以及ctrl-f,这比间接用键盘上的方向键麻烦得多。有一些性能甚至要按三组快捷键,比方org-clock-out要先按ctrl-c,再按ctrl-x,最初按ctrl-o。 有没有方法既能够保留快捷键的高效,又尽量地缩小击键导致的手段和手指的疲劳呢? 当然有。 在Emacs中改用Vim的快捷键既然Emacs默认的快捷键不容易按,那么无妨换成Vim格调的快捷键。同样是上下左右挪动光标,在Vim中只须要单击k/j/h/l这四个按键即可,不仅可能单手操作,而且这四个键正好是右手”触手可及“的地位。其它的性能,例如在文件内搜寻、保留文件等,也只须要按/和:w即可,比起Emacs真是”finger-friendly“得多了。 那么如何能力在Emacs中用上Vim的快捷键呢?答案是用evil插件。先用包管理器装置它 M-x package-install RET evil RET而后在Emacs的启动配置文件中增加启用evil-mode的代码 (require 'evil)(evil-mode 1)当初便能够在Emacs中应用Vim格调的快捷键了 定制evil-mode只是简略地启用evil-mode还不足以将双手从频繁的按ctrl中解放出来,因为在Emacs中还有不少其它的高频快捷键依赖于ctrl,例如用ctrl-x b来切换到其它的buffer中、用ctrl-x ctrl-f来关上或新建一个文件,甚至是用ctrl-c ctrl-x ctrl-o来进行一个工作的计时器。 就像在数据压缩中,用较短的串来代替呈现频率较高的原始字符串一样,对于高频应用且快捷键较长的性能,能够为它们绑定较短的快捷键。在evil-mode中,g是一个前缀键并且也很好按,所以我把一些重度应用的性能都绑定了在了以它为前缀的快捷键上 ;;; evil-mode相干的键绑定(evil-global-set-key 'normal (kbd "g b") 'ido-switch-buffer)(evil-global-set-key 'normal (kbd "g f") 'ido-find-file)(evil-global-set-key 'normal (kbd "g o") 'org-clock-out)(evil-global-set-key 'normal (kbd "g s") 'cuckoo-org-schedule)(evil-global-set-key 'normal (kbd "g t") 'org-todo)(evil-global-set-key 'normal (kbd "s") 'save-buffer)在VSCode中改用Vim的快捷键搬砖的工具是VSCode,用来写Node.js的我的项目,次要是因VSCode在写Node.js代码这方面的确比Emacs的js-mode、js2-mode,以及tide-mode之流要好用那么一点。在VSCode中我也改用了Vim的键映射,只须要在插件市场中点击装置即可 VSCode的Vim键映射实际上是一个独立的插件Vim,它也反对进一步地自定义快捷键。出于集体爱好,我把s绑定为保留文件的性能 // VSCode的配置文件setting.json"vim.normalModeKeyBindings": [ { "before": ["s"], "commands": [ "workbench.action.files.save" ] }],用BetterTouchTools补充evil-mode的有余只管在Emacs中能够将罕用的性能绑定到一系列的、以g结尾的较短的快捷键上,但这一招并不能用来解决所有的快捷键,因为太多的自定义快捷键也会带来记忆上的累赘。但我不会就此止步。 ...

September 28, 2020 · 1 min · jiezi