博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity 实现物体破碎效果(转)
阅读量:7176 次
发布时间:2019-06-29

本文共 7836 字,大约阅读时间需要 26 分钟。

感谢网友分享,原文地址,中文翻译地址(

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.

For this tutorial, you'll need the newest version of , 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 . (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:

splintering_02_cube_intactsplintering_03_cube_broken

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

splintering_04_barrel_intactsplintering_05_barrel_broken

You can try it out for yourself here:

 

. (, too.)

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:

splintering_01_setup

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.

splintering_06_cube_deleted

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

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:

splintering_07_fragments_01

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

splintering_07_fragments_02

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.

splintering_09_fragments_04

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.

splintering_08_fragments_03

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.

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:

splintering_16_prefab_assign

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:

splintering_02_cube_intact

...should turn into something similar to this:

splintering_10_unlucky

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:

splintering_17_sphere

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

splintering_02_cube_intactsplintering_11_better

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.

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

splintering_05_barrel_broken

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 .

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).

splintering_12_importer

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.

splintering_13_barrel_01

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).

splintering_15_barrel_03

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.

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.

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!

转载地址:http://hgfzm.baihongyu.com/

你可能感兴趣的文章
解决手机网页字段过长导致页面混乱
查看>>
extjs使用笔记-21
查看>>
Android中的布局(layout)
查看>>
第 5 章 Nova - 024 - Nova 组件如何协同工作
查看>>
python制作爬虫并将抓取结果保存到excel中
查看>>
快速手工实现软件著作权源码60页制作
查看>>
Super Pi-计算10000位圆周率需要多少时间?
查看>>
第九周项目1-复数类中的运算符重载(续)
查看>>
PHP实现url参数组合字符串与数组相互转换
查看>>
Java Web整合开发(78) -- Struts 1
查看>>
JavaEE(1) - Weblogic 服务器管理的数据源
查看>>
CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)...
查看>>
【玩转开源】BananaPi R2 —— 第二篇 Openwrt 网口配置分析
查看>>
Git 常用命令
查看>>
前端学习之jquery
查看>>
配置caffe matlab 中遇到的坑
查看>>
『Candies 差分约束系统』
查看>>
eclipse中tomcat快速启动关闭参数设置
查看>>
2017"百度之星"程序设计大赛 - 初赛(A)1006——HDU 6113
查看>>
MVC和WebApi 使用get和post 传递参数。
查看>>