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。
这样效率得到很大提升!
首先,在场景中的草是会自己左右摇摆,这些动画都放在了顶点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。
这样效率得到很大提升!
相关文章推荐
- unity 场景跳转初步优化——异步跳转
- Unity优化场景的一点记录
- Unity学习(十三)场景优化之四叉树
- Unity模型、场景整合--美工制作优化事项
- Unity中使用Occlusion Culling进行遮罩剔除来实现场景优化
- unity项目优化----游戏项目场景优化思路
- Unity场景美术资源优化
- unity中场景特效优化
- unity基础开发----切换场景、游戏视图(Game View)、iphone优化
- unity中关于游戏场景的优化——遮挡剔除
- unity基础开发----切换场景、游戏视图(Game View)、iphone优化
- Unity性能优化(1)-官方教程The Profiler window翻译
- Unity开发-你必须知道的优化建议
- 【小松教你手游开发】【unity实用技能】unity安卓游戏优化ETC压缩及Alpha通道处理
- Unity性能优化专题—腾讯牛人分享经验
- [Unity 3D] Unity 3D 性能优化 (一)
- Untiy3d-unity游戏性能优化-详细介绍
- Unity HTC修改场景切换的过渡场景
- Unity中国象棋(四)——悔棋、判断胜负的实现,以及动画特效和代码的优化
- Unity 几种优化建议