【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;引起了全球科学家的广泛关注。 羊驼等骆驼科动物…

Java NIO (四)NIO Selector类

1 选择器与注册 选择器是什么&#xff1f;选择器和通道关系是什么&#xff1f; 简单的说&#xff0c;选择器的使用是完成IO的多路复用&#xff0c;其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路&#xff0c;通过选择器可以同时监听多个通道的IO(输入输出)…

长拖尾数据的采样方法

以下内容来自于ChatGPT长拖尾数据的采样方式&#xff1a; 对于具有长拖尾&#xff08;长尾&#xff09;分布的数据&#xff0c;通常使用传统的随机抽样方法可能不太适用&#xff0c;因为这样的分布意味着有一些极端值&#xff08;outliers&#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;然后注册中心就会把信息保存下来. 注册的…

Midjourney常见参数列表(极速版)

前言 参数是添加到提示词末尾的选项&#xff0c;可以改变图片的生成方式。参数可以改变图片的长宽比&#xff08;Aspect Ratios&#xff09;&#xff0c;切换不同的Midjourney模型版本&#xff08;Model Versions&#xff09;&#xff0c;改变使用的放大器&#xff08;Upscaler…

Leetcode 3016. Minimum Number of Pushes to Type Word II

Leetcode 3016. Minimum Number of Pushes to Type Word II 1. 解题思路2. 代码实现 题目链接&#xff1a;3016. Minimum Number of Pushes to Type Word II 1. 解题思路 这道题的话思路其实还是蛮简单的&#xff0c;显然我们的目的是要令对给定的word在键盘上敲击的次数最小…

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;可以添…

Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录

Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录 文章目录 Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录1. spring.xml2. spring-mvc.xml3. mybatis-config.xml4. mybaits-generator.xml5. ehcach.xml6. web.xml Spring、Spring-…

快速排序(三)——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的支持不够&#…

微服务架构弹性伸缩策略方案

微服务架构的弹性伸缩策略是确保系统能够在不同工作负载下高效运行的关键。通过巧妙的策略&#xff0c;可以实现对每个微服务的独立伸缩&#xff0c;提高系统的灵活性和性能。本文将深入探讨微服务架构下的弹性伸缩方案。 1. 独立微服务的弹性伸缩 微服务架构的核心思想是将应…

用go语言删除重复文件

用go语言删除重复文件 文章目录 用go语言删除重复文件需求&#xff1a;将同级别目录&#xff08;只有一层的目录&#xff0c;没子目录&#xff09;下的重复文件删除打包成exe文件使用 需求&#xff1a;将同级别目录&#xff08;只有一层的目录&#xff0c;没子目录&#xff09;…

H5嵌入小程序适配方案

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

Sim ROS2

ROS2_Galactic Ubuntu (Debian) — ROS 2 Documentation: Galactic documentation VMware界面大小调整两种方法超详细教程_vmware怎么调整虚拟机界面大小-CSDN博客 orca4 simulator https://github.com/clydemcqueen/orca4 Docker 【 全干货 】5 分钟带你看懂 Docker &#…