今天实现的内容:

制作脚步声,学习了一下ScriptableObject的原理。脚本声音资源采用ScriptableObject的方式储存应用。当角色着地并正在发生位移时,播放脚步声。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(menuName = "FPS/Footstep Audio Data")]
public class FootstepAudioData : ScriptableObject
{public List<FootstepAudio> footstepAudios = new List<FootstepAudio>();
}[System.Serializable]
public class FootstepAudio
{// 用于标记踩在什么表面上public string Tag;// 声音片段列表public List<AudioClip> AudioClips = new List<AudioClip>();// 声音间隔public float walkVoiceInterval;//public float sprintingVoiceInterval;//public float CrouchingVoiceInterval;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerFootstepListener : MonoBehaviour
{public FootstepAudioData footstepAudioData;public AudioSource footstepAudioSource;private CharacterController characterController;private Transform footstepTransform;private float timePassed = 0;private FPCharacterControllerMovement movement;// 角色移动或者发生较大幅度位移时 播放脚步声// 根据角色踩踏的不同材质播放不同的声音// 具体实现方式采用Physics APIprivate void Start(){characterController = GetComponent<CharacterController>();footstepTransform = transform;movement = GetComponent<FPCharacterControllerMovement>();}private void FixedUpdate(){// 角色处于地面if(characterController.isGrounded){// 角色正在移动if(characterController.velocity.normalized.sqrMagnitude > 0.1f){// 设置下一次播放的时间timePassed += Time.deltaTime;// 播放移动声音if(Physics.Linecast(footstepTransform.position,footstepTransform.position + Vector3.down * characterController.height,out RaycastHit temp_hitInfo)) //检测当前踩踏在什么地面上{#if UNITY_EDITORDebug.Log(temp_hitInfo.collider.tag);Debug.DrawRay(footstepTransform.position,-footstepTransform.up * characterController.height, Color.red);#endif// 对于所有类型的脚步声foreach (var temp_audioElement in footstepAudioData.footstepAudios){// 找到匹配的类型if (temp_hitInfo.collider.CompareTag(temp_audioElement.Tag)){// 用于保存实际要用的声音播放间隔float temp_VoiceInterval = 0;if (movement.m_isSprinting && movement.m_isCrouched) //是否在蹲下时冲刺{temp_VoiceInterval = temp_audioElement.walkVoiceInterval;}else if(movement.m_isCrouched) //是否蹲下{temp_VoiceInterval = temp_audioElement.walkVoiceInterval * 2;}else if (movement.m_isSprinting) //是否在冲刺{temp_VoiceInterval = temp_audioElement.walkVoiceInterval / 2;}else // 那就只是在走了{temp_VoiceInterval = temp_audioElement.walkVoiceInterval;}Debug.Log(temp_VoiceInterval);// 如果到了下一次播放时间if (timePassed >= temp_VoiceInterval){// 获取这个类型脚步声的素材总数int temp_audioCount = temp_audioElement.AudioClips.Count;// 随机获取一个int temp_audioIndex = UnityEngine.Random.Range(0, temp_audioCount);// 获取到对应的声音片段AudioClip temp_footstepAudioClip = temp_audioElement.AudioClips[temp_audioIndex];// 播放音效footstepAudioSource.clip = temp_footstepAudioClip;footstepAudioSource.Play();timePassed = 0;// 找到了就行了 直接跳出循环break;}}}}}}}}

FootstepAudioData负责用于生成存储音效资源的ScriptableObject,PlayerFootstepListener用于角色所处地面的判断,找到对应的音效,随机获取音效,并播放音效。音效有播放间隔,来勉强达到听起来还算真实的效果吗,还实现了不同的运动状态对应不同的音效播放间隔。

效果:移动时的脚步声以及BUG


BUG以及缺陷:

有时会莫名其妙的检测不出地面的Tag。但其实是我的射线检测写错了,检测的end点应该为角色往下的点,而不是原点往下。以上代码以改正为正确的。
蹲下时没有脚步声了。应该是射线检测不到地面了。
最大的缺陷,这个音效真的很难听,算了,学会功能的实现就好。


值得注意的:

如何判断移动状态?我直接引用了之前的移动控制脚本,脚本中有描述运动状态的bool值,这一点和老师做的不一样。


FPS项目脚步声——Unity随手记(2021.1.22)相关推荐

  1. 黑魂复刻游戏的玩家输入模块——Unity随手记(2021.3.14)

    文章目录 前言 今天实现的内容: 按键封装 获取输入及输入信号优化 输入的渐变 模块的软开关 处理输入 BUG以及缺陷: 值得注意的: 前言 好久不见,在接下来的Unity随手记里,我会学着B站上的视 ...

  2. 全球及中国沼气发电行业现状及项目发展动态调研报告2021年版

    全球及中国沼气发电行业现状及项目发展动态调研报告2021年版 HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS--HS-- [修订日期]:2021年11月 [搜索鸿 ...

  3. UE4-简单的FPS项目制作(B站视频笔记)P1P2

    UE4-简单的FPS项目制作 来源:B站视频:https://www.bilibili.com/video/BV1Dg4y1b7aA 看视频,记录操作流程,再自己制作一遍,再回顾 P1- 教程内容和方 ...

  4. Java毕设项目自行车在线租赁管理系统2021(java+VUE+Mybatis+Maven+Mysql)

    Java毕设项目自行车在线租赁管理系统2021(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuild ...

  5. Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行

    Unity3D中项目在Unity编辑器下正常运行打包成功exe后无法正常运行 一.遇到的情况描述: 项目中涉及到了文件读取的相关操作 项目在Unity下能够正常获取到文件信息并且不报错 项目能够成功打 ...

  6. 尚硅谷——谷粒商城项目开发记录——2021.11.22

    尚硅谷--谷粒商城项目开发记录--2021.11.22 概念: 1.对象优化: 新增的API: ES6 给 Object 拓展了许多新的方法,如: keys(obj): 获取对象的所有 key 形成的 ...

  7. Java入门篇 2021/02/22

    Java入门篇 2021/02/22 Java的三大版本 java三大版本主要包括 JavaSE, JavaME, JavaEE,其中现如今的JavaME已经是很少见了,JavaSE是JavaEE的基 ...

  8. 2021.1.22平安科技面经--算法工程师实习生

    2021.1.22平安科技面经–算法工程师实习生 岗位:算法工程师实习生 自我介绍(这个地方我自己需要去提炼一下) 机器学习,人工智能了解得多吗? 那你是怎么自学机器学习,深度学习呢? 那什么是过拟合 ...

  9. JAVA基础学习预科部分 (Markdown + dox)2021/2/22持续更新中

    javaSE从 2021/02/22开始,预计到2021/02/28,原本预计的算法题解先鸽一下. -博客Blog的重要性 & Markdown语法 基础markdown语法 标题, 直接使用 ...

最新文章

  1. 【风之语】至贱城市之成都
  2. linux kernel的spinlock在armv7和armv8中的不同
  3. 域名解析可以带端口吗_带互感器的三相电表接线,S2可以不接地吗?ABC相序可以错吗?...
  4. Winforn中设置ZedGraoh的GraphPane恢复到初始比例大小
  5. 男孩子也是要护肤的!!!
  6. ㊙️【教你用python挣零花钱】自动化简历内推,学弟直呼牛逼!!
  7. c语言error和,C语言ERROR精选.doc
  8. Native Crash 分析
  9. 守护线程 java 1615478655
  10. [转载]——Axure+SVN配置
  11. Django的Modelforms的介绍
  12. python用均值填充空值_用平均值填充空值
  13. python论坛签到_Python 百度贴吧自动签到
  14. 【解决】Failed to process import candidates for configuration class [cn.itcast.eureka.EurekaApplication]
  15. activiti报错:org.activiti.engine.ActivitiTaskAlreadyClaimedException: Task ‘12502‘ is already claimed
  16. 年末IPO热潮掀起,国际永胜二度冲击港交所
  17. JMeter学习笔记1-安装环境
  18. NYOJ 买牛奶(水题)
  19. cuda无法使用nvprof命令,找不到cupti64_2021_3.0.dll
  20. TEC-XP 汇编学习

热门文章

  1. Spring Boot 化繁为简
  2. 黑盒测试和白盒测试区别
  3. 开源硬件交流@上海新车间
  4. 2021全球勒索软件攻击榜公布——工业领域最容易中招
  5. 互联网广告系统综述三业务描述
  6. 前端工程化-VSCode插件集成脚手架和组件库
  7. 如何使用obs采集视频流/推流
  8. 基于Springboot+Vue+Element实现汽车租赁系统
  9. 猫(modem) 路由器 交换机 中继器 集线器 网桥 wifi协议和以太网协议 WAN(wide area network) LAN(local area network)
  10. 选择辉山乳业十天儿童酸奶,助力孩子健康茁壮成长