
问题:
玩家在草地,雪地,木板上行走需要不同的脚步声音效,且无论行走还是奔跑,音效都要和脚步动画同步.
思路:
在动画上添加事件触发脚步声音效,并判断地面的材质然后播放不同的
音效.
实现:
一.判断地面材质
第一种情况
是在unity内置terrain上行走
地面有草地,石地,木地等,需要有不同音效,这时可以通过terrain的terrain.Data的alphamapTextures[0]得到一个图层,其rgba分别代表四张terrain贴图的权重(或不透明度)利用此可以判断某点是什么材质,再调用相应的音效即可区别玩家在不同材质行走的脚步声.
关键代码;
public Terrain terrain;
TerrainData _terrainData;
void Start()
{
_terrainData = terrain.terrainData;
Texture2D _alphamapTexture = _terrainData.alphamapTextures[0];
var x = (int)(transform.position.x * _terrainData.alphamapResolution / _terrainData.size.x);
var z = (int)(transform.position.y * _terrainData.alphamapResolution / _terrainData.size.z);
var color = _alphamapTexture.GetPixel(x, z);
//比较一下color各通道值就能知道当前在什么材质上行走了
第二种情况是在某个物体上行走(比如木板上行走
)
这时可以用向下的射线检测到物体类别并得到材质.
把第一种情况和第二种情况加在一起就能判断所有脚下的材质了.具体可用射线来判断,代码很简单略.....
二.动画事件的设置:
第一种方法(推荐!):
点击动画-->编辑-->预览速读调到最低0.1方便精确找点-->播放预览在所需处停下-->设置事件点,注意函数只能包含在玩家根下的脚本下面.注意:动画如果是legacy格式需要更改,否则不会出现事件编辑界面

c#脚本:
注意函数只能包含在玩家根下的脚本下面

第二种方法:
先复制想添加的动画(否则只能只读)windows-->animation-->animation-->添加事件,代码同上.

需要注意的是事件不要选在最后一帧,很有可能失效,再就是时间参数尽可能选择int,或者hash值.效率可能高些.