第一个应用:如何使用网格渲染器Blend Shapes Unity制作木棒剥皮1、内含子
2、打开modeling(Blender ) blender软件
调整视角
还有快捷键: Shift A
添加消息:循环程序
将顶点数更改为:
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
添加形状密钥
进入Edit Mode,选择Alt横线,按快捷键S 0,即可完成一个关键帧。
重复n次,增加所有横线key
然后单击“File”导出FBX文件。
然后导入到Unity项目中。
3、设置场景创建空对象捕捉、Wood Holder、Wood,然后拖动模型进行吊装
然后调整模型的旋转,您还会发现添加到Blender的Shape keys在Unity中具有数据。 可以在Inspector中更改key的值,以查看scene中模型的变化。
替换为类似木头的材质:伍德
场景需要加入另一个物体。 包括刀具Knife、碰撞体和刚体(参数设置,例如限制运动方向)以及控制脚本Knife.cs
4、woodrotation(dotween )添加第一个脚本Wood.cs先旋转树
using UnityEngine; using DG.Tweening; 公共类wood : mono behaviour { [ serialize field ] privateskinnedmeshrendererskinnedmeshrenderer; [ serialize field ] privatetransformwoodtransform; [ serialize field ] private vector3rotation vector; [ serialize field ]权限; privatevoidstart ((wood transform.dolocalrotate (rotation vector,rotationDuration,RotateMode.FastBeyond360 ) ).setl lid //skinnedmeshrendererkey ' svalueisclampedbetween 0100 floatnewweight=skinnedmeshrenderer.getblendshapeweight (key index ) skinnedmeshrenderer.setblendshapeweight (key index,newWeight ); }在运行中旋转。
5、Knife Movement添加脚本Knife.cs移动刀片
using UnityEngine; public class knife : mono behaviour { [ serialize field ] privatefloatmovementspeed; [ serialize field ]权限; [SerializeField] private Woo
d 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) ; else Destroy (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 & 100 float 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中
托转到场景中可是改变值看看效果:
添加如下控制脚本 ,作为数目的出生动画 :