EzySlice切割人物

1.首先EzySlice只可以切割静态网格,所以开始需要在人物的预制体或模型上建立一个脚本“CreateStaticMesh”用于创建与当前角色状态相同的静态蒙皮。代码如下所示:

 public void CreateStaticMesh()
    {
        Mesh staticMesh = new Mesh();
        skinnedMesh.BakeMesh(staticMesh);
        GameObject newGo = new GameObject();
        newGo.tag = "Target";
        newGo.transform.position = skinnedMesh.transform.position;
        newGo.transform.rotation = skinnedMesh.transform.rotation;
        newGo.AddComponent<MeshFilter>().sharedMesh = staticMesh;
        newGo.AddComponent<MeshRenderer>().sharedMaterials = skinnedMesh.sharedMaterials;
        newGo.AddComponent<Rigidbody>().useGravity = false;
        newGo.AddComponent<BoxCollider>();
        Destroy(this.gameObject);
    }

注:此代码中,我们给予创建出来的静态蒙皮的Tag为“Target”,即为我们需要进行切割的对象,创建出后,我们需要让原本的预制体或模型销毁,否则本体并不会消失。

2.进行切割时,需要有一个切割面,切割面可以放在被切割的物体上(切割自身),或是在有Trriger会与被切割物体碰撞的切割者身上。本项目中,使用了切割自身的方法。切割面建立一个Cube,Scale调至为扁平状即可。切割面的材质设置为透明材质。
3.切割是由切割面进行的操作,所以我们在切割面上新建“Slicer”脚本进行切割。

public Material matCross;
private GameObject source;
private GameObject CutGO;
public GameObject Blood;    
private void OnAttack(object sender, GameEventArgs e)
{
    this.gameObject.transform.rotation = Quaternion.AngleAxis(Random.Range(-180,180),Vector3.forward);
    source =GameObject.FindWithTag("Person");
    if (source!= null)
    {
        source.SendMessage("CreateStaticMesh");
    }
    if (source==null)
    {
        return;
    }
    CutGO = GameObject.FindWithTag("Target");
    SlicedHull hull = CutGO.Slice(transform.position, transform.up);
    GameObject upperGO = hull.CreateUpperHull(CutGO, matCross);
    upperGO.tag = "Upper";
    upperGO.AddComponent<Rigidbody>().AddExplosionForce(1000f, upperGO.transform.position - Vector3.right, 10f);
    upperGO.AddComponent<MeshCollider>().convex = true;
    Blood.SetActive(true);
    
    GameObject lowerGO = hull.CreateLowerHull(CutGO, matCross);
    lowerGO.AddComponent<Rigidbody>().AddExplosionForce(1000f, lowerGO.transform.position + Vector3.right, 10f);
    lowerGO.AddComponent<MeshCollider>().convex = true;
    Destroy(CutGO);
}

1.如上述代码所示,首先OnAttack是本项目中使用的被攻击后的事件处理方法函数,大家使用时可自行替换为相应函数功能进行使用。函数开头的将切割面进行了随机角度的旋转,以实现被攻击时切割面多样化导致人物被切割多样化的效果,Source则是作为被切割的对象。

2.代码中,Tag为“Person”的作为Source成为被切割的对象,如果找到了,则用“SendMassage”发送去创建静态蒙皮(这里使用SendMassage的方法对于框架来说并不理想,可以用事件进行代替)。没有找到则直接return掉。

3.“CutGO”为要被切割的静态蒙皮,则为在“CreateStaticMesh”创建的Tag为“Target”的静态蒙皮。接下来“SlicedHull”为EzySlice中自带的类。用来接受使用Slice函数切割后的物体,Slice函数中包括的是切割的方向。

4.接下来创建出被切割的实体,有两个部分(上半部分和下半部分),分别使用的函数为:CreateUpperHull,CreateLowerHull。在这两个函数之中的括号内,需要填写被切割的静态蒙皮和切割后新增面的材质。材质在外面建好即可。

5.最后为切割后的物体添加其该有的组件,此项目中为爆炸时切割,所以为其增加了钢体和爆炸力。注意的是,必须要增加凸面体,即使AddComponent().convex = true这句话。最后销毁被切割的静态蒙皮。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值