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

这篇具有很好参考价值的文章主要介绍了【Unity小技巧】3D人物移动脚步和跳跃下落音效控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

单脚步声

public AudioClip walkingSound;
public AudioClip runningSound;

//移动音效
public void MoveSound()
{
    // 如果在地面上并且移动长度大于0.9
    if (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;
}

播放不同材质的多脚步声

获取人物移动状态

public class PlayerState : Singleton<PlayerState>
{
	[Header("判断人物状态")]
    public bool isMove;//是否在移动
    public bool isWalking;//是否正在行走
    public bool isRuning; //是否正在奔跑
    public bool isCrouching; //是否正在下蹲
    
	private void Update()
    {
        isMove = MovementScript.Instance.isGround && MovementScript.Instance.moveDirection.sqrMagnitude > 0;
        isRuning = MovementScript.Instance.isRun && isMove;
        isCrouching = MovementScript.Instance.isCrouching;
        isWalking = !isRuning && !isCrouching && isMove;
     }
}

脚步声控制

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;  // 声音源组件

    //该属性控制音频的播放速度,1.0 表示正常速度,小于 1.0 表示慢速播放,大于 1.0 表示快速播放。
    public float PitchRun, PitchWalk, PitchCrouch;

    // 创建一个列表用于存储之前选择过的音效索引
    private List<int> playedIndexes = new List<int>();

    void Update()
    {
        if (PlayerState.Instance.isRuning)
            AS.pitch = PitchRun;  //则设置为奔跑音调
        else if(PlayerState.Instance.isWalking){
            AS.pitch = PitchWalk;
        }else{
            AS.pitch = PitchCrouch;
        }
            

        if (PlayerState.Instance.isMove)
        {
            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 (AS.isPlaying)
        {
            // AS.Stop();
        }
        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.Stop();  // 停止播放声音
        go = 0;  // 重置go变量
    }
}

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

AS.pitch是用来控制音频的音调(pitch)的属性。该属性控制音频的播放速度,1.0 表示正常速度,小于 1.0 表示慢速播放,大于 1.0 表示快速播放。
通过改变音调,可以实现音频的加速或减速播放。较高的音调会使音频听起来更快,而较低的音调则会使音频听起来更慢。

大致参数配置
【Unity小技巧】3D人物移动脚步和跳跃下落音效控制,# unity小技巧,unity,3d,游戏引擎,游戏

完结

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

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

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

【Unity小技巧】3D人物移动脚步和跳跃下落音效控制,# unity小技巧,unity,3d,游戏引擎,游戏文章来源地址https://www.toymoban.com/news/detail-814732.html

到了这里,关于【Unity小技巧】3D人物移动脚步和跳跃下落音效控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity进阶提升-2D游戏跳跃手感优化(跳起下落)

    在进行2D游戏开发时,跳跃是不可缺少的一个重要功能。但是我们在Unity开发时Unity本身的物理引擎并不能提供很好的的手感,下落的时候轻飘飘的,这操作起来显然非常不舒服。所以,我们需要自己对跳跃进行优化,以此来获得更好的手感。我们不难发现,在绝大多数2D游戏

    2024年02月08日
    浏览(48)
  • 实现3D人物的移动和旋转。(Unity)

    首先,需要在人物身上加刚体和碰撞器。   如果需要人物身上有声音,可以添加AudioSource音频源。  然后创建脚本,需要把脚本挂载到对应的对象身上。 如果有动画,还需要创建状态机添加到对应的对象上面,并且设置好里面的动画。  代码实现: 图片实现:     上面代码

    2024年02月04日
    浏览(68)
  • Unity 3D 人物移动朝向跟随摄像机(第一人称)

    以人物身体旋转控制镜头左右滑动 以摄像机旋转控制镜头上下滑动 首先我们要知道 摄像机是作为人物的子物体的(充当眼睛) 所以当人物旋转时 摄像机会跟随它朝相同的方向旋转相同的角度 从而达到 眼睛(摄像机)注视的方向一定是人物的正前方 那么这样做有什么好处

    2024年02月21日
    浏览(54)
  • Unity3D方向键控制人物移动的代码

    也可以换成 Translate 函数默认模式是 Space.Self ,此时移动方向需要为人物坐标系下的人物前进方向 Vector3(0, 0, 1) ;如果模式指定为 Space.World ,移动方向应该为世界坐标系下的人物前进方向 transform.forward , transform.forward 在人物转向过程中会改变。如果不注意这个问题,人物转

    2024年02月11日
    浏览(63)
  • Unity Audio -- (3)创建3D音效

            本节会添加场景中小瀑布的音效。小瀑布的音效会有一个作用范围,也会根据角色所处的位置不同,产生不同的效果。         1. 在Hierarchy中,点击右键,选择Audio - Create Audio Source,将这个新的Audio Source名字设为“Waterfall Audio”。         2. 在场景试图中,移动A

    2024年02月08日
    浏览(40)
  • Unity 2D横版移动跳跃

      绿色 长方形为地表, 红色 圆形为玩家 地表挂载碰撞组件  玩家挂载钢体组件和碰撞组件  将Collision Detection设置为Continuous,Constraints勾选Freeze Rotation Z; 在Player上创建名为MoveandJump的C#脚本

    2024年02月11日
    浏览(43)
  • Unity实现人物旋转+移动

    思路:首先要有个变量去记录下操作前的一个方向状态。(本次操作的对象是正面对着屏幕的。)然后还有有个变量去描述将要发生的方向。接着要明确,前和后,左和右是横跨180°的,其他的两两是相差90°的。所以我们可以以90°一个单位去做旋转。并且利用前面总结的方向

    2024年02月14日
    浏览(42)
  • Unity 原神人物移动和镜头处理

    每帧都处理的地方 不要用 SetTrigger 为什么呢? 你肯定会希望 SetTrigger run 就跑步 SetTrigger stop 就停止 但事实并非如此 SetTrigger 会在下一帧自动设置回去 而你移动肯定是每帧都在 SetTrigger 所以人物移动会抽搐 最好的办法是 设置float 分析原神的镜头 界面左侧负责控制人物移动

    2024年02月07日
    浏览(43)
  • Unity Animator人物模型动画移动偏移

    模型动画出现移动方向偏移 !修改Animation中的Root Transform Rotation(根变换位置)、Root Transform Rotation(x,y,z)(旋转),Bake Info Pose修改为Original。可以解决 !!但是,使用动画移动函数时将无法移动,原因是锁定根变换位置和循环位置 !!!所以只要修改依据为原始或者微调偏离值,

    2024年02月15日
    浏览(43)
  • Unity CharacterController控制人物移动(包括重力实现)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在使用CharacterController组件时,人物移动一般有两种方式,一种是无重力移动–SimpleMove,一种是有重力移动–Move。而使用有重力移动时,又会出现人在下楼梯时无法贴合地面,从而造成飞天效果,最终导

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包