第一个应用:如何使用网格渲染器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小试相关推荐

  1. Unity使用Skinned Mesh Renederer的BlendShapes时,报错“Platform does not support compute shaders”

    Unity使用Skinned Mesh Renederer的BlendShapes时,报错"Platform does not support compute shaders" 报 ...

  2. Unity中 利用Line Renderer || Trail Renderer制作飘烟拖尾

    在Unity中粒子特效就可以制作飘烟拖尾,但是如果运动过快难免会有不自然的断开.虽然粒子中加入了Trail,但是我让拖尾转角圆滑比较困难(这方面还得请教特效同学).当然如果对转角没有要求,粒子还是最简 ...

  3. 关于Unity中的Mesh Collider碰撞器

    原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件,一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件,主角可以放在平面上. 在导入场景后 ...

  4. Unity中Combined Mesh (root: scene)的解决方法

    解决方法:去掉Static标记.

  5. Unity中Mesh和subMesh的区别

    Unity中的Mesh很好理解,就是一个网格的数据结构,里面记录了顶点.顶点索引等信息: Mesh mesh = new Mesh(); mesh.vertices = ... mesh.triang ...

  6. Unity 在代码中利用Mesh实时生成圆环/空心圆柱

    本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码.如若有任何疑问,可向后继续观看详细解说~~~ (PSPSPS:Mesh生成的顺序,方式等有很多,当前代 ...

  7. unity怎么显示骨骼_骨骼动画的原理及在Unity中的使用

    制作骨骼动画 我们看看这几步操作后,我们得到了那些数据: 1.每个皮肤顶点的初始世界坐标. 2.每个骨骼关节顶点的初始世界坐标. 3.每个顶点被骨骼顶点的影响信息. 4.骨骼如何移动. 骨骼动画原理 ...

  8. 详解Unity中的粒子系统Particle System (三)

    前言 上一篇我们详细讲解了有关主模块的全部内容,已经对粒子系统的基本运作有了足够的了解,本篇就来讲一下被粒子系统默认启用的Emission.Shape.Renderer模块又在粒子系统中扮演着怎么样的 ...

  9. 关于Unity中的资源管理,你可能遇到这些问题(UWA报告)

    关键字 AssetBundle 资源制作 纹理\网格\材质\Shader\音频\动画 Lightmap 一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的? ...

最新文章

  1. 关于本分类(codeforces-好题系列)
  2. 计算机组成原理_在线作业1,20秋《计算机组成原理》在线作业1
  3. nodejs+vue.js+webpack
  4. 科普向--详解JavaScript中的数据类型
  5. python给用户打标签_用Python实现RFM模型——互联网产品用户分层必备技巧
  6. bug6-_SymbolicException: Inputs to eager execution function cannot be Keras symbolic
  7. 如何使用 iCloud 钥匙串从 macOS Monterey 导入和导出密码?
  8. jQuery插件——自定义jQuery插件
  9. cocos2dx中的层CCLayer
  10. 计算机打开不显示桌面,电脑启动后不显示桌面怎么办
  11. 【JAVA SE基础篇】27.面向对象三大特征之封装
  12. 一文读懂ICS工业控制系统架构
  13. 使用BaseMap绘制地图它不香么
  14. OpenCV基础学习
  15. 台式机利用独立显卡连接两个显示器
  16. WIN7远程桌面连接方法!远程控制教程!XP远程桌面连接教程!如何设置远程桌面连接?远程桌面连接设置!
  17. c/c++使用数据库sqlite3
  18. Virtual box安装回退的一系列可能的原因及解决办法
  19. ORACLE中CLOB介绍及使用
  20. 刨根问底,5问分析法

热门文章

  1. 根据某天或某月是否是节假休息日
  2. Android仿探探卡片式滑动效果实现
  3. SpringBoot集成Spring Data JPA多数据源(二)
  4. linux内核源代码情景分析(第一章 预备知识)
  5. crmeb商城部署(踩坑及解决方法)
  6. 12款vue后台管理系统(可下载)
  7. 邀约 T-MAX“科创太仓”国际创新创业大赛启动
  8. 开服装店的的软文怎么写才吸引人
  9. Hbase系列-2、Hbase基础
  10. Maven项目中pom.xml文件被Ignored(忽略)的解决办法问题