失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > unity角色脚步音效根据地面材质不同而改变问题

unity角色脚步音效根据地面材质不同而改变问题

时间:2021-08-01 00:01:58

相关推荐

unity角色脚步音效根据地面材质不同而改变问题

解决问题:

3D角色动画需要很精确的在某个动作点时播放特定音效

3D角色在自定义的地形模型上行走时,根据地面材质的不同(如草地,石头,泥土等等),脚所发出的

音效也会随着替换

问题一思路:

1.对于第一个问题,利用动画事件,在关键动作处触发该事件去实现音效的播放

2.在脚本中去调用走和跑不同的Function函数(走:step 跑:steprun)

这里有个新问题:走和跑是混合树动画(下面解决它)

由于角色的动画是用了混合树,根据控制在走和跑之间切换的动作状态,在调用step和steprun两个函数时,需要对混合树的参数值movespeed进行判断,关键代码如下:

public void StepRun() { if (ani.GetFloat("Movespeed") >= 0.6) {moveSound.pitch = 1.5f;moveSound.volume = 0.5f;moveSound.Play(); } }public void Step(){if (ani.GetFloat("Movespeed") > 0.1 && ani.GetFloat("Movespeed") < 0.6){moveSound.pitch = 0.8f;moveSound.volume = 0.3f;moveSound.Play(); }}

问题二思路:

1.通过脚本去访问地面材质球的IDmask贴图(注:地面非unity内置terrain,而是一个自定义的gameObect,IDMask也是自定义的)

关键代码:

texture= (Texture2D)material.GetTexture("_Mask");

2.根据主角的位置信息去对贴图进行采样,用采样的RGB通道值来作为判定条件识别是播放什么材质

的音效。

那么如何实现采样呢?根据unity官方文档的Texture2D.GetPixel 方法,关键点在于地形的有个角一定是世界坐标原点,那么我们可以把地形的UV和地形的尺寸大小一一对应起来形成映射,角色在世界空间坐标系下位置代表对地形上某个点的采样,从而得到该位置的color值。

unity官方文档API链接------------ Texture2D.GetPixel

关键代码如下:

void Update(){x = -transform.position.x / 100*texture.width;y = -transform.position.z / 100*texture.height;color = texture.GetPixel((int)x, (int)y);Debug.Log(color.r);

得到了color的RGB值后面就容易了,根据这个值来做限定,去调用不同情况下的音效文件,最好的方法是外面只添加一个Audio Source组件,AudioClip以数组的形式添加,示例代码如下:

public class FootSteps : MonoBehaviour{[SerializeField]private AudioClip[] stoneClips;[SerializeField]private AudioClip[] mudClips;[SerializeField]private AudioClip[] grassClips;private AudioSource audioSource;private void Awake(){audioSource = GetComponent<AudioSource>();}private void Step(){AudioClip clip = stoneClips[1];audioSource.PlayOneShot(clip);

PS:如果是用的unity自带的Terrain地形制作,想要制作脚步在不同地形材质上的不同音效方法可以参考这个YouTube视频教程,内附代码:

https: 根据 Unity 中的地形改变你的脚步

如果觉得《unity角色脚步音效根据地面材质不同而改变问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。