【Unity小技巧】3D人物移动脚步和跳跃下落音效控制

文章目录

  • 单脚步声
  • 多脚步声,跳跃落地音效
  • 播放不同材质的多脚步声
  • 完结

单脚步声

public AudioClip walkingSound;
public AudioClip runningSound;//移动音效
public void MoveSound()
{// 如果在地面上并且移动长度大于0.9if (isGround && moveDirection.sqrMagnitude > 0.9f){audioSource.clip = isRun ? runningSound : walkingSound;if (!audioSource.isPlaying) audioSource.Play();}else{if (audioSource.isPlaying) audioSource.Pause();}
}

多脚步声,跳跃落地音效

[SerializeField] private float m_StepInterval; // 脚步声间隔[SerializeField] private AudioClip[] m_FootstepSounds; // 脚步声音效数组
[SerializeField] private AudioClip m_JumpSound; // 跳跃声音效
[SerializeField] private AudioClip m_LandSound; // 落地声音效private void Update()
{if (!m_Jump){m_Jump = Input.GetButtonDown("Jump"); // 检测跳跃输入}ProgressStepCycle(speed); // 更新步行声音//判断角色是否落地,这个判断非常巧妙,假设角色起跳,m_PreviouslyGrounded和m_CharacterController.isGrounded肯定都是false,//执行到下一步时角色到达地上,m_CharacterController.isGrounded变为true,因为m_PreviouslyGrounded还未执行,所以还是false,及此时角色刚落地if (!m_PreviouslyGrounded && m_CharacterController.isGrounded){PlayLandingSound(); // 播放落地声音}if (m_CharacterController.isGrounded){if (m_Jump){PlayJumpSound(); // 播放跳跃声音}}m_PreviouslyGrounded = m_CharacterController.isGrounded;
}
private void PlayLandingSound()
{m_AudioSource.clip = m_LandSound; // 设置落地声音m_AudioSource.Play();//播放落地声音后延迟0.5s再播放脚步声m_NextStep = m_StepCycle + .5f;
}private void PlayJumpSound()
{m_AudioSource.clip = m_JumpSound; // 设置跳跃声音m_AudioSource.Play();
}private void ProgressStepCycle(float speed)
{//判断角色是否在移动。if (m_CharacterController.velocity.sqrMagnitude > 0 && (m_Input.x != 0 || m_Input.y != 0)){//如果角色在移动,根据角色当前的速度和行走/奔跑状态来更新步行声音循环计数器 m_StepCycle 的值。m_StepCycle += (m_CharacterController.velocity.magnitude + (speed * (m_IsWalking ? 1f : m_RunstepLenghten))) * Time.fixedDeltaTime;}//然后,检查是否到达了下一个播放脚步声音的时间点。如果没有到达,就直接返回if (!(m_StepCycle > m_NextStep)){return;}//如果到达了下一个播放脚步声音的时间点,就更新 m_NextStep 的值m_NextStep = m_StepCycle + m_StepInterval;PlayFootStepAudio(); // 播放脚步声音
}private void PlayFootStepAudio()
{if (!m_CharacterController.isGrounded){return;}int n = UnityEngine.Random.Range(1, m_FootstepSounds.Length);m_AudioSource.clip = m_FootstepSounds[n]; // 随机选择一个脚步声音m_AudioSource.PlayOneShot(m_AudioSource.clip);//播放过的脚步声放置第一位,避免连续播放相同的脚步声m_FootstepSounds[n] = m_FootstepSounds[0];m_FootstepSounds[0] = m_AudioSource.clip;
}

播放不同材质的多脚步声

using System.Collections.Generic;
using UnityEngine;public class FootStepSound : MonoBehaviour
{public RaycastHit hit;  // 射线检测结果public GameObject RayGo;  // 射线起点对象public AudioClip[] clipsMetal, clipsTree, clipsGrass, clipsDirt, clipsWater;  // 不同类型表面的声音剪辑数组public float dist = 2;  // 射线的长度private string tagProv;  // 上一次射线检测到的地面标签private int go = 0;  // 控制播放声音的变量,0表示重新播放,1表示继续播放public AudioSource AS;  // 声音源组件public float PitchWalk, PitchRun;  // 行走和奔跑时的音调// 创建一个列表用于存储之前选择过的音效索引private List<int> playedIndexes = new List<int>();void Update(){float horizontal = Input.GetAxisRaw("Horizontal");float vertical = Input.GetAxisRaw("Vertical");if (Input.GetKey(KeyCode.LeftShift) && Input.GetKey(KeyCode.W))AS.pitch = PitchRun;  // 如果同时按下左Shift和W键,则设置为奔跑音调elseAS.pitch = PitchWalk;  // 否则设置为行走音调if (horizontal != 0 || vertical != 0){if (Physics.Raycast(RayGo.transform.position, Vector3.down, out hit, dist))  // 向下发射射线检测地面{if (hit.collider){if (hit.collider.tag != tagProv) go = 0;tagProv = hit.collider.tag;switch (hit.collider.tag)  // 根据地面的标签选择对应的声音类型{case "Metal":PlayRandomSound(clipsMetal);  // 播放金属声音break;case "Tree":PlayRandomSound(clipsTree);  // 播放树木声音break;case "Grass":PlayRandomSound(clipsGrass);  // 播放草地声音break;case "Dirt":PlayRandomSound(clipsDirt);  // 播放土地声音break;case "Water":PlayRandomSound(clipsWater);  // 播放水声音break;default:StopSound();  // 停止播放声音break;}}}}else{StopSound();  // 停止播放声音}}// 从给定的声音剪辑数组中随机播放一个声音void PlayRandomSound(AudioClip[] clips){if (go == 0)  // 如果需要重新设置音频剪辑{AS.clip = null;go = 1;}if (!AS.isPlaying)  // 如果当前没有正在播放的声音{// AS.clip = clips[Random.Range(0, clips.Length)];  // 随机选择一个声音剪辑int randomIndex = GetUniqueRandomIndex(clips.Length);  // 获取一个未播放过的随机索引AS.clip = clips[randomIndex];  // 根据索引选择一个声音剪辑AS.Play();  // 播放声音}}// 获取一个未播放过的随机索引int GetUniqueRandomIndex(int arrayLength){int randomIndex;do{randomIndex = Random.Range(0, arrayLength);  // 生成一个随机索引} while (playedIndexes.Contains(randomIndex));  // 循环判断该索引是否已经播放过playedIndexes.Add(randomIndex);  // 将新的索引添加到已播放列表中if (playedIndexes.Count >= arrayLength){playedIndexes.Clear();  // 如果已播放列表包含所有索引,则清空列表,重新开始播放}return randomIndex;}// 停止播放声音并重置go变量void StopSound(){AS.clip = null;  // 清空音频剪辑AS.Stop();  // 停止播放声音go = 0;  // 重置go变量}
}

解释:
go 的这个逻辑保证了只有在需要重新设置音频剪辑时才会执行,避免了声音的混叠和中断。如果去除这个逻辑,可能会导致声音播放不正常。

AS.pitch是用来控制音频的音调(pitch)的属性。音调指的是声音的高低,可以用数字表示,其中1.0表示原始音调,小于1.0表示降低音调,大于1.0表示提高音调。
通过改变音调,可以实现音频的加速或减速播放。较高的音调会使音频听起来更快,而较低的音调则会使音频听起来更慢。

大致参数配置
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动物免疫(羊驼免疫)-泰克生物

在过去几十年里&#xff0c;抗体研究和应用的领域已经经历了革命性的变化。在这个进程中&#xff0c;一种特殊来源的抗体 —— 来自骆驼科动物&#xff08;包括羊驼&#xff09;的单链抗体&#xff08;也称纳米抗体&#xff09;引起了全球科学家的广泛关注。 羊驼等骆驼科动物…

【Linux】python版本控制和环境管理

文章目录 1.查看目前python的版本2.添加软件源并更新3.选择你想要下载的版本4.警示&#xff1a;没必要设置默认版本误区千万千万不要覆盖python3软链接解决办法 5.pip软件包管理最省心稍微麻烦换源 网上有很多教程都是教导小白去官方下载之后编译安装。但是&#xff0c;小白连c…

4.go 基础类型及类型转换

目录 概述basic types总结例子 Zero values总结例子 类型转换总结例子 结束 概述 go 版本&#xff1a; go1.20.13 basic types 总结 基本类型如下&#xff1a; boolstringint int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptrbyte // alias for uint8…

[pytorch入门] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…

蓝桥杯理历年真题 —— 数学

1. 买不到的数目 这道题目&#xff0c;考得就是一个日常数学的积累&#xff0c;如果你学过这个公式的话&#xff0c;就是一道非常简单的输出问题&#xff1b;可是如果没学过&#xff0c;就非常吃亏&#xff0c;在考场上只能暴力求解&#xff0c;或是寻找规律。这就要求我们什么…

Python图像处理【19】基于霍夫变换的目标检测

基于霍夫变换的目标检测 0. 前言1. 使用圆形霍夫变换统计图像中圆形对象2. 使用渐进概率霍夫变换检测直线2.1 渐进霍夫变换原理2.2 直线检测 3. 使用广义霍夫变换检测任意形状的对象3.1 广义霍夫变换原理3.2 检测自定义形状 小结系列链接 0. 前言 霍夫变换 (Hough Transform,…

H5112C PWM调光 无频闪 高性价比 支持12V 24V 36V 48V 60V 72V 内置MOS

PWM调光芯片是一种常用于LED调光控制的芯片&#xff0c;其工作原理如下&#xff1a; 脉冲宽度调制&#xff08;PWM&#xff09;&#xff1a;PWM是一种调制技术&#xff0c;通过改变信号的脉冲宽度来控制输出信号的平均功率。在PWM调光中&#xff0c;芯片会以一定的频率产生一系…

SpringCloud Alibaba 深入源码 - Nacos 和 Eureka 的区别(健康检测、服务的拉取和订阅)

目录 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 a&#xff09;首先&#xff0c;我们的服务启动时。都会把自己的信息提交给注册中心&#xff0c;然后注册中心就会把信息保存下来. 注册的…

ELK日志分析

目录 一、ELK概述 &#xff08;一&#xff09;ELK的定义 &#xff08;二&#xff09;ELK工具 1.ElasticSearch 2.Kiabana 3.Logstash &#xff08;1&#xff09;定义 &#xff08;2&#xff09;插件 ① input ② filter ③ output &#xff08;三&#xff09;可以添…

快速排序(三)——hoare法

目录 ​一.前言 二.快速排序 hoare排法​ 三.结语 一.前言 本文给大家带来的是快速排序&#xff0c;快速排序是一种很强大的排序方法&#xff0c;相信大家在学习完后一定会有所收获。 码字不易&#xff0c;希望大家多多支持我呀&#xff01;&#xff08;三连&#xff0b;关…

Spring Boot3整合Druid(监控功能)

目录 1.前置条件 2.导依赖 错误依赖&#xff1a; 正确依赖&#xff1a; 3.配置 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动。 作者版本为3.2.2最新版 2.导依赖 错误依赖&#xff1a; 这个依赖对于spring boot 3的支持不够&#…

H5嵌入小程序适配方案

时间过去了两个多月&#xff0c;2024已经到来&#xff0c;又老了一岁。头发也掉了好多。在这两个月时间里都忙着写页面&#xff0c;感觉时间过去得很快。没有以前那么轻松了。也不是遇到了什么难点技术&#xff0c;而是接手了一个很烂得项目。能有多烂&#xff0c;一个页面发起…

开源无代码应用程序生成器Saltcorn

什么是 Saltcorn &#xff1f; Saltcorn 是一个无需编写任何代码即可构建数据库 Web 应用程序的平台。它配备了一个吸睛的仪表板&#xff0c;丰富的生态系统、视图生成器以及支持主题的界面&#xff0c;使用直观的点击、拖放用户界面来构建整个应用程序。 软件的特点&#xff1…

智慧文旅运营综合平台:重塑文化旅游产业的新引擎

目录 一、建设意义 二、包含内容 三、功能架构 四、典型案例 五、智慧文旅全套解决方案 - 210份下载 在数字化浪潮席卷全球的今天&#xff0c;智慧文旅运营综合平台作为文化旅游产业与信息技术深度融合的产物&#xff0c;正逐渐显现出其强大的生命力和广阔的发展前景。 该…

海外抖音TikTok、正在内测 AI 生成歌曲功能,依靠大语言模型 Bloom 进行文本生成歌曲

近日&#xff0c;据外媒The Verge报道&#xff0c;TikTok正在测试一项新功能&#xff0c;利用大语言模型Bloom的AI能力&#xff0c;允许用户上传歌词文本&#xff0c;并使用AI为其添加声音。这一创新旨在为用户提供更多创作音乐的工具和选项。 Bloom 是由AI初创公司Hugging Fac…

C语言——内存函数介绍和模拟实现(memcpy、memmove、memset、memcmp)

之前我们讲过一些字符串函数&#xff08;http://t.csdnimg.cn/ZcvCo&#xff09;&#xff0c;今天我们来讲一讲几个内存函数&#xff0c;那么可能有人要问了&#xff0c;都有字符串函数了&#xff0c;怎么又来个内存函数&#xff0c;这不是一样的么&#xff1f; 我们要知道之前…

第十二站(20天):C++泛型编程

模板 C提供了模板(template)编程的概念。所谓模板&#xff0c;实际上是建立一个通用函数或类&#xff0c; 其 类内部的类型和函数的形参类型不具体指定 &#xff0c;用一个虚拟的类型来代表。这种通用的方式称 为模板。 模板是泛型编程的基础, 泛型编程即以一种独立于任何特定…

C++面试:跳表

目录 跳表介绍 跳表的特点&#xff1a; 跳表的应用场景&#xff1a; C 代码示例&#xff1a; 跳表的特性 跳表示例 总结 跳表&#xff08;Skip List&#xff09;是一种支持快速搜索、插入和删除的数据结构&#xff0c;具有相对简单的实现和较高的查询性能。下面是跳表…

职业规划,软件开发工程师的岗位任职资格

软件工程师是指从事软件开发的人&#xff0c;主要的工作涉及到项目培训和项目设计两个方面。在实际工作中&#xff0c;软件工程师是一个广义的概念&#xff0c;包括了很多与软件相关的人员。除开最基础的编程语言&#xff0c;还有数据库语言等等。从事这份工作&#xff0c;需要…

记录一下uniapp 集成腾讯im特别卡(已解决)

uniapp的项目运行在微信小程序 , 安卓 , ios手机三端 , 之前这个项目集成过im,不过版本太老了,0.x的版本, 现在需要添加客服功能,所以就升级了 由于是二开 , 也为了方便 , 沿用之前的webview嵌套腾讯IM的方案 , 选用uniapp集成ui ,升级之后所有安卓用户反馈点击进去特别卡,几…