感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity,中文翻译地址(Unity实现物体破碎效果

In this tutorial I will show you how to create a simple shattering effect for your Unity game. Instead of just "deleting" a crate (or any other object) when it is hit or destroyed, we can make it splinter into smaller pieces.

Requirements

For this tutorial, you'll need the newest version of Unity, and some basic experience with it. For the more advanced effect later in the tutorial, a 3D modelling tool will also be necessary. If you don't have one available or don't want to model the objects yourself, I've included them in the source downloads. (The Unity files themselves are also available there.)

In the basic version of this effect, a cube will be destroyed, leaving several fragments in its wake which will fall realistically to the ground:

Later, we'll switch the cube for a more complicated barrel model:

You can try it out for yourself here:

Click to try the demo. (The cube demo is available here, too.)

Basic Setup

Create a new Unity project and open a fresh scene. Create a plane, which will act as our ground, and a cube, which will be the destructible object. Also, place a directional light to make things more visible. Create two new materials and assign them to the floor and the cube, so that we can tell them apart, and move the camera so that everything can be seen:

Destroying the Cube

There are many ways to "destroy" the cube. For now, we'll take the simplest approach possible.

Create a new JavaScript file and name it destructionController.js. In this, we'll put all the functionality of removing the cube and creating the fragments. Add the following lines to it:

1
2
3
4
5
6
7
function Update()
 {
     if(Input.GetKey(Keycode.space))
     {
         Destroy(gameObject);
     }
 }

Now, add the script to the cube by dragging it onto it. Start the game and make a test run. If you press space, the cube should be deleted.

After being removed, it will also no longer appear in the hierarchy, as you can see in the screenshot.

Creating the Fragments

Now create eight smaller cubes; these will be the "fragments" of the current cube. Give them the same material as the cube. (Don't worry about the looks yet, we'll make them look awesome later on.) They should look like this:

Stack all 8 cubes to form a bigger, single cube, without them intersecting:

Give every cube a rigidbody, set their mass to 22, activate use gravity, and deactivateis kinematic. This will make the fragments fall down and use physics. If you want, you can tweak these values later to produce results that are better suited for your game.

Now, group the cubes under a new empty gameObject and call it remainsCube. When the original cube is destroyed, it will be replaced with this new object made out of smaller cubes.

Drag the remainsCube object into the project folder to make a prefab out of it. Once it is safely in the prefab folder, delete it out of the main scene, and it is ready to use.

Making the Remains Appear

Add the highlighted lines to the destructionController script:

1
2
3
4
5
6
7
8
9
var remains: GameObject;
function Update()
{
    if(Input.GetKey(Keycode.space))
    {
        Instantiate(remains, transform.position, transform.rotation);
        Destroy(gameObject);
    }
}

This will create a copy of the remains at the exact position of the cube. Afterwards, the cube will be removed, giving the illusion that the new one is actually the old one, but "broken".

To actually get this to work, you have to manually assign the remains to the cube. Click on it, and in the Inspector you should see a tab containing the Destruction Controllerscript. There should be a slot called Remains, which should currently be empty. Drag the remains prefab from the project folder into this slot. The Destruction Controllerscript in the Inspector should now look like this:

First Optimizations

Make a test run! If everything is set up correctly, then when you press space, the remains should replace the cube. If you're lucky, they should then tumble to the ground.

So, this basic cube:

...should turn into something similar to this:

I Wasn't Lucky

Sadly, it is not guaranteed that the fragments will tumble in a nice way. Fortunately, there are ways to solve that.

Create a new empty gameObject and give it a sphere collider, but no rigidbody. Pull the remains into the scene, so that you can edit them. Add the sphere collider object to the remains, and place it so that it intersects with some of the cubes:

Now, the fragments will immediately collide with the sphere, creating a tumble effect:

Removing the Fragments

Depending on the game you are building, we can't afford too many "splinters" at once in a scene. The straightforward solution is to delete them after a few seconds. In order to do so, create a new JavaScript file and name it selfDestruct.js. Put the following code in it:

1
2
3
4
5
function Start()
{
    yield WaitForSeconds(4.0);
    Destroy(gameObject);
}

When the object is created, it will wait for four seconds, and then delete itself. Add this code to the remains object. If you now destroy the cube and create the fragments, the remains will destroy themselves after four seconds.

And that's it! Now you have the basics to efficiently have an object "shatter" into several smaller pieces when it is destroyed. You can use this effect as-is, but let's take it a little further and see how to use it with a more complex object.

Using an Actual Object Instead of Cubes

Now that we've got the basic system in place, we can make it more pretty by replacing the cubes with actual objects.

If you are adept in a 3D modelling tool, you can create your own objects. If not, or if you do not have one available, you can get the prepared 3D file from the source download.

Copy the file into your asset folder, and the 3D models will automatically be imported for your use. Before using them, click the file in the Asset Explorer and make sure that the source files are being imported correctly at a scale factor of 1 (not 0.1 or 0.001; that only complicates things).

If you look at the objects, you can see a field called meshfilter in the Inspector. If you click it, you get a list of all available meshes in the project. Now replace all the cubes in the Cube remains with barrel parts.

The intact cube gets the barrel mesh; the smaller cube fragments need the meshesbarrel_fragment_01 to barrel_fragment_08. After those are assigned, set their local positions to (0, 0, 0). (Their pivot-points have been set so that they can be easily zeroed in that way.)

Instead of a box collider, a mesh collider would be much more convenient. Remove all the box colliders on the fragments, and replace them with mesh colliders. Check each mesh collider and make sure each has the correct mesh applied (that is,barrel_fragment_01 needs the barrel_fragment_01 mesh, and so on).

Once that is done, set all mesh colliders to convex. (A non-convex mesh collider can't collide with other non-convex mesh colliders. It's a programming thing.) Also, remove the sphere collider we added to the remains, as it might not be necessary.

It everything is set up correctly, you should have a barrel which will spring apart into eight smaller pieces.

 

Possible Further Details

The same system can also be used to add other effects to the destruction. Do you have an explosion? Add it to the remains! Add sounds, for a satisfying crack. Put a particle effect in there, creating a small puff of smoke.

Conclusion

In this tutorial I've showed you the most straightforward way of making an object shatter into smaller fragments. Now you know how to destroy an object, removing it from the game; how to swap the object with smaller fragments directly before its destruction; and how to have the fragments self-destruct afterwards.

This system can now be modified and adapted to fit many specific purposes. You could have a crate or a barrel splinter and shatter when shot. You could create an explosion after a plane is hit. Or you could have a boat crack into two pieces. Enjoy!

Unity 实现物体破碎效果(转)的更多相关文章

  1. unity 实现物体破碎效果的一些方法 - 细雨淅淅

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  2. unity 实现物体破碎效果的一些方法

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  3. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

  4. Unity CommandBuffer物体轮廓

    1.command buffer具有很高的灵活性,它的作用是预定义一些渲染指令,然后在我们想要执行的时候去执行这些指令(见图1),绿点表示可以在"Forward Rendering Path ...

  5. Unity查找物体的子物体、孙物体

    Unity查找物体下的所有物体 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  6. three.js使用卷积法实现物体描边效果

    法线延展法 网上使用法线延展法实现物体描边效果的文章比较多,这里不再描述. 但是这种方法有个缺点:当两个面的法线夹角差别较大时,两个面的描边无法完美连接.如下图所示: 卷积法 这里使用另一种方法卷积法 ...

  7. unity 图片 粉碎效果 破碎效果

    效果: 点击按钮后: 这些碎片具有物理碰撞效果,下面会有隐形的支柱垫着碎片,n秒后支柱消失,碎片落下 当然你也可以控制生成的碎片,让他们从下而上一块一块地落下 插件源码: https://github ...

  8. 通过改变unity中物体的alpha值实现若隐若现的效果

    RawImage logo = mainLogo.transform.FindChild("back/headBack/Logo").GetComponent<RawImag ...

  9. 用Unity实现时间倒退效果

    记得以前看过一个电影,叫做<独立游戏大电影>,其中有个一个游戏可以实现时间回退的功能,可以像倒带一样,十分有趣.因此我就想着用Unity也实现一个类似的简单Demo,说不定哪天会用到. 效 ...

随机推荐

  1. js调用soapWebService服务

    js调用soapWebService服务 什么是 SOAP? SOAP 指简易对象访问协议 SOAP 是一种通信协议 SOAP 用于应用程序之间的通信 SOAP 是一种用于发送消息的格式 SOAP 被 ...

  2. 基于XMPP的IOS聊天客户端程序

    简介:XMPP协议是一种基于Socket长连接.以XML格式进行基本信息交换.C/S S/S多种架构的聊天协议 XMPPServer 基于XMPP协议的服务端(例如eJabber.OpenFire) ...

  3. 在Ubuntu上安装Hadoop(单机模式)步骤

    1. 安装jdk:sudo apt-get install openjdk-6-jdk 2. 配置ssh:安装ssh:apt-get install openssh-server 为运行hadoop的 ...

  4. 干货之运用CALayer创建星级评分组件(五角星)

    本篇记录星级评分组件的创建过程以及CALayer的运用. 为了实现一个星级评分的组件,使用了CALayer,涉及到mask.CGPathRef.UIBezierPath.动画和一个计算多角星关键节点的 ...

  5. 【代码笔记】iOS-日历

    一, 效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import "CalendarView.h ...

  6. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  7. java反射机制一个例子

    import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try ...

  8. Android 学习资料收集

    收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...

  9. json数组的序列化和反序列化json数组的序列化和反序列化

    如题,我就不多说了,自己看代码的,很好理解 using System; using System.Collections.Generic; using System.Web; using System ...

  10. PMBOK学习笔记二-项目管理过程

    项目管理过程可归纳为五类,即五大项目管理过程组 启动过程组.定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程..规划过程组.明确项目范围,优化目标,为实现目标制定行动方案的一组过程 ...