草庐IT

Unity 布料模拟插件Magica Cloth

北海6516 2023-04-22 原文

依赖包

Magica Cloth 使用 Job System 和 Burst compiler 加快布料模拟,所以需要先安装这两个依赖包

Burst 可以直接下载
在这里插入图片描述

Job System 得通过 URL 添加,输入com.unity.jobs,设置中也要开启Enable Pre-release Packages
另外为了看到模型的骨骼节点,还要下载Animation Rigging

组件

名称图标介绍
MagicaPhysicsManager管理器,使用时会自动创建
MagicaBoneCloth控制骨骼(Transform)进行布料模拟,带骨骼的衣服和头发都可以用
MagicaBoneSpring控制骨骼(Transform)进行弹簧模拟,适合胸部抖动
MagicaRenderDeformer渲染变形器,用于对模型的网格进行变形,当使用 MeshCloth / MeshSpring 时需要,性能消耗大
MagicaVirtualDeformer虚拟变形器,通过结合多个渲染变形器进行顶点缩减,并重构为一个虚拟网格。使用MeshCloth / MeshSpring时需要,性能消耗大
MagicaMeshCloth对网格顶点进行布料模拟,适用于无骨骼的模型,可以实现比Bone Cloth更加精细的控制,是控制裙装的理想选择,与虚拟变形器一起工作,性能消耗大
MagicaMeshSpring对网格顶点进行弹簧模拟
MagicaSphereCollider / MagicaCapsuleCollider / MagicaPlaneCollider球形,胶囊形,平面形碰撞器,防止穿模,球形和胶囊形主要用于人体,胶囊形消耗更大,平面形主要用于地面
MagicaDirectionalWind / MagicaAreaWind全局的风,区域的风

Magica Cloth的物理引擎完全独立于Unity的物理学引擎,因此,它完全不干扰Unity的物理系统。

MagicaPhysicsManager


MagicaPhysicsManager这个prefab是插件中自带的,运行时使用插件相关的组件后就会自动创建

Update Per Second物理引擎每秒更新次数
Update ModeUnscaled Time - 刷新率不受 Unity 的 time scale 影响
Update ModeOnce Per Frame - 每帧更新一次,当使用这种模式时,Update Per Second 需要根据游戏的帧率来调整。
Update ModeDelay Unscaled Time - 延迟执行,与 Unscaled Time 一样,但在渲染时也能进行布料模拟,能大幅提高性能,但结果会晚一帧,这个延迟是通过未来预测来插值的
Update Location在 Late Update 之前或之后更新
Faster Write使用 Unity 的新 Mesh API 更新网格顶点,提高网格更新速度,版本要大于 2021.2
OnPreUpdate / OnPostUpdate在布料模拟之前或之后注册事件

MagicaBoneCloth 模拟头发,衣服飘动

MagicaBoneCloth 和 MagicaBoneSpring 都是通过改变骨骼节点Transform的位置和旋转来实现飘动效果

把模型拖入场景,点击模型,选择Bone Render Setup显示模型的骨骼,方便选择对应骨骼

这个模型后面有长发和两边的侧发,长发和侧发的参数设置不同,这里以长发演示


右键创建一个 Magica Bone Cloth,并改名为长发

这里有错误提示是因为还没有生成数据,将长发的根节点添加到Root List,点击Start Point Selection进入节点编辑模式


红色表示固定节点(Fixed Point),它不会移动,但是会旋转,一般就是根节点,每个可移动的骨骼链上,第一个节点必须是固定节点。
绿色表示活动节点(Move Point),受物理系统影响
还有一种灰色节点表示无效节点(Invalid Point),不参与物理运算

如果需要修改节点类型,先选择节点类型,按住左键在场景中拖动即可改变节点颜色
调整完后, 点击 End Point Selection 结束编辑

下面就是物理模拟相关的参数,这里提供了一些预设,点击Preset选择长发类型的预设,会自动修改适合长发的参数
头发相关的预设:前发(FrontHair),长发(LongHair),脸两侧头发(SideHair),马尾(PonyHair),短发(ShortHair)
衣服相关的预设:柔软的裙子(SoftSkirt),硬裙(HardSkirt),长开衩连衣裙(LongSlitDress)
尾巴或身上飘动的装饰物:Tail
最后点击Create生成数据

上面的错误提示消失,显示了一些参数。现在运行时拖动角色,长发会有抖动的物理效果,但是会有穿模的情况,所以还需要处理下穿模的问题。

Magica Cloth提供了两种穿模的解决方法,表面穿模(Surface Penetration)和碰撞体穿模(Collider Penetration)。

如果衣服(头发)与身体上的骨骼有关联的话,衣服会随着身体动作跟着运动,如图腿动的时候,裙子也会跟着动,这种情况可以选择表面穿模,表现力更好。

如果衣服(头发)与身体上的骨骼没有关联,衣服(头发)完全由自己的骨骼控制,如图腿动的时候,裙子不会动,这种情况使用碰撞体穿模。
模型属于第二种情况,所以选择碰撞体穿模

正常情况下,应该在头部,躯干,四肢都加上球形(MagicaSphereCollider)或胶囊形碰撞体(MagicaCapsuleCollider),这里为了省事儿只在躯干上添加胶囊形碰撞体

为了长发和碰撞体进行碰撞检测,还需要把这个碰撞体添加到长发的ColliderList中,再次点击Create生成数据,运行查看效果

下面处理下裙子

模型前面的裙摆和后面的裙摆被处理成了几个独立的片,这里只处理下后摆,新建一个MagicaBoneCloth改名为后摆

将后摆的几个根节点添加到Root List,并修改连接模式(Connection Mode)为Mesh Sequential No Loop,表示这几个骨骼链形成一个不闭合的网格面,连接模式指定Root List中骨骼链的连接方式。

Connection ModeLine - 表示单条骨骼链从父级到子级是线性结构的,两条骨骼链是独立的
Connection ModeMesh Automatic - 自动连接附近的骨骼节点创建一个网格结构并进行连接,它不受Transform的父-子关系的影响,不适合太复杂的结构
Connection ModeMesh Sequential Loop - 按照在RootList中的顺序生成网格,并连接第一条和最后一条骨骼链
Connection ModeMesh Sequential No Loop - 按照在RootList中的顺序生成网格,但不连接第一条和最后一条骨骼链
Same Surface Angle只在连接模式为网格时有,表示生成网格法线的角度(0-90)


连接模式选择Line,那么裙子上的每条骨骼链就分别单独进行碰撞检测,这样物体可能从两条骨骼链之间的缝隙穿过产生穿模


首尾相连的裙子选择Mesh Sequential Loop,生成闭合的网格面,这样碰撞检测更加精确


有的裙子不是闭合的就选择Mesh Sequential No Loop


在腿上创建碰撞体添加到Collider List,预设选择NormalSkirt,点击Create生成数据,运行查看效果

MagicaBoneSpring 模拟胸部抖动


与 MagicaBoneCloth 基本类似,Create Other -> Magica Cloth -> MagicaBoneSpring,右键先创建一个 MagicaBoneSpring 并改名为胸部

找到模型身上的胸部节点添加到 Root List

预设选择Breast,点击Create生成数据,运行时查看效果

MagicaMeshCloth 模拟裙子飘动


参考官方示例,使用Unity Chan模拟

首先,必须开启模型上的Read/Write选项,这是为了读取并修改模型身上的顶点,MagicaCloth不支持具有4个或更多顶点的多边形,所以Keep Quads必须关闭


在裙子,上衣,拉链这三个Mesh Renderer上都添加 MagicaRenderDeformer(渲染变形器),它能对网格进行变形,添加后会自动创建数据,如果上一步Read/Write选项没有开启,这里会报错

Create Other -> Magica Cloth -> MagicaVirtualDeformer,然后创建一个MagicaVirtualDeformer(虚拟变形器),把之前三个 MagicaRenderDeformer(渲染变形器)添加到Render Deformer List中,点击Create生成数据,如果这里报错,点击渲染变形器上的Create重新生成数据。MagicaVirtualDeformer的作用是将一个或多个MagicaRenderDeformer转换为一个虚拟网格,减少顶点,将高多边形网格转换为低多边形网格。这个虚拟网格只用于布料模拟,所以实际模型网格不会被减少。从Cloth Monitor中可以看到虚拟网格的顶点数和三角面数

Reduction Setting 调整下面的参数可以减少顶点数量,简化网格,修改后重新点击Create

参数描述
Merge Vertex Distance在这个距离内合并顶点,忽略网格的连接性
Merge Triangle Distance在这个距离内合并三角面,考虑网格的连接性
Same Surface Angle如果两个连接的多边形小于此角度,则认为它们是相连的
Use Skinning勾选会对所有顶点的骨骼权重进行重新赋值,取消勾选减少物理计算的负担


点击Open Cloth Monitor可以看到这个虚拟网格

Create Other -> Magica Cloth -> MagicaMeshCloth,然后创建一个MagicaMeshCloth并改名为衣服

这几个组件之间的关系


接下来的操作和MagicaBoneCloth差不多。添加虚拟变形器的引用,点击Start Point Selection修改顶点类型

这一步比较麻烦,它没有自动帮我们设置类型,需要手动设置,把裙子部分设置活动节点(Move Point),活动节点需要连接固定节点(Fixed Point)

在腿部添加两个胶囊形碰撞器并添加到Collider List中

预设选择Skirt,点击Create生成数据,运行时查看效果

MagicaMeshSpring 模拟胸部抖动


前面和MagicaMeshCloth差不多,先给胸部附近的Mesh Renderer添加MagicaRenderDeformer(渲染变形器)

Create Other -> Magica Cloth -> MagicaVirtualDeformer,创建一个MagicaVirtualDeformer,添加胸部附近的MagicaRenderDeformer,点击Create生成数据,可以调整参数适当简化网格

Create Other -> Magica Cloth -> MagicaMeshSpring,新建一个 MagicaMeshSpring 并改名为左胸

添加MagicaVirtualDeformer的引用,Center Transform 就是 MeshSpring 摆动的中心,选择左胸节点,如何没有合适的节点可以创建一个Transform节点,调整位置到中心,黄色箭头是摆动的前方向,差不多是z轴正向,所以Direction Axis选择Z

预设选择Breast,点击Create生成数据,右胸的处理一样

运行时发现摆幅比较大,还需要调整下Spring参数,参考下面参数说明

MagicaDirectionalWind / MagicaAreaWind


MagicaDirectionalWind 是控制全局的风

参数描述
Main风量
Turbulence风的湍流率,在0.0时,风总是从某一方向流动,在1.0时,风向会随机变化
Frequency风向变化的速度,你可以改变湍流变化的速度
Direction Angle X/Y绕X/Y轴旋转的角度


需要配合Unity的WindZone组件使用,修改MagicaDirectionalWind风量Main会同步修改Wind Zone的风量Main,可以将两者做成一个预制体在场景中使用

衣服,头发受到的风力通过External Force参数设置,参考下面的参数说明


MagicaAreaWind控制局部区域的风,可以设置方形或球形区域,用它可以实现爆炸时猛烈的气流效果

参数描述
Main风量
Turbulence风的湍流率,在0.0时,风总是从某一方向流动,在1.0时,风向会随机变化
Frequency风向变化的速度,你可以改变湍流变化的速度
Shape Type方形或球形
Direction Type球形时有效,One Direction - 风吹向某一个方向,Radial - 风从中心径向吹来
Attenuation球形径向风时有效,风从中心到四周的衰减率
Is Addition当处于多个风场叠加的区域时,勾选表示叠加这几个风的影响,不勾选会选择区域最小的风场


这是官方示例中演示的爆炸气流效果,在红球上添加了MagicaAreaWind,设置为球形径向风,调整风量到最大并勾选Is Addition,这样红球出现时就会伴随强烈的气流,这时再配合爆炸的特效就有不错的表现效果

参数说明

下面补充下其他其他参数的说明

Update Mode

指定模拟的更新时间

选项描述
Normal根据帧率更新
Unity Physics基于 Unity 的物理更新,如果角色在 FixedUpdate 内移动,可以通过选择此项来抑制抖动

Culling


Culling是剔除相关的设置,当角色移出屏幕后如何影响物理系统的更新
首先需要将模型上的网格组件(Mesh Renderer或Skinned Mesh Renderer)添加到Cull Renderer List中,点击Auto Select即可自动添加,然后设置剔除模式

Culling Mode描述
OFF不剔除,始终进行模拟
Reset离开屏幕,停止模拟,再次出现时,会重置模拟
Pause离开屏幕,停止模拟,再次出现时,从停止的状态继续模拟

Animator和Animation上也有类似的剔除设置

Culling Mode描述
Always Animate不剔除,始终运行动画
Cull Update Transforms离开屏幕,内部动画仍在运行,但不会更新Transform组件
Cull Completely离开屏幕,停止模拟,再次出现时,从停止的状态继续模拟

Culling Type描述
Always Animate不剔除,始终运行动画
Based On Renderers与Animator的Cull Update Transforms一样,离开屏幕,内部动画仍在运行,但不会更新Transform组件

建议动画的剔除和 MagicaBoneCloth 的剔除模式相匹配,确保物理模拟与动画更好地同步
下面是推荐的匹配模式

Animator Culling ModeMagicaCloth Culling mode描述
Always AnimateOFF不剔除,始终进行模拟和动画
Cull Update TransformsReset离开屏幕,停止模拟和动画,再次出现时,会重置模拟和动画
Cull CompletelyPause离开屏幕,停止模拟和动画,再次出现时,从停止的状态继续运行
Animation Culling TypeMagicaCloth Culling mode描述
Always AnimateOFF不剔除,始终进行模拟和动画
Based On RenderersReset离开屏幕,停止模拟和动画,再次出现时,会重置模拟和动画

Algorithm


Algorithm中老的算法已经不再维护,新的算法解决了老算法的一些问题,一般就默认Algorithm 2算法

Radius


每个由物理引擎控制的点都被称为粒子(particle),Radius就是控制这些粒子的大小,从骨骼链的根节点到末端节点的大小变化

点击Open Cloth Monitor,勾选Particle Position和Particle Radius,就可以看到长发上的粒子,根节点是黄色,子节点是白色,粒子的大小会影响碰撞检测的判断

Mass


Mass 就是控制粒子的重量,较重的粒子更难移动,基本上,如果开始点比较重,结束点比较轻,MagicaBoneCloth 的模拟会更稳定

Gravity


Gravity 设置重力加速度的大小和方向,设置重力让衣服下垂,不容易飘起了会显得更自然一点

External Force


External Force 设置外力(如风)的影响

名称描述
Depth Influence根据粒子在骨骼链上的深度指定受到外力的比率。1.0表示100%受外力影响,0.0表示完全不受外力影响
Wind Influence风的影响率,1.0是100%受影响,0.0完全不受风的影响
Wind Synchronization风的同步率,增加同步率,每个粒子将以同样的方式移动。降低同步率会使每个粒子更容易受到干扰
Wind Random Scale风的随机率,增加随机性,也会增加运动的不规则性

Drag


Drag 设定粒子的空气阻力,阻力越大,粒子的惯性衰减越快

Max Velocity 粒子最大速度(m/s)

World Influence


World Influence 设置身体运动时,粒子受影响程度

名称描述
Influence Target检测运动的主体,如果不设置,就会选择该组件所附加的Transform
Max Move Speed粒子最大移动速度
Movement Influence身体运动对粒子的影响程度
Rotation Influence身体旋转对粒子的影响程度
Reset After Teleport在一帧内大幅度移动或旋转称为Teleport,该选项设置是否在检测到Teleport时重置粒子的位置
Teleport ModeReset - Teleport后重置一次模拟。Keep - Teleport后保持模拟状态
Teleport Distance一帧内移动多远距离算一个Teleport
Teleport Rotation一帧内旋转多大角度算一个Teleport
Stabilization Time After Reset重置时执行稳定化处理的时间(秒)

Distance Disable


Distance Disable 根据身体与指定对象(通常是摄像机)之间的距离,禁用/启用模拟

名称描述
Reference Object指定要测量距离的目标,如果没有指定,将选择主摄像机
Distance指定关闭模拟的距离
Fade Distance淡化距离,如果Distance是20,FadeDistance是5,则在15到20的距离之间进行淡入淡出效果

Clamp Distance


Clamp Distance 设置粒子离根节点的距离范围,作为参考距离,设置从根节点到粒子的直线距离为1.0,并将距离增加或减少的程度设置为百分比。举例来说,当Min Distance Ratio为0.7,Max Distance Ratio为1.1时,移动限制范围如下

末端粒子只能在图中两条红线之间的范围内移动
Velocity Influence 速度效应,将此设置为低值可以减少粒子因突然运动而移动的问题。然而,粒子的惯性也会丢失。

Clamp Position


Clamp Position 限制粒子从原点移动的距离,原点是粒子的原始位置

名称描述
Clamp Position Ratio X/Y/Z可以相对于原点X/Y/Z轴移动的百分比(1.0=100%)
Velocity Influence同上

Clamp Rotation


Clamp Rotation 限制相对于父节点的旋转角度,上图直线表示根节点(固定粒子)不能弯曲,尖端可以弯曲25度

Restore Distance


Restore Distance 恢复距离,缩放连接的粒子之间的距离,使它们保持在原来的距离,其作用是保持原始形状。
有以下三种粒子连接方式:

类型描述
Struct根据原始结构连接粒子,在Bone Cloth中,是由Transform的父子结构构建的,在Mesh Cloth中,是由Mesh多边形的连接信息构建的。必选的
Bend从原始结构中连接更多的结构型粒子,可以使形状不容易坍塌。可选的
Near忽略原始结构,仅连接那些靠近的粒子,这种连接可以保持形状的强度,但也使其不容易变形。可选的
参数名称描述
Struct StiffnessStruct 连接强度,该值越高,恢复速度越快
Bend Point是否使用Bend连接
Bend Max Connection一个粒子的最大连接数,连接数越多,形状稳定性越强,但负荷也更大
Bend StiffnessBend 连接强度,该值越高,恢复速度越快
Near Point是否开启Near连接
Near Max Connection一个粒子的最大连接数
Near Max Depth进行Near连接的粒子最大深度,骨骼链上起点深度为0,终点深度为1
Near Point Length要链接的粒子之间的距离
Near StiffnessNear连接强度,该值越高,恢复速度越快
Velocity Influence同上

Restore Rotation


Restore Rotation 恢复旋转,当粒子产生旋转后恢复到相对于父节点的角度

参数名称描述
Restore Power恢复的强度
Velocity Influence同上

Triangle Bend


Triangle Bend 三角形弯曲,当Connection Mode设置为Mesh相关的选项,或者使用Mesh Cloth时会显示该参数
两个连接三角形受外力变形后,两个三角形的角度恢复到其原始角度

参数名称描述
Bend Power恢复的强度,基本上设置为1.0就行,但具三角形数量比较少的时候,尝试降低该值
Twist Correction会创建特殊的约束数据以防止扭曲问题,它会增加消耗,因此不建议使用它,除非有扭曲的问题
Twist Recovery Power恢复扭曲的强度,如果值太高,形状可能会变得很硬

Collider Collision


Collider Collision 碰撞检测

参数名称描述
Dynamic Friction动态摩擦系数,与碰撞机接触的粒子很难移动,增加该值将增加摩擦力并减慢运动速度
Static Friction静态摩擦系数,与碰撞器接触的粒子静止的强度,增加该值将导致粒子在碰撞器上立即停止

Penetration


Penetration 穿模

参数名称描述
Penetration Mode碰撞体穿模/表面穿模
Max Connection Depth最大连接深度
Penetration Axis粒子可以穿透哪个轴
Connection Distance搜索粒子所连接的碰撞器时,最大搜索距离
Penetration Distance粒子可以穿透的距离
Moving Radius粒子可以移动的最大半径,粒子只能在这个半径的球体内移动
Penetration Ignore Collider List要忽略的碰撞器列表

Rotation Interpolation


Rotation Interpolation 旋转插值

参数名称描述
Fixed Non-Rotation固定不旋转,当打开时,固定粒子(根节点)将完全不旋转
Line Avarage Rotation根据连接线的平均角度调整粒子的旋转,将此功能打开会产生更平滑的结果

Spring


MagicaMeshSpring上调整弹簧的参数,指定弹簧运动的一个球形范围

参数名称描述
Spring Radius球形区域的半径
Spring Radius Scale X/Y/Z三个轴影响的比例
Spring Power弹簧力
Spring Direction Atten弹簧力阻尼率取决于与球体前端的角度,左边是前面的方向,右边是后面的方向
Spring Distance Atten弹簧力的衰减率取决于与球中心的距离,左边是球的中心,右边是球的外缘
Spring Atten Intensity阻尼率的整体调整

Adjust Rotation


可以根据弹簧移动的距离为根节点添加旋转

参数名称描述
Adjust Mode指定检测运动的轴,通常是Direction Axis之外的两个轴
Adjust Rotation Power旋转强度

性能优化建议

  1. Update Mode选择Delay Unscaled Time,实际的物理模拟会比画面慢一帧,为了解决这个问题,它通过上一帧和当前帧的物理模拟结果进行插值
  2. 尽量选择BoneCloth和BoneSpring进行模拟,如果裙子使用BoneCloth效果达不到预期就改成MeshCloth,但注意要简化网格
  3. Virtual Deformer组件上需要关注的是Use Skinning选项,如果勾选了Use Skinning,则需要对所有顶点的骨骼权重进行重新赋值,取消Use Skinning可以极大地减少物理计算的负担。它的限制在于当取消了Use Skinning选项后,网格只会受到影响程度最大的Virtual Deformer的影响,可能在一定程度上会影响最终的表现,但是如果对于一个网格的Render Deformer只在一个Virtual Deformer中使用的情况下则可以放心地取消该选项的勾选

参考

up主IGBeginner0116

官方文档

【博物纳新】Magica Cloth

有关Unity 布料模拟插件Magica Cloth的更多相关文章

  1. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  7. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  8. ruby-on-rails - 您希望看到哪些 Rails 插件? - 2

    您认为可以作为插件很好地存在于您的Rails应用程序中必须实现的哪些行为?您过去曾搜索过哪些插件功能但找不到?哪些现有的Rails插件可以改进或扩展,如何改进或扩展? 最佳答案 我希望在管理界面中看到一个引擎插件,它提供了应用程序中所有模型的仪表板摘要,以及可配置的事件图表。 关于ruby-on-rails-您希望看到哪些Rails插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questio

  9. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  10. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

随机推荐