国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity小技巧】3D人物移動(dòng)腳步和跳躍下落音效控制

這篇具有很好參考價(jià)值的文章主要介紹了【Unity小技巧】3D人物移動(dòng)腳步和跳躍下落音效控制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

單腳步聲

public AudioClip walkingSound;
public AudioClip runningSound;

//移動(dòng)音效
public void MoveSound()
{
    // 如果在地面上并且移動(dòng)長(zhǎng)度大于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; // 腳步聲音效數(shù)組
[SerializeField] private AudioClip m_JumpSound; // 跳躍聲音效
[SerializeField] private AudioClip m_LandSound; // 落地聲音效

private void Update()
{
    if (!m_Jump)
    {
        m_Jump = Input.GetButtonDown("Jump"); // 檢測(cè)跳躍輸入
    }

	ProgressStepCycle(speed); // 更新步行聲音

    //判斷角色是否落地,這個(gè)判斷非常巧妙,假設(shè)角色起跳,m_PreviouslyGrounded和m_CharacterController.isGrounded肯定都是false,
    //執(zhí)行到下一步時(shí)角色到達(dá)地上,m_CharacterController.isGrounded變?yōu)閠rue,因?yàn)閙_PreviouslyGrounded還未執(zhí)行,所以還是false,及此時(shí)角色剛落地
    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; // 設(shè)置落地聲音
    m_AudioSource.Play();
    //播放落地聲音后延遲0.5s再播放腳步聲
    m_NextStep = m_StepCycle + .5f;
}

private void PlayJumpSound()
{
    m_AudioSource.clip = m_JumpSound; // 設(shè)置跳躍聲音
    m_AudioSource.Play();
}

private void ProgressStepCycle(float speed)
{
    //判斷角色是否在移動(dòng)。
    if (m_CharacterController.velocity.sqrMagnitude > 0 && (m_Input.x != 0 || m_Input.y != 0))
    {
        //如果角色在移動(dòng),根據(jù)角色當(dāng)前的速度和行走/奔跑狀態(tài)來(lái)更新步行聲音循環(huán)計(jì)數(shù)器 m_StepCycle 的值。
        m_StepCycle += (m_CharacterController.velocity.magnitude + (speed * (m_IsWalking ? 1f : m_RunstepLenghten))) * Time.fixedDeltaTime;
    }

    //然后,檢查是否到達(dá)了下一個(gè)播放腳步聲音的時(shí)間點(diǎn)。如果沒(méi)有到達(dá),就直接返回
    if (!(m_StepCycle > m_NextStep))
    {
        return;
    }
    //如果到達(dá)了下一個(gè)播放腳步聲音的時(shí)間點(diǎn),就更新 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]; // 隨機(jī)選擇一個(gè)腳步聲音
    m_AudioSource.PlayOneShot(m_AudioSource.clip);
    
    //播放過(guò)的腳步聲放置第一位,避免連續(xù)播放相同的腳步聲
    m_FootstepSounds[n] = m_FootstepSounds[0];
    m_FootstepSounds[0] = m_AudioSource.clip;
}

播放不同材質(zhì)的多腳步聲

獲取人物移動(dòng)狀態(tài)

public class PlayerState : Singleton<PlayerState>
{
	[Header("判斷人物狀態(tài)")]
    public bool isMove;//是否在移動(dòng)
    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;  // 射線檢測(cè)結(jié)果
    public GameObject RayGo;  // 射線起點(diǎn)對(duì)象
    public AudioClip[] clipsMetal, clipsTree, clipsGrass, clipsDirt, clipsWater;  // 不同類(lèi)型表面的聲音剪輯數(shù)組
    public float dist = 2;  // 射線的長(zhǎng)度
    private string tagProv;  // 上一次射線檢測(cè)到的地面標(biāo)簽

    private int go = 0;  // 控制播放聲音的變量,0表示重新播放,1表示繼續(xù)播放
    public AudioSource AS;  // 聲音源組件

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

    // 創(chuàng)建一個(gè)列表用于存儲(chǔ)之前選擇過(guò)的音效索引
    private List<int> playedIndexes = new List<int>();

    void Update()
    {
        if (PlayerState.Instance.isRuning)
            AS.pitch = PitchRun;  //則設(shè)置為奔跑音調(diào)
        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))  // 向下發(fā)射射線檢測(cè)地面
            {
                if (hit.collider)
                {
                    if (hit.collider.tag != tagProv) go = 0;
                    tagProv = hit.collider.tag;

                    switch (hit.collider.tag)  // 根據(jù)地面的標(biāo)簽選擇對(duì)應(yīng)的聲音類(lèi)型
                    {
                        case "Metal":
                            PlayRandomSound(clipsMetal);  // 播放金屬聲音
                            break;
                        case "Tree":
                            PlayRandomSound(clipsTree);  // 播放樹(shù)木聲音
                            break;
                        case "Grass":
                            PlayRandomSound(clipsGrass);  // 播放草地聲音
                            break;
                        case "Dirt":
                            PlayRandomSound(clipsDirt);  // 播放土地聲音
                            break;
                        case "Water":
                            PlayRandomSound(clipsWater);  // 播放水聲音
                            break;
                        default:
                            StopSound();  // 停止播放聲音
                            break;
                    }
                }
            }
        }
        else
        {
            StopSound();  // 停止播放聲音
        }
    }

    // 從給定的聲音剪輯數(shù)組中隨機(jī)播放一個(gè)聲音
    void PlayRandomSound(AudioClip[] clips)
    {
        if (AS.isPlaying)
        {
            // AS.Stop();
        }
        if (go == 0)  // 如果需要重新設(shè)置音頻剪輯
        {
            AS.clip = null;
            go = 1;
        }
        if (!AS.isPlaying)  // 如果當(dāng)前沒(méi)有正在播放的聲音
        {
            
            // AS.clip = clips[Random.Range(0, clips.Length)];  // 隨機(jī)選擇一個(gè)聲音剪輯
            int randomIndex = GetUniqueRandomIndex(clips.Length);  // 獲取一個(gè)未播放過(guò)的隨機(jī)索引
            AS.clip = clips[randomIndex];  // 根據(jù)索引選擇一個(gè)聲音剪輯
            AS.Play();  // 播放聲音
        }
    }

    // 獲取一個(gè)未播放過(guò)的隨機(jī)索引
    int GetUniqueRandomIndex(int arrayLength)
    {
        int randomIndex;
        do
        {
            randomIndex = Random.Range(0, arrayLength);  // 生成一個(gè)隨機(jī)索引
        } while (playedIndexes.Contains(randomIndex));  // 循環(huán)判斷該索引是否已經(jīng)播放過(guò)

        playedIndexes.Add(randomIndex);  // 將新的索引添加到已播放列表中
        if (playedIndexes.Count >= arrayLength)
        {
            playedIndexes.Clear();  // 如果已播放列表包含所有索引,則清空列表,重新開(kāi)始播放
        }

        return randomIndex;
    }

    // 停止播放聲音并重置go變量
    void StopSound()
    {
        AS.Stop();  // 停止播放聲音
        go = 0;  // 重置go變量
    }
}

解釋?zhuān)?br> go 的這個(gè)邏輯保證了只有在需要重新設(shè)置音頻剪輯時(shí)才會(huì)執(zhí)行,避免了聲音的混疊和中斷。如果去除這個(gè)邏輯,可能會(huì)導(dǎo)致聲音播放不正常。

AS.pitch是用來(lái)控制音頻的音調(diào)(pitch)的屬性。該屬性控制音頻的播放速度,1.0 表示正常速度,小于 1.0 表示慢速播放,大于 1.0 表示快速播放。
通過(guò)改變音調(diào),可以實(shí)現(xiàn)音頻的加速或減速播放。較高的音調(diào)會(huì)使音頻聽(tīng)起來(lái)更快,而較低的音調(diào)則會(huì)使音頻聽(tīng)起來(lái)更慢。

大致參數(shù)配置
【Unity小技巧】3D人物移動(dòng)腳步和跳躍下落音效控制,# unity小技巧,unity,3d,游戲引擎,游戲

完結(jié)

贈(zèng)人玫瑰,手有余香!如果文章內(nèi)容對(duì)你有所幫助,請(qǐng)不要吝嗇你的點(diǎn)贊評(píng)論和關(guān)注,以便我第一時(shí)間收到反饋,你的每一次支持都是我不斷創(chuàng)作的最大動(dòng)力。當(dāng)然如果你發(fā)現(xiàn)了文章中存在錯(cuò)誤或者有更好的解決方法,也歡迎評(píng)論私信告訴我哦!

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

一位在小公司默默奮斗的開(kāi)發(fā)者,出于興趣愛(ài)好,最近開(kāi)始自學(xué)unity,閑暇之余,邊學(xué)習(xí)邊記錄分享,站在巨人的肩膀上,通過(guò)學(xué)習(xí)前輩們的經(jīng)驗(yàn)總是會(huì)給我很多幫助和啟發(fā)!php是工作,unity是生活!如果你遇到任何問(wèn)題,也歡迎你評(píng)論私信找我, 雖然有些問(wèn)題我也不一定會(huì),但是我會(huì)查閱各方資料,爭(zhēng)取給出最好的建議,希望可以幫助更多想學(xué)編程的人,共勉~

【Unity小技巧】3D人物移動(dòng)腳步和跳躍下落音效控制,# unity小技巧,unity,3d,游戲引擎,游戲文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-814732.html

到了這里,關(guān)于【Unity小技巧】3D人物移動(dòng)腳步和跳躍下落音效控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Unity進(jìn)階提升-2D游戲跳躍手感優(yōu)化(跳起下落)

    Unity進(jìn)階提升-2D游戲跳躍手感優(yōu)化(跳起下落)

    在進(jìn)行2D游戲開(kāi)發(fā)時(shí),跳躍是不可缺少的一個(gè)重要功能。但是我們?cè)赨nity開(kāi)發(fā)時(shí)Unity本身的物理引擎并不能提供很好的的手感,下落的時(shí)候輕飄飄的,這操作起來(lái)顯然非常不舒服。所以,我們需要自己對(duì)跳躍進(jìn)行優(yōu)化,以此來(lái)獲得更好的手感。我們不難發(fā)現(xiàn),在絕大多數(shù)2D游戲

    2024年02月08日
    瀏覽(19)
  • 實(shí)現(xiàn)3D人物的移動(dòng)和旋轉(zhuǎn)。(Unity)

    實(shí)現(xiàn)3D人物的移動(dòng)和旋轉(zhuǎn)。(Unity)

    首先,需要在人物身上加剛體和碰撞器。 ? 如果需要人物身上有聲音,可以添加AudioSource音頻源。 ?然后創(chuàng)建腳本,需要把腳本掛載到對(duì)應(yīng)的對(duì)象身上。 如果有動(dòng)畫(huà),還需要?jiǎng)?chuàng)建狀態(tài)機(jī)添加到對(duì)應(yīng)的對(duì)象上面,并且設(shè)置好里面的動(dòng)畫(huà)。 ?代碼實(shí)現(xiàn): 圖片實(shí)現(xiàn): ? ? 上面代碼

    2024年02月04日
    瀏覽(22)
  • Unity 3D 人物移動(dòng)朝向跟隨攝像機(jī)(第一人稱(chēng))

    Unity 3D 人物移動(dòng)朝向跟隨攝像機(jī)(第一人稱(chēng))

    以人物身體旋轉(zhuǎn)控制鏡頭左右滑動(dòng) 以攝像機(jī)旋轉(zhuǎn)控制鏡頭上下滑動(dòng) 首先我們要知道 攝像機(jī)是作為人物的子物體的(充當(dāng)眼睛) 所以當(dāng)人物旋轉(zhuǎn)時(shí) 攝像機(jī)會(huì)跟隨它朝相同的方向旋轉(zhuǎn)相同的角度 從而達(dá)到 眼睛(攝像機(jī))注視的方向一定是人物的正前方 那么這樣做有什么好處

    2024年02月21日
    瀏覽(26)
  • Unity3D方向鍵控制人物移動(dòng)的代碼

    也可以換成 Translate 函數(shù)默認(rèn)模式是 Space.Self ,此時(shí)移動(dòng)方向需要為人物坐標(biāo)系下的人物前進(jìn)方向 Vector3(0, 0, 1) ;如果模式指定為 Space.World ,移動(dòng)方向應(yīng)該為世界坐標(biāo)系下的人物前進(jìn)方向 transform.forward , transform.forward 在人物轉(zhuǎn)向過(guò)程中會(huì)改變。如果不注意這個(gè)問(wèn)題,人物轉(zhuǎn)

    2024年02月11日
    瀏覽(34)
  • Unity Audio -- (3)創(chuàng)建3D音效

    Unity Audio -- (3)創(chuàng)建3D音效

    ? ? ? ? 本節(jié)會(huì)添加場(chǎng)景中小瀑布的音效。小瀑布的音效會(huì)有一個(gè)作用范圍,也會(huì)根據(jù)角色所處的位置不同,產(chǎn)生不同的效果。 ? ? ? ? 1. 在Hierarchy中,點(diǎn)擊右鍵,選擇Audio - Create Audio Source,將這個(gè)新的Audio Source名字設(shè)為“Waterfall Audio”。 ? ? ? ? 2. 在場(chǎng)景試圖中,移動(dòng)A

    2024年02月08日
    瀏覽(26)
  • Unity 2D橫版移動(dòng)跳躍

    Unity 2D橫版移動(dòng)跳躍

    ? 綠色 長(zhǎng)方形為地表, 紅色 圓形為玩家 地表掛載碰撞組件 ?玩家掛載鋼體組件和碰撞組件 ?將Collision Detection設(shè)置為Continuous,Constraints勾選Freeze Rotation Z; 在Player上創(chuàng)建名為MoveandJump的C#腳本

    2024年02月11日
    瀏覽(26)
  • Unity實(shí)現(xiàn)人物旋轉(zhuǎn)+移動(dòng)

    思路:首先要有個(gè)變量去記錄下操作前的一個(gè)方向狀態(tài)。(本次操作的對(duì)象是正面對(duì)著屏幕的。)然后還有有個(gè)變量去描述將要發(fā)生的方向。接著要明確,前和后,左和右是橫跨180°的,其他的兩兩是相差90°的。所以我們可以以90°一個(gè)單位去做旋轉(zhuǎn)。并且利用前面總結(jié)的方向

    2024年02月14日
    瀏覽(21)
  • Unity 原神人物移動(dòng)和鏡頭處理

    Unity 原神人物移動(dòng)和鏡頭處理

    每幀都處理的地方 不要用 SetTrigger 為什么呢? 你肯定會(huì)希望 SetTrigger run 就跑步 SetTrigger stop 就停止 但事實(shí)并非如此 SetTrigger 會(huì)在下一幀自動(dòng)設(shè)置回去 而你移動(dòng)肯定是每幀都在 SetTrigger 所以人物移動(dòng)會(huì)抽搐 最好的辦法是 設(shè)置float 分析原神的鏡頭 界面左側(cè)負(fù)責(zé)控制人物移動(dòng)

    2024年02月07日
    瀏覽(18)
  • Unity Animator人物模型動(dòng)畫(huà)移動(dòng)偏移

    Unity Animator人物模型動(dòng)畫(huà)移動(dòng)偏移

    模型動(dòng)畫(huà)出現(xiàn)移動(dòng)方向偏移 !修改Animation中的Root Transform Rotation(根變換位置)、Root Transform Rotation(x,y,z)(旋轉(zhuǎn)),Bake Info Pose修改為Original??梢越鉀Q ??!但是,使用動(dòng)畫(huà)移動(dòng)函數(shù)時(shí)將無(wú)法移動(dòng),原因是鎖定根變換位置和循環(huán)位置 !?。∷灾灰薷囊罁?jù)為原始或者微調(diào)偏離值,

    2024年02月15日
    瀏覽(26)
  • Unity中人物移動(dòng)的幾種方式

    Unity中人物移動(dòng)的幾種方式

    1.使用Transform組件 ? ? ? ? (1)transform.position(最基礎(chǔ),最常用): 這是通過(guò)上下左右鍵控制人物運(yùn)動(dòng)的方法 ?????????//獲取水平按鍵,左鍵或A 則值為-1f,右鍵或D 則值為1f ? ? ? ? horizontal = Input.GetAxis(\\\"Horizontal\\\"); ? ? ? ? //獲取垂直按鍵,上鍵或W 則值為-1f,下鍵或S 則

    2023年04月15日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包