您的位置:首页 > 其它

插件(二)ShatterToolkit初探

2016-04-18 10:11 323 查看
ShatterToolkit是针对unity3d编写的一款粉碎模型的插件,应该在当时切西瓜游戏很火的时候就已经出现了,不过因为能力不够没想着去接触,现在刚好有空就去下载下来看看。

免费的下载地址仅供学习http://download.csdn.net/detail/l364244206/8411949

直奔主题将插件导入到unity中,打开切西瓜的场景UvMapping,用鼠标划几下完好的西瓜被切成一块块的了





再来分析插件的功能,我们可以将代码划分为三层:

1.操作层

菜单MouseForce:

通过这个脚本可以对模型进行拖拽,根据当前鼠标左键按下的位置和鼠标移动后的位置在单位增量时间内的差值计算力度,并将这个力通过AddForceAtPosition附加给带有刚体属性的对象。

菜单MouseSplit:

这个脚本用于对模型的切割,按下当前鼠标左键拖动鼠标然后抬起,记录开始位置和结束位置,一帧内在屏幕空间从开始点到结束点默认相等划分为10个点(数值越大敏感度越高性能越差),并向世界坐标发射10条射线,根据【射线方向】和【划线方向】叉乘得到【法线】,通过【法线】和【当前射线点】就能确定一个【平面】,最后将这个【平面信息】传给【ShatterTool类】进行切割处理。

菜单MouseShatter:

这个脚本用于击毁模型,直接点击模型就可以将模型粉碎,上层只是通过屏幕向世界发射一条射线并传给【ShatterTool类】进行粉碎模型。

2.中间层

脚本ShatterTool:

其中两个函数对外:

Split(Plane[]planes)函数将获取的【面板信息】变换到【对象空间】然后通过Hull类进行切割,最后生成两个新切割后的对象。

Shatter(Vector3point)函数通过获取的【击打点】并随机生成【法线方向】创建不同的【面板信息】,然后再调用Split生成多个切割碎片,达到粉碎模型的效果。

脚本UvMapper:

它的基类有WorldUvMapper和TargetUvMapper都是设置切割面的纹理信息,WorldUvMapper设置切割面的uv缩放,TargetUvMapper比较灵活,可以设置uv起点和大小等。

3.底层

脚本Hull等:

之所以称Hull为底层,是因为它通过【面板panel信息】将模型进行拆分然后重组顶点,里面封装了一系列比较复杂的算法。

贴上一段中间连接层代码:

public void Split(Plane[] planes)

{

if
(sendPreSplitMessage)

{

// 切割之前的操作

SendMessage(
"PreSplit"
,planes,SendMessageOptions.DontRequireReceiver);

}


if
(planes !=
null
&& planes.Length > 0 && hull !=
null
&& !hull.IsEmpty)

{

if
(uvMapper !=
null
)

{

Plane[] localPlanes;

// 创建本地面板信息

CreateLocalPlanes(planes,out localPlanes);


IList newHulls;

// 通过本地面板创建新的分割对象

CreateNewHulls(localPlanes,out newHulls);


GameObject[] newGameObjects;

// 通过分割对象创建新的游戏对象

CreateNewGameObjects(newHulls,out newGameObjects);


if
(sendPostSplitMessage)

{

// 切割之后的操作

SendMessage(
"PostSplit"
,newGameObjects,SendMessageOptions.DontRequireReceiver);

}

// 销毁当前对象

Destroy(gameObject);

}

else

{

Debug.LogWarning(name +
" has no UvMapper attached! Please attach a UvMapper to use the ShatterTool."
,
this
);

}

}

}


如需商业用途或想了解更多

请支持原作者:http://gustavolsson.squarespace.com/shatter-toolkit/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: