Unity中Skinned Mesh Renderer Blend Shapes小试
第一个应用:如何使用网格渲染器Blend Shapes Unity制作木棍剥皮
1、 Intro
2、Modeling (Blender)
打开Blender 软件
调整视角
然后快捷键: Shift+A
添加Mesh : Cylinder
顶点数改为:
Rotate Around X Axis : 快捷键 R+X+90
Scale :Y Axis : 快捷键 S+Y
进入Edit Mode : 快捷键 Tab
Add more Loops : 快捷键 Ctrl + R 然后改变鼠标的滚轮: 就会看到横向线的变化。
下图中横向线都是新增的 。
->
Right click to undo movements
Exit Edit Mode : 快捷键 Tab
增加Shape Keys
进入Edit Mode然后 ,Alt + 横线选中, 然后快捷键 S + 0 , 一个关键帧就完成了。
重复n次把所有横线都增加key
然后点击File 导出 FBX 文件 。
然后导入Unity工程中。
3、 Setup scene
创建空对象挂点, Wood Holder, Wood , 然后拖拽模型挂上
然后调整模型的旋转,也可以看到在Blender中添加的 Shape keys 在Unity中有数据, 可以在Inspector中改变key的值查看scene中模型的变化。
替换成更像木头的材质: wood
场景中需要放另外的物体: 刻刀 Knife , 有碰撞体跟刚体(限制运动方向等参数设置),与控制脚本Knife.cs
4、Wood Rotation (DoTween)
添加第一个脚本 Wood.cs 让木头先旋转
using UnityEngine ; using DG.Tweening ;public class Wood : MonoBehaviour {[SerializeField] private SkinnedMeshRenderer skinnedMeshRenderer ;[SerializeField] private Transform woodTransform ;[SerializeField] private Vector3 rotationVector ;[SerializeField] private float rotationDuration ;private void Start () {woodTransform.DOLocalRotate (rotationVector, rotationDuration, RotateMode.FastBeyond360).SetLoops (-1, LoopType.Restart).SetEase (Ease.Linear) ;}public void Hit (int keyIndex, float damage) {float colliderHeight = 2.39705f ;//Skinned mesh renderer key's value is clamped between 0 & 100float newWeight = skinnedMeshRenderer.GetBlendShapeWeight (keyIndex) + damage * (100f / colliderHeight) ;skinnedMeshRenderer.SetBlendShapeWeight (keyIndex, newWeight) ;} }
运行时就会旋转了。
5、 Knife Movement
添加脚本 Knife.cs 移动刀片
using UnityEngine ;public class Knife : MonoBehaviour {[SerializeField] private float movementSpeed ;[SerializeField] private float hitDamage ;[SerializeField] private Wood wood ;[SerializeField] private ParticleSystem woodFx ;private ParticleSystem.EmissionModule woodFxEmission ;private Rigidbody knifeRb ;private Vector3 movementVector ;private bool isMoving = false ;private void Start () {knifeRb = GetComponent<Rigidbody> () ;woodFxEmission = woodFx.emission ;}private void Update () {isMoving = Input.GetMouseButton (0) ;if (isMoving)movementVector = new Vector3 (Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse Y"), 0f) * movementSpeed * Time.deltaTime ;}private void FixedUpdate () {if (isMoving)knifeRb.position += movementVector ;}private void OnCollisionExit (Collision collision) {woodFxEmission.enabled = false ;}private void OnCollisionStay (Collision collision) {Coll coll = collision.collider.GetComponent <Coll> () ;if (coll != null) {// hit Collider:woodFxEmission.enabled = true ;woodFx.transform.position = collision.contacts [ 0 ].point ;coll.HitCollider (hitDamage) ;wood.Hit (coll.index, hitDamage) ;}} }
6、Colliders
添加碰撞体:
先调整参数,这样可以确定每个key的位置
为每个碰撞体添加脚本 Coll.cs
using UnityEngine ;public class Coll : MonoBehaviour {public int index ;BoxCollider boxCollider ;private void Awake () {boxCollider = GetComponent<BoxCollider> () ;index = transform.GetSiblingIndex () ;}public void HitCollider (float damage) {// Resize the collider's height(Y) depends on "damage" if (boxCollider.size.y - damage > 0.0f)boxCollider.size = new Vector3 (boxCollider.size.x, boxCollider.size.y - damage, boxCollider.size.z) ;elseDestroy (this) ; // Remove Coll Component from this gameobject} }
7、Wood Deformation (Skinned Mesh Renderer)
Wood.cs 中 更改指定key的权重来达到木头的削皮
public void Hit (int keyIndex, float damage) {float colliderHeight = 2.39705f ; // 编辑器时碰撞体的size的y值//Skinned mesh renderer key's value is clamped between 0 & 100float newWeight = skinnedMeshRenderer.GetBlendShapeWeight (keyIndex) + damage * (100f / colliderHeight) ;skinnedMeshRenderer.SetBlendShapeWeight (keyIndex, newWeight) ;}
Knife.cs 中 削刀跟key碰撞体 碰撞就改变指定的key的权重
private void OnCollisionExit (Collision collision) {woodFxEmission.enabled = false ;}private void OnCollisionStay (Collision collision) {Coll coll = collision.collider.GetComponent <Coll> () ;if (coll != null) {// hit Collider:woodFxEmission.enabled = true ;woodFx.transform.position = collision.contacts [ 0 ].point ;coll.HitCollider (hitDamage) ;wood.Hit (coll.index, hitDamage) ;}}
8、Wood Fx (Particle System)
这个就没什么可说的,特效一直都在,只是在碰撞的时候开启particle system,同时改变特效的位置。脱离碰撞就关闭。
第二个应用:树的出现动画
添加一个cube:
然后添加水平跟垂直的边缘循环。
然后增加 Shape Keys : Base , key 1 把Cube 调整成树的形状。
编辑完 可以通过改变 Value 条来看效果,也有Misc参数可以调整。
就是从cube key成这样:
然后退出编辑模式, 为Cube 添加简单的纹理
然后将文件从Blender中导出 .fbx文件, 导入到Unity中
托转到场景中可是改变值看看效果:
添加如下控制脚本 ,作为数目的出生动画 :
Unity中Skinned Mesh Renderer Blend Shapes小试相关推荐
- Unity使用Skinned Mesh Renederer的BlendShapes时,报错“Platform does not support compute shaders”
Unity使用Skinned Mesh Renederer的BlendShapes时,报错"Platform does not support compute shaders" 报 ...
- Unity中 利用Line Renderer || Trail Renderer制作飘烟拖尾
在Unity中粒子特效就可以制作飘烟拖尾,但是如果运动过快难免会有不自然的断开.虽然粒子中加入了Trail,但是我让拖尾转角圆滑比较困难(这方面还得请教特效同学).当然如果对转角没有要求,粒子还是最简 ...
- 关于Unity中的Mesh Collider碰撞器
原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...
- Unity中Combined Mesh (root: scene)的解决方法
解决方法:去掉Static标记.
- Unity中Mesh和subMesh的区别
Unity中的Mesh很好理解,就是一个网格的数据结构,里面记录了顶点.顶点索引等信息: Mesh mesh = new Mesh(); mesh.vertices = ... mesh.triang ...
- Unity 在代码中利用Mesh实时生成圆环/空心圆柱
本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码.如若有任何疑问,可向后继续观看详细解说~~~ (PSPSPS:Mesh生成的顺序,方式等有很多,当前代 ...
- unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用
制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...
- 详解Unity中的粒子系统Particle System (三)
前言 上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission.Shape.Renderer模块又在粒子系统中扮演着怎么样的 ...
- 关于Unity中的资源管理,你可能遇到这些问题(UWA报告)
关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...
最新文章
- 关于本分类(codeforces-好题系列)
- 计算机组成原理_在线作业1,20秋《计算机组成原理》在线作业1
- nodejs+vue.js+webpack
- 科普向--详解JavaScript中的数据类型
- python给用户打标签_用Python实现RFM模型——互联网产品用户分层必备技巧
- bug6-_SymbolicException: Inputs to eager execution function cannot be Keras symbolic
- 如何使用 iCloud 钥匙串从 macOS Monterey 导入和导出密码?
- jQuery插件——自定义jQuery插件
- cocos2dx中的层CCLayer
- 计算机打开不显示桌面,电脑启动后不显示桌面怎么办
- 【JAVA SE基础篇】27.面向对象三大特征之封装
- 一文读懂ICS工业控制系统架构
- 使用BaseMap绘制地图它不香么
- OpenCV基础学习
- 台式机利用独立显卡连接两个显示器
- WIN7远程桌面连接方法!远程控制教程!XP远程桌面连接教程!如何设置远程桌面连接?远程桌面连接设置!
- c/c++使用数据库sqlite3
- Virtual box安装回退的一系列可能的原因及解决办法
- ORACLE中CLOB介绍及使用
- 刨根问底,5问分析法