源码编辑器,像视频中,鼠标移动到按钮(角色),按钮(角色)突出显示的效果怎么做?

本站内容采集来源于互联网,如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解! E-mail:



  1. 下载 . 你也可以如下所述方法通过Git获得最新版.
  2. 导入这个Unity组件包 (双击它就可以让Unity打开).

通过Git而非unity组件包获取最新运行时

在处理 AnimationState 事件的类中添加欲监听事件的委托:

以下是可供使用的yield指令:

在检查器中手动输入动画名称等字符并不方便. 因此, spine-unity为提供了一种将字符串参数作为下拉(popup)字段的方式. 可以在 string 属性前加上下文列出的属性特性(property attribute), 以将其自动转为一个可下拉选择选择的字段, 比如下拉列出一个skeleton上的所有可用动画. 如果你在Spine组件中看到过某个字段, 那么也可以在你自定义的组件中通过属性特性下拉相同字段. 下表展示了可用的属性特性:

更多内容请查看spine-unity包中附带的 中的字符串属性特性.

注意: 与相比, 如果要从前一动画的时间轴状态平滑地过渡(动画混合), SkeletonMecanim 强制要求后续动画的时间轴首帧为关键帧. 更多信息请参见下文的一节.

SkeletonMecanim 组件提供的参数与类似, 请查阅以了解更多信息.

为了平滑地将一个时间轴状态(如骨骼旋转)从一个动画mix out到下一个动画, 后一个动画在setup pose时, 需要在首帧添加一个关键帧.否则前一个动画的时间轴状态不会被清除. 相较于 , 这是

Auto Reset 这一参数会重置动画状态, 但会在动画过渡结束时粗糙地进行mix out, 无法实现平滑的过渡效果.

  • Auto Reset. 当其置为 true, 在一个动画结束时, skeleton状态会mix out为setup pose. 当一个动画改变了附件的可见性状态时, 这就特别重要了:当mix out时, 附件可见性将变为setup pose状态, 否则当前的附件状态将保持到另一个动画的关键帧再度设置这个附件.

则代表当前状态(例如前一帧). 变量 w 表示过渡权重(过渡开始时为0, 过渡结束时为1). 每种图层blend模式的(推荐)mix模式以粗体标出.

你可以将Spine动画拖放到Animator面板来向控制器的动画状态机添加动画. 添加后的动画会显示在控制器资产下.

MonoBehaviour 脚本, 使用名为 Footstep() 的方法来处理该事件.当在Spine中使用文件夹时, 方法名则是文件夹名和动画名的拼接.例如, 若前文中的事件被放在一个名为 Foldername 的文件夹中时, 方法名将为

Spine/Skeleton 的URP、LWRP或常规着色器. 没有肉眼可见的视觉错误并不意味着该着色器可以与 SkeletonGraphic 一起正常工作. 我们已知这种的情况: 它在移动设备上的渲染不正确, 然而在Unity编辑器中的渲染却没有任何问题. 和其他UI组件一样,

并可能导致绘制调用的数量上升.

  • OneMinusSrcAlpha的普通着色器时, 则禁用该参数. 当禁用时, 它可以防止additive槽位的单batch渲染, 且可能会使得绘制调用的数量增加.

  • 这样的组件会当作RectTransform完全位于网格外部而在绘制时忽略skeleton, 即使部分应被渲染的网格仍在RectTransform内部.

    • 但会产生额外的性能开销.

    • 启用后将自动创建额外的分离部件GameObjects, 也会附加相应的 CanvasRenderer GameObjects到层级架构中.分离部件的 GameObjects 可以根据你的要求在层次结构中移动并重新设置层级关系, 以便保证在 Canvas 中的绘制顺序.

中找到高级示例场景, 它展示了如何设置分离器(separator)槽位和修改绘制顺序.

注意: 多数时候均应使用、 或. 这些组件提供了丰富的动画控制方法. 该组件只有在手动应用无过渡动画(如UI仪表元素中)时可能有用.

你可以查阅 部分以了解更多信息.

注意: 组件仅用于 对象. 当它用于

注意: 对象有自己专用的 组件.

使用它可以让粒子系统等对象跟随skeleton上的某个骨骼.

你可以在示例场景 中查看如何设置 BoneFollower 组件.

该组件为 组件的 版本, 和 组件搭配使用.

使用它可以让粒子系统等对象跟随skeleton上的某个骨骼.

这个组件类似于 组件, 但是它跟随的是一个 而非一个骨骼.

这个组件用于在skeleton的槽位中匹配一个. 它会获取边界形状并将其传递给 PolygonCollider2D , 且在每一帧启用或禁用它以匹配当前动画.

注意: 顶点变形动画(随着时间推移, Bounding Box的顶点也会移动的动画)不会被跟随, 组件只能覆盖其skeleton的初始形状.

有时你需要在运行时以编码的方式修改骨骼位置, 以以便对物理运动或用户输入做出反应.

组件提供了一个方便的接口, 让GameObjects跟随一个骨骼位置, 通过手动或2D/3D物理来覆盖一个骨骼的位置.它可以被配置为 跟随(follow) 本地骨骼位置或在每次 Update

层次结构的推荐方法是使用中的 组件.

SkeletonUtilityBone 检查器还提供了一个接口来(选择性或递归性地)创建额外的子骨骼或创建.

如果一个GameObject只跟随一个骨骼的位置, 你可以使用 组件来节省资源.

你可能想为你的角色的披风添加物理效果, 让角色拖拽重物或者给它加个流星锤. spine-unity运行时可以从现有的 层次结构(见)中生成 或 元素的physics rig.

子元素都会转换为一个铰链. 然后你可以调整Rigidbody的阻力(drag)和质量(mass)参数来调整效果. 提高阻力值将使Rigidbody移动得更慢, 可以创造出物体沉重或被空气阻碍的效果.

请注意, 链根节点不再以skeleton的骨骼为父节点, 而是放置在场景的最高层级.这是Unity中使用动量的一个要求.不要把链根节点再置入skeleton骨骼的层级中, 否则链元素将不再受到skeleton运动的影响!

  1. 调整链元素Rigidbody的阻力和质量参数来调整效果.
  1. 调整链元素Rigidbody2D的阻力和质量参数来调整效果.

你可能想覆盖某个skeleton实例甚至某个槽位的material. 该组件提供了一个检查器接口, 用于为(包括子类 和 )设置自定义material覆盖.

有时可能需要在角色的各个部分之间显示其他的GameObjects, 例如: 让你的角色爬到一棵树上, 在树干前面显示一条腿在树干后面显示另一条. SkeletonRenderSeparator 组件让你可以将 (或其子类 和 )分为两个或更多个SkeletonPartsRenderers, 且可自定义其图层顺序.

  1. 确定Skeleton的绘制顺序. 找出你想用哪个槽位来将Skeleton渲染分为多个部件.为方便起见, 在导出skeleton之前应清晰地标注该槽位.

  1. 注意: SkeletonRenderSeparator 会根据当前的绘制顺序来检测当前所需的部件渲染器的数量. 如果在运行时修改了绘制顺序, 可能会发现渲染器需要更多的部件渲染器. 在这种情况下, 可以通过点击 Add Parts Renderer 按钮, 手动添加一到两个额外的部件渲染器.

默认情况下, 它将添加当前必要的 SkeletonPartsRenderers. 它也为高级用例提供了一些可选的参数, 详情请查看.

注意: Spine着色器还不支持.

  1. 所需额外的设置步骤(用于tint color顶点数据):

  2. 所需的额外设置步骤(用于tint color顶点数据):

    URP Shaders UPM包提供了专门为Unity通用渲染管线构建的着色器, 包括2D渲染器功能.

    用于2D渲染器的URP版着色器 (切勿用于URP (3D) 前向渲染器)

    用于3D渲染器的URP版着色器 (切勿用于 URP 2D 渲染器)

    你可以使用任何非Spine着色器.如果你想在其中复刻Spine着色器专用功能, 请参见论坛上的帖子[], []. 如果你有任何问题, 欢迎随时来上发帖.

    虽然官方没有为Amplify着色器编辑器提供着色器模板, 但用户 Hana 已经在论坛上热情地分享了.

    请先熟悉一下为Unity编写自定义着色器的. 特别是提供了一个很好的概述, 让你更容易理解spine-unity着色器的各个部分在做什么.

    从现有的spine-unity着色器开始编写自己的着色器

    强烈建议从现有的spine-unity 着色器副本着手.然后, 你可以逐步修改一个已可用的着色器, 调整它来达到你想要的效果.例如, 你可以在着色器返回最终颜色结果之前添加自己的颜色处理代码.下面的代码展示了一个简短的示例, 说明了如何创建一个添加了灰度(grayscale)功能的修改版 SkeletonGraphic 着色器:

    使用非Spine着色器或可视化着色器编辑器时的附加说明

    务必考虑以下spine-unity着色器和其他非Spine着色器间的区别:

    UI和非UI着色器的一般准则是:

    • 通过乘以顶点颜色来对texture进行tint
    • 将texture颜色与顶点颜色相乘
    • 为了在着色器中使用光照, 建议从一个可用的lit着色器开始修改, 来得到你所需的版本. 简单地将一行 Lighting Off 改为 Lighting On 并不能达到预期的效果, 你需要在你的顶点着色器(对于每顶点照明(per-vertex lighting))或片元着色器函数(对于每像素照明(per-pixel lighting))中计算光照, 再乘以颜色强度. 还要注意的是, URP, URP-2D和标准管线着色器的光照计算步骤均不同, 所以参考着色器代码时一定要选择对应的着色器.

    • 在着色器上启用fog需要在着色器代码中添加一些额外的顶点参数和函数调用. 例如 UnityCG.cginc 的代码:

    • 由于不能写入半透明的深度, 可以把片元写入深度缓冲区, 也可以丢弃片元(这时不投射阴影). 这是通过调用阈值(thresholding)函数完成的:

Dragon示例展示了这种有很多绘制调用的用例:

因此, 建议将附件打包到尽可能少的atlas页中, 并根据绘制顺序将附件分组置入atlas页以防止多余的material切换. 请参阅了解如何在你的Spine atlas中编排atlas区域.

这些skeleton颜色值将置为顶点颜色且不改变material属性.

这也同样适用于tinting某个附件:

注意: 当你的动画修改附件的颜色值时, 一定要使用诸如 的回调来在动画应用后设置全部槽位的颜色值.

着色器变量名通常以 _ 字符开头, 且从不包含任何空格. 它旁边的字符串 "Fill Color" 就是在检查器中显示的名称.

然而alpha blending有个老问题, 就是无法自动地对z-buffer进行深度排序.所以三角形需要按照从后到前进行渲染, 将各部件堆叠绘制. 每个 都会生成其对应网格, 按照Spine中定义的绘制三角形. 一次绘制调用即可将一个网格中部件有序的skeleton正确绘制.

在网格之间, spine-unity利用Unity的许多渲染顺序系统来决定哪个网格应该在哪个上面. 按照标准的spine-unity设置, 整个skeleton网格的渲染顺序由以下多个因素决定:

  1. . 与多机位的设置有关.

如果一个场景的渲染器处于相同的sorting layer, 顺序相同且着色器 Queue 标签也相同, 那么则可以通过与摄像机的距离来控制Spine GameObjects的顺序. 请注意这里的摄像机提供了 属性.

你可以通过代码访问这些属性:

在使用正交相机时, 特别容易出现多页atlas的skeleton排序错误的情况. 这个问题可以通过在skeleton的GameObject中添加一个 组件来解决. 另一个解决方法是将摄像机请为旋转一下, 比如, 将摄像机transform的旋转Y值置为0.001.

你可能想在角色的各个部分之间显示其他的GameObjects, 例如: 让你的角色爬到一棵树上, 在树干前面显示一条腿在树干后面显示另一条.

当降低skeleton的alpha值使其半透明时, alpha blending将导致skeleton后面的部分露出来. 这是一个常见的问题, 因为每次绘制三角形时才会应用透明度.

解决该问题的一个办法是使用过渡中间件.

注意, 这只是实现淡出效果的多种方法之一. 可能还有其他更简单的解决方案, 比如用纯色来渐进地tinting skeleton, 或减小比例(scale)等等. 现在的2D游戏可以承担较大的开销, 因为RenderTextures是一种开销很大的方案, 在过去很少使用.

spine-unity附带了额外的示例组件, 展示了一些高级用例的解决方案. 下文列出了一些最重要的示例组件.

如果需要把一个动画skeleton变成一个类似木偶的布娃娃, 例如在角色死亡时模拟物理跌落. 这可以通过 SkeletonRagdollSkeletonRagdoll2D 示例组件来实现, 它们提供了一个简单的接口来在 (或子类 和 )上创建布娃娃物理组件.

在某些情况下, 你可能需要将skeleton渲染到上而非直接渲染到屏幕上. 比如可能需要. 该组件可以将skeleton以适当的尺寸和分辨率渲染到RenderTexture, 并显示于匹配的边框中, 这样就可以一对一地无缝替换替换这些skeleton.

重要提示: 相较于直接绘制skeleton到帧缓冲区中, 使用中间件RenderTexture进行渲染是开销较大的操作. 只有在必要之处才应使用该组件. 请保持其禁用直到你真正需要显示目标特效时再启用它. 例如, 只在淡出时启用SkeletonRenderTexture组件, 而在淡出前后均保持禁用.

你可能想调整透明度来淡出skeleton, 但又想避免附件重叠问题. 该组件可以与或组件(需预先添加)搭配使用, 将一个完全不透明的skeleton渲染到一个临时的上, 然后在场景中以不透明度的渐变来绘制这个RenderTexture上的内容.

该组件可用于再次渲染一个已经被动画化和更新的skeleton网格, 以节省动画和计算网格的开销.

spine-unity运行时包含示例场景, 以演示重要组件和C# API在一般场景下的使用.你可以在 Spine Examples 顶层目录中找到它们.每个场景都包括一个描述文本, 可以帮助你快速探索和理解相关部分.

该场景演示了基本的动画C# API代码的使用——开始动画以及对动画事件做出响应.

该场景演示了如何通过使用多个动画轨道同时播放动画. 还展示了如何使用 AnimationReferenceAssets 来替代动画名字符串的使用.

并方法在轨道0和1上将其作为动画来赋值.

该场景演示了如何按照的面向对象的软件设计模式来设置一个平台游戏角色. 请注意, 虽然这种设置可能不会完美适配你的项目, 但它将启发你的一些游戏设计思路, 说明如何将用户输入、游戏逻辑和可视化部分分离成不同的组件.

当按下Play键时, 你可以用WASD(移动)、空格键(跳跃)和鼠标输入(瞄准和射击)控制Spineboy角色. 另外, 你也可以通过XBOX手柄来控制它.

该场景演示了一个带动画的典型平台游戏用例, 包含如跳、跑、下落、落地的动画, 并配有粒子和声音效果. 它还展示了在Unity中如何用Spine网格来投射阴影.

当按下Play键时, 你可以用WASD(移动)和空格键(跳跃)控制角色. 或者你也可以通过XBOX手柄来控制它.

该场景演示了 的使用以及如何将其集成到现有的Unity UI中. 它还展示了如何使用 BoneFollowerGraphic 组件来附加文本标签以跟随骨骼位置. 可以在 Detached

当按下Play键时, 你会看到一个基于Canvas的用户界面, Doi和Spineboy被置入一个可滚动的面板中. 两者都像 组件一样循环播放动画, 它们同时也是用户界面的一部分.

关于如何更新扩展UPM包, 请参见.

时间轴插件目前不支持 .

  • Track Index. 要设置动画的AnimationState轨道索引. 当使用多个时间轴轨道时, 不要忘记相应地设置这个值.

    重要提示: 目前需要对时间轴轨道进行排序, 基本轨道在顶部, 叠加轨道在下方, 否则在编辑器预览时将显示错误的结果.

  • PlayableDirector.UpdateMethod将被这个属性完全替代(其值将被忽略), 这样可对每个时间轴轨道进行更精细的控制.

  • Clip In. 播放此动画时初始本地开始时间的偏移量. 也可以通过拖动clip的左边缘来调整.
  • Don't End with Clip. 通常情况下, 当时间轴上的clip后面的时间轴为空时, 会在轨道上使用空动画填充. 若此参数置为"true"则继续播放clip的动画.
  1. 要在轨道上添加动画, 可以像处理普通动画clip一样, 将各自的 拖入clips视图(时间轴面板的右侧部分).

    注意: 3.8版认为Clip时长并不重要. 当时间轴上的clip后没有其他内容时也不会清除动画.

  • 错误处理: 如果动画没有找到其 AnimationReferenceAsset, 它将不产生任何行为(前一动画将继续正常播放).
  • 在Timeline开始播放之前, 正在播放的动画将不会被打断, 直到第一个clip开始播放.
  • Edit模式预览的mix可能看起来与Play模式的mix不同. 效果以Play模式下的结果为准. 请参阅中关于预览多个重叠轨道时正确排序轨道的说明.

  1. 调整新clip的开始和结束时间, 在检查器顶部为它命名, 并选择所需的FlipX和FlipY值.
  • 指定的skeleton翻转值将用于每个轨道时长内的每一帧.
  • 在timeline结束时, 轨道将把skeleton翻转恢复到它该时间轴播放开始时记录的翻转值.

    exist.. 这是已知的一个Unity问题. 请在此了解更多信息:

再打开包中包含的示例场景.

为什么我的附件图像的透明区域周边出现了暗框?

为什么我的附件图像的透明区域出现了彩纹?

我要给MeshRenderer分配材质却失败了. 尼玛的为什么?

为啥我的skeleton某些部分在alpha淡出时仍会显示?

这是个在绘制重叠的三角形还同时调整透明度时常出现的渲染问题. 详情请参见 一节.

为啥我重打包的皮肤在编辑器中能显示, 但构建的程序里显示的却是白色多边形?

详见一节, 内附的重要须知列出了这个问题的最常见的成因.

我用git URLs导入的UPM包, 为啥项目在两台机器上的表现不一致?

如果你用的git URL以#4.1结尾, 那么Unity Package Manager就会从4.1分支下载最新版. 当项目第一次安装所需的包时, 它会一次性地下载所需包的最新版. 所以一台早些时间下载了这些包的机器会比现在这台刚下了包的机器上的包版本要老. 你可以在Unity Package Manager中选择该包, 然后点击Update按钮来重新下载包, 以此来更新到最新版本. 你可以把git URL中的#4.1替换为特定的git commit哈希值(如#5e8e4c21f1c)来避免这个问题, 这样可以确保你项目中的每个人都有相同的软件包版本.

你说的这个git commit哈希值在哪儿能找到?

你可以访问 来获得commit哈希值, 选择需要的分支, 点击commit右侧的Copy按钮(会提示"复制完整的SHA")就能把哈希值复制到剪贴板了.

实例化一个skeleton就搞得fps下降或触发了内存GC分配. 怎么优化?

  1. 如果你在游戏过程中实例化skeleton prefabs, 可以考虑在关卡加载时加载skeleton, 同时使用对象池而非实时实例化和销毁prefabs. 在非关键的关卡加载时间点上加载多个(比如10个)实例来预热对象池. 启用并重定位对象, 不要即时生成新对象;

你多半交替使用了多个atlas页或Slot blend模式在进行绘制. 详见和. 当多个atlas textures的皮肤或附件组合时, 可以考虑靠将附件重打包到单个atals texture中去(代价就是要进行一次重打包操作).

  1. 尽量少用剪裁(clipping)多边形, 考虑用Unity的遮蔽(masking)功能来实现. 如果你需要使用剪裁附件, 在剪裁多边形上用尽可能少的顶点. 多边形面积对性能的影响不大, 只有顶点数才重要————举个例子, 一个矩形区域应该考虑用一个大三角形, 而非两个小三角形来覆盖.
  2. 尽量少用网格变形key.
  3. 移除不必要的key, 别啥玩意儿都key.
  4. 把Spine Editor的中显示的其他指标全给优化了.

我要回帖

更多关于 编程猫源码编辑器教程 的文章

 

随机推荐