閑談:
游戲開(kāi)發(fā)比普通軟件開(kāi)發(fā)難也是有原因的,第一 游戲功能需求變化多樣內(nèi)部邏輯交錯(cuò)縱橫, 而軟件相對(duì)固定,無(wú)非也就是點(diǎn)擊跳轉(zhuǎn)、數(shù)據(jù)存儲(chǔ) 第二,游戲需要很多3D數(shù)學(xué)知識(shí)、物理知識(shí),最起碼得有高中物理的基礎(chǔ),力、向量、射線,除了這些數(shù)據(jù)存儲(chǔ)一樣不少
但是,心態(tài)要放平,愚公移山樂(lè)此不疲的態(tài)度,一點(diǎn)點(diǎn)加,一點(diǎn)點(diǎn)玩就行了!現(xiàn)查現(xiàn)學(xué),現(xiàn)學(xué)現(xiàn)用,用完就忘是常態(tài)!
Unity 聲音控制要根據(jù)需求來(lái)說(shuō)。每個(gè)項(xiàng)目需求都不一樣!
今天實(shí)現(xiàn)一個(gè)撞金幣并且發(fā)出聲音的業(yè)務(wù)需求!
場(chǎng)景導(dǎo)入聲音到倉(cāng)庫(kù)
直接把聲音拖到Unity? 文件夾就行
然后播放聲音的實(shí)現(xiàn)需要兩個(gè)組件,一個(gè)是聽(tīng)到聲音組件,整個(gè)場(chǎng)景只能有一個(gè),一般都在攝像機(jī)掛在好了AudioListener
另一個(gè)就是AudioSource,這個(gè)組件就像一個(gè)播放器,里面指定一個(gè)聲音片段即可播放。也有對(duì)應(yīng)的類來(lái)控制它的一切。
當(dāng)你播放的聲音很多的時(shí)候,可以創(chuàng)建多個(gè)這樣的組件,也可以用一個(gè)組件,通過(guò)代碼切換Audioclip,來(lái)實(shí)現(xiàn)播放不同的聲音。但是也有些聲音需要同時(shí)播放,這些Unity 在類里面都考慮到了,Playoneshot()就是疊加播放。
簡(jiǎn)單了解對(duì)應(yīng)類
-
聲音組件AudioSource類(可以存儲(chǔ)聲音播放組件,用來(lái)播放和控制聲音)
-
AudioClip類 聲音片段(用來(lái)存儲(chǔ)音頻),將來(lái)可以賦值給AudioSource.clip實(shí)現(xiàn)音頻切換
一、播放聲音的函數(shù)
1.AudioSource.Play()
直接播放當(dāng)前AudioSource類對(duì)象中clip的內(nèi)容
// Assuming an AudioSource component is attached to the same GameObject
public class AudioPlayer : MonoBehaviour
{
private AudioSource audioSource;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
public void PlaySound()
{
if (audioSource.clip != null)
{
audioSource.Play();
}
}
}
AudioSource.clip 可以從外部賦值,也可以聲明變量,外部賦值,也可以用加載本地資源ResourceLoad()辦法賦值!
2下面這個(gè)代碼實(shí)現(xiàn),自己外部指定多個(gè)音頻,然后播放的時(shí)候切換音頻
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayAudio : MonoBehaviour
{
private AudioSource audioSource;
public AudioClip[] OneClip=new AudioClip[3];
void Start()
{
//獲取播放組件
audioSource = GetComponent<AudioSource>();
}
//這個(gè)函數(shù)將來(lái)關(guān)聯(lián)按鈕
public void PlaySound()
{
//把數(shù)組中存儲(chǔ)的聲音變量給聲音播放組件中作為默認(rèn)音頻
audioSource.clip = OneClip[0];
if (audioSource.clip != null)
{
audioSource.Play();//播放組件
}
}
}
2.PlayOneShot:
PlayOneShot 方法是 Unity AudioSource 類的一個(gè)函數(shù),它允許你在不中斷當(dāng)前正在播放的音頻的情況下播放一個(gè)音頻剪輯。這個(gè)方法特別適合用于播放短暫的聲音效果,如爆炸聲、點(diǎn)擊聲等。它接受兩個(gè)參數(shù):一個(gè) AudioClip 對(duì)象和一個(gè)可選的音量倍數(shù)(float 類型),這個(gè)音量倍數(shù)會(huì)乘以 AudioSource 的音量。例如,如果你有一個(gè)音效用于玩家的跳躍動(dòng)作,你可以使用 PlayOneShot 來(lái)播放這個(gè)跳躍音效,即使背景音樂(lè)已經(jīng)在用同一個(gè) AudioSource 播放。這樣,跳躍音效就會(huì)與背景音樂(lè)同時(shí)播放,而不會(huì)停止或替換背景音樂(lè)。
using UnityEngine;
public class SoundManager : MonoBehaviour
{
// 音頻源組件的引用
public AudioSource audioSource;
// 要播放的音頻剪輯
public AudioClip jumpSound;
void Start()
{
// 獲取當(dāng)前游戲?qū)ο笊系腁udioSource組件
audioSource = GetComponent<AudioSource>();
}
// 用于播放跳躍聲音的方法
public void PlayJumpSound()
{
// 使用PlayOneShot播放jumpSound音頻剪輯
// 第二個(gè)參數(shù)是可選的,用于調(diào)整播放音量,如果省略,默認(rèn)為1(即AudioSource的當(dāng)前音量)
audioSource.PlayOneShot(jumpSound, 1.0f);
}
}
在這個(gè)例子中,audioSource 是附加到同一個(gè)游戲?qū)ο笊系?AudioSource 組件的引用,jumpSound 是要播放的 AudioClip 對(duì)象。PlayJumpSound 方法通過(guò) PlayOneShot 方法播放 jumpSound 音效,并將音量設(shè)置為 AudioSource 的當(dāng)前音量。這種方式不會(huì)打斷任何當(dāng)前正在 AudioSource 上播放的音頻。
3.PlayClipAtPoint
PlayClipAtPoint 是 Unity 中的一個(gè)靜態(tài)方法,用于在 3D 空間的特定位置播放一個(gè)音頻剪輯(AudioClip),而不需要音頻源(AudioSource)組件。它會(huì)在指定位置創(chuàng)建一個(gè)臨時(shí)的 AudioSource,播放音頻一次,然后銷毀該 AudioSource。這個(gè)方法非常適合播放不需要細(xì)致控制的瞬時(shí)音效,如爆炸聲或玩家收集物品的聲音。
使用 PlayClipAtPoint 方法時(shí),你需要提供音頻剪輯和一個(gè) Vector3 位置。你還可以選擇提供一個(gè)音量參數(shù),但這不是必須的。這個(gè)方法會(huì)自動(dòng)處理音頻的播放和清理工作,使得你無(wú)需在場(chǎng)景中預(yù)先放置音頻源。
using UnityEngine;
public class AudioManager : MonoBehaviour
{
// 要播放的音頻剪輯
public AudioClip explosionSound;
// 在3D空間中的特定位置播放音頻剪輯
public void PlayExplosionSound(Vector3 position)
{
// 使用PlayClipAtPoint在指定位置播放explosionSound音頻剪輯
// 第二個(gè)參數(shù)是音頻的位置,第三個(gè)參數(shù)是可選的,用于調(diào)整音量,默認(rèn)值是1.0
AudioSource.PlayClipAtPoint(explosionSound, position, 1.0f);
}
}
在這段代碼中,我們有一個(gè)名為 explosionSound 的 AudioClip 變量。PlayExplosionSound 方法被調(diào)用時(shí),它將使用 PlayClipAtPoint 方法在指定的 position 位置播放 explosionSound 音效。這個(gè)方法自動(dòng)創(chuàng)建一個(gè)臨時(shí)的 AudioSource 來(lái)播放音效,并在音效播放結(jié)束后銷毀該 AudioSource。這種方式是處理不與特定游戲?qū)ο箨P(guān)聯(lián)的音效的理想選擇。
我的撞金幣案例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Collision222 : MonoBehaviour
{
// 克隆金幣
//掛在到主角上,分別檢測(cè) 金幣克隆區(qū)和障礙物克隆區(qū)
//讓主角去觸發(fā),金幣觸發(fā)器,如果觸發(fā)了就開(kāi)始克隆金幣
public GameObject CoinMuban;
GameObject TempTriggerCoin;
public Transform oneCoinParent;
public AudioClip coinSound; // 金幣音效,從外邊拖拽賦值
public AudioClip MonsterAudio;// 掉血音效,從外邊拖拽賦值
private void OnTriggerEnter(Collider other)//當(dāng)我觸發(fā)到別人 就把別人的碰撞器存在other里面
{
TempTriggerCoin = other.transform.gameObject;
if (other.transform.gameObject.name== "TriggerCoin01")
{
CloneCoin();//開(kāi)始克隆金幣
}
if (other.transform.gameObject.name == "TriggerStru")
{
CloneStruction();//開(kāi)始克隆障礙物
}
if (other.transform.gameObject.tag == "Coin")
{
//開(kāi)始加分
Debug.Log("開(kāi)始加分");
Destroy(other.transform.gameObject);
AudioSource.PlayClipAtPoint(coinSound, other.transform.position);//臨時(shí)播放,完畢銷毀
}
if (other.transform.gameObject.tag == "Monster")
{
//開(kāi)始加分
Debug.Log("開(kāi)始掉血");
}
}
void CloneCoin()
{
for (int i = 0; i < 10; i++)
{
Vector3 clonePos = new Vector3(156, 0.5f, TempTriggerCoin.transform.position.z + 50+i*3);
Debug.Log("開(kāi)始克隆金幣");
GameObject.Instantiate(CoinMuban, clonePos, Quaternion.Euler(0, 0, 0), oneCoinParent);
}
}
void CloneStruction()
{
Debug.Log("開(kāi)始克隆障礙物");
}
}
二、 多個(gè)聲音播放?
1.創(chuàng)建多個(gè)AudioSource組件,每個(gè)組件播放自己的clip 片段
2.多個(gè)聲音Clip,但是只有一個(gè)AudioSource組件
可以用AudioSource類中公共方法修改當(dāng)前組件的聲音片段。?
AudioSource?audioSource;
核心代碼:
audioSource.clip = clip1;
?audioSource.clip = clip2;
using UnityEngine;
public class PlayMultipleAudioClips : MonoBehaviour
{
public AudioSource audioSource; // 你的AudioSource組件
public AudioClip clip1; // 第一個(gè)聲音片段
public AudioClip clip2; // 第二個(gè)聲音片段
void Start()
{
// 播放第一個(gè)聲音片段
PlaySound(clip1, 0); // 0表示從頭開(kāi)始播放
// 在3秒后播放第二個(gè)聲音片段
Invoke("PlaySecondSound", clip1.length + 3.0f); // 在第一個(gè)聲音片段播放結(jié)束后3秒播放第二個(gè)聲音片段
}
void PlaySound(AudioClip clip, float startTime)
{
audioSource.clip = clip;
audioSource.time = startTime;
audioSource.Play();
}
void PlaySecondSound()
{
PlaySound(clip2, 0); // 從頭開(kāi)始播放第二個(gè)聲音片段
}
}
三、播放視頻
視頻的播放和聲音播放極其類似!區(qū)別是視頻播放不需要偵聽(tīng)組件,直接一個(gè)VideoPlayer(就是播放器組件)完成。
但是視頻需要一個(gè)宿主,幫助渲染視頻(這個(gè)宿主可以是3D物體、也可以是UGUI-RawImage)
視頻播放在3D物體上:比如我們應(yīng)該首先創(chuàng)建一個(gè)游戲物體,確保這個(gè)物體有Rendener組件,正常渲染。然后給這個(gè)游戲物體添加VideoPlayer組件即可。這個(gè)組件可以給任何人!
在UGUI上創(chuàng)建視頻
首先創(chuàng)建RawImage UI物體,然后添加視頻組件
把視頻片段拖上去之后,創(chuàng)建一個(gè)可以渲染視頻的New Render Texture
這個(gè)渲染類型的貼圖,既需要渲染視頻,作為Video Player組件的渲染器,也作為Rawimage組件的貼圖。分別拖到為Video Player組件的Target Texture中,然后拖到Raw Image組件上的Texture中!
這樣就完成了在UI上播放視頻!
剩下的和聲音幾乎一致了!?
拖一個(gè)視頻到Assets 中,直接賦值給組件Video Clip 即可!現(xiàn)在游戲運(yùn)行就可以播放了!
代碼控制:
代碼可以實(shí)現(xiàn)切換不同的視頻進(jìn)行播放。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-826267.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
public class PlayVideo : MonoBehaviour
{
// Start is called before the first frame update
public VideoClip[] SomeVideo = new VideoClip[10];
VideoPlayer OneVideoComp;
void Start()
{
OneVideoComp = this.GetComponent<VideoPlayer>();
OneVideoComp.frame = 10;
}
private void Update()
{
Debug.Log(OneVideoComp.frameCount/25);
}
//下面函數(shù)關(guān)聯(lián)外部UGUI按鈕
public void ButtonClikA()
{
OneVideoComp.clip = SomeVideo[0];
OneVideoComp.Play();
}
public void ButtonClikB()
{
OneVideoComp.clip = SomeVideo[1];
OneVideoComp.Play();
}
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826267.html
到了這里,關(guān)于【Unity聲音與視頻播放】播放聲音視頻、代碼控制、UI播放視頻的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!