您的位置:首页 > 移动开发 > Unity3D

Unity 场景草的摆动与优化

2013-01-31 18:09 176 查看
场景地形如果使用mesh来做,就不能使用Unity的草系统了。因此模拟了一套草的系统,且支持草与人物的互动,即当玩家走过草堆,草会做出相应的摇摆。

首先,在场景中的草是会自己左右摇摆,这些动画都放在了顶点shader中完成。在美术做草的mesh中,加了要求。草的UV坐标有一个规则,即草根部顶点的UV坐标的y为0.

这样,在shader中,就可以通过uv坐标来判断哪些顶点需要摇摆,哪些不需要(很明显,草根的顶点是不需要摇摆的)。

先把顶点变换到世界坐标系下,调用下列函数,来改变顶点的位置。玩家与草的互动信息是保存在mesh的uv1中的,这个数据时每帧更新的。

float4 GrassRock(float4 pos, float2 uv,  float2 uv1 float dir)
{

if (uv.y > 0.99)
{

float windx = 0;

float windz = 0;

if ( dir >0 )

{

windx = sin(_Time.y * _WindSpeed);

}

else

{

windz =
cos(_Time.y * _WindSpeed);

}

if (uv1.x >0)

{

float percentage = 1- uv1.x/(_totalTime);

if (dir < 0)

{

windx += sin(uv1.x * _RockSpeed) * _RockPower * percentage ;

windz += cos(uv1.x * _RockSpeed) * _RockPower * percentage ;

}

else

{

windx -= sin(uv1.x * _RockSpeed) * _RockPower * percentage ;

windz -= cos(uv1.x * _RockSpeed) * _RockPower * percentage ;

}

}

pos.x += windx;
pos.z += windz;
}
return pos;
}

如果场景中,存在大量的草,则需要对草做一些优化。做法是,场景编辑人员在场景中摆好草后。没放一棵草,都会根据草的prefab的名字来给该gameobject命名(相同的prefab的草的名字就一样)。草的gameobject是挂在场景mesh的object上面的。在进入游戏的时候,对同一个场景mesh下的grass进行合并,规则是相同名字的grass合并成一个大的mesh。这样绘制的效率很高。当然,如果场景很大,草很分散,有时候合并会造成不必要的性能开销,所以在编辑的时候,加入了批次的概念,也就是grass命名的时候,编辑人员可以指定批次,相同批次的才会合并成一个mesh。

这样效率得到很大提升!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity3d