簡(jiǎn)單介紹一下unity audio,auido包括三個(gè)東西,分別是Aduio Listener,Audio Source,Audio Clips。Audio Listener就相當(dāng)于耳朵,是用來(lái)聽聲音的,Audio Source就相當(dāng)于播放器,一個(gè)音源,可以播放聲音,具體播放什么聲音就靠Audio Clips
通常Audio Listener只有一個(gè),默認(rèn)情況下Audio Listener就在Main Camera中,是固定的
?接下來(lái)就要在游戲場(chǎng)景中擺放各種聲音的內(nèi)容,然后播放讓Audio Listener來(lái)聽
所以我們要導(dǎo)入音頻資源
?導(dǎo)入之后我們?cè)賹?dǎo)入一下bgm資源
?然后我們就要播放聲音了
我們?cè)贖ierarchy欄創(chuàng)建一個(gè)空項(xiàng)目命名為SoundManager,我們用這個(gè)項(xiàng)目來(lái)管理我們游戲的所有音效
然后我們要寫一下代碼來(lái)控制聲音,所以創(chuàng)建一個(gè)C#腳本命名為SoundManager,然后我們將這個(gè)腳本掛到空項(xiàng)目SoundManager上
?我們還需要給這SoundManager項(xiàng)目添加一個(gè)Audio Source來(lái)播放音效
我們讓SoundManager項(xiàng)目可以掛載所有我們需要的聲音效果,每當(dāng)我使用某個(gè)音效的時(shí)候,我們將Audio Clip放到Audio Source里面然后將它播放,每切換到不同的聲音時(shí)我們放進(jìn)去不同的Audio Clip
?然后我們寫一下代碼,我們要先獲得自身的Audio Source的引用,然后我們需要很多的Audio Clip來(lái)存儲(chǔ)我們的音效,這里有跳躍的聲音,受傷的聲音,吃櫻桃的聲音,還有敵人死亡時(shí)的聲音,敵人死亡的音效我們后面在單獨(dú)做,我們這里主要針對(duì)人物來(lái)設(shè)置音效
?我們回到unity設(shè)置一下這幾個(gè)引用
?有很多音效可以自己挑選
接下來(lái)我們創(chuàng)建不同的函數(shù)來(lái)將不同的音效輸入到Audio Source播放
?當(dāng)我們?nèi)宋锾S或者吃到櫻桃就會(huì)播放SoundManager腳本中的函數(shù)
怎么從playercontroller訪問(wèn)SoundManager的函數(shù)呢,前面我們消滅敵人那里我們是生成了一個(gè)Enemy的實(shí)例,然后獲得自身的組件調(diào)用死亡函數(shù)。這里我們不這么做,因?yàn)檫@么做我們需要在三個(gè)地方執(zhí)行這樣的操作,這樣不是很方便。
這里我們使用靜態(tài)類的方法生成一個(gè)實(shí)例,然后在其他的代碼就可以直接調(diào)用這個(gè)類中的函數(shù)了
我們先回到SoundManager類,我們要先將SoundManager這個(gè)類原地進(jìn)行實(shí)例化,這樣我們就可以用這個(gè)實(shí)體訪問(wèn)這個(gè)類中的所有函數(shù)
?我們這里創(chuàng)建了一個(gè)SoundManager靜態(tài)實(shí)例的對(duì)象,然后我們?cè)贏wake函數(shù)里面將自身賦值給instance,這樣instance就是自身的靜態(tài)實(shí)例,可以訪問(wèn)SoundManager類的所有對(duì)象。
Awake函數(shù)與start函數(shù)類似,不過(guò)Awake函數(shù)會(huì)在start函數(shù)前調(diào)用,Awake函數(shù)是腳本對(duì)象實(shí)例化后被調(diào)用的,而start函數(shù)是在對(duì)象的第一幀調(diào)用的,這里就不細(xì)說(shuō)了
然后我們?cè)趐layercontroller設(shè)置一下播放時(shí)的代碼
跳躍時(shí)音效
?吃到櫻桃時(shí)的音效
?受到傷害時(shí)的音效
?這樣就設(shè)置好了
還有背景音樂(lè)還沒(méi)有設(shè)置,我們?cè)赟oundManager項(xiàng)目那里再創(chuàng)建一個(gè)Audio Source組件,我們把它的Audio Clip設(shè)置我們想要的bgm就行,循環(huán)播放記得勾選loop
?之后這個(gè)Audio Source我們就不用管了
下面我們把敵人死亡時(shí)的音效給添加上去,我們給Enemy_Frog添加一個(gè)AudioSource,選擇合適的死亡音效添加到它的Audio Clip,記得把play on awake取消勾選,不然游戲一運(yùn)行就會(huì)播放這個(gè)音效
?然后我們?cè)贓nemy腳本里面在死亡的函數(shù)里面播放這個(gè)音效即可
?這樣就ok了,我們回到游戲里實(shí)驗(yàn)一下就行了
最后貼一下SoundManager,Enemy還有playercontroller的代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundManager : MonoBehaviour
{
public static SoundManager instance;//生成靜態(tài)實(shí)例
public AudioSource audioSource;//播放器
public AudioClip hurtAudio, jumpAudio, cherryAudio;//不同的音效資源
private void Awake()
{
instance = this;
}
//不同音效的函數(shù)
public void JumpAudio()
{
audioSource.clip = jumpAudio;
audioSource.Play();
}
public void HurtAudio()
{
audioSource.clip = hurtAudio;
audioSource.Play();
}
public void CherryAudio()
{
audioSource.clip = cherryAudio;
audioSource.Play();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : MonoBehaviour
{
protected Animator anim;
private AudioSource deathSource;
protected virtual void Start()
{
anim = GetComponent<Animator>();
deathSource = GetComponent<AudioSource>();
}
//播放完死亡動(dòng)畫銷毀敵人
public void DeathFall()
{
Destroy(gameObject);
}
//關(guān)閉碰撞器
public void Death()
{
//先把敵人的碰撞器關(guān)閉,這樣敵人就可以掉下去了
GetComponent<Collider2D>().enabled = false;
//播放死亡動(dòng)畫
anim.SetTrigger("death");
//播放死亡音效
deathSource.Play();
}
}
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-474362.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class playercontroller : MonoBehaviour
{
private Rigidbody2D rb;//獲得Rigidbody2D組件
private Collider2D coll;//獲得Collider2D組件
private Animator anim;//獲得動(dòng)畫組件
public float speed, jumpForce;//公開,設(shè)置速度和跳躍力
public LayerMask ground;//獲得地面圖層
public Transform groundCheck;//檢測(cè)角色是否碰到地面
private bool isJump, isGround;//判斷是否按下空格鍵,判斷是否在地面
private int jumpCount;//用來(lái)設(shè)置角色是幾段跳
private int cherries;//計(jì)數(shù)變量
public Text cherryText;//櫻桃計(jì)數(shù)的UI組件
private bool isHurt;//受擊判斷
//初始化
void Start()
{
rb = GetComponent<Rigidbody2D>();
coll = GetComponent<Collider2D>();
anim = GetComponent<Animator>();
}
void Update()
{
//如果按下空格鍵并且在地面上
if (Input.GetKeyDown(KeyCode.Space) && jumpCount > 0)
{
isJump = true;
}
}
private void FixedUpdate()
{
isGround = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);
if(!isHurt)
{
Movement();
}
Jump();
SwitchAnim();
}
//基礎(chǔ)移動(dòng)
void Movement()
{
float horizontal = Input.GetAxisRaw("Horizontal");
rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);//設(shè)置x軸的移動(dòng)
//設(shè)置角色的轉(zhuǎn)向問(wèn)題
if (horizontal != 0)
{
transform.localScale = new Vector3(horizontal, 1, 1);
anim.SetBool("run", true);
}
else
anim.SetBool("run", false);
}
//跳躍
void Jump()
{
//如果在地面設(shè)置二段跳
if (isGround)
{
jumpCount = 2;
}
//按下跳躍鍵且在地面上
if (isJump && isGround)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
SoundManager.instance.JumpAudio();
jumpCount--;
isJump = false;
}
//按下跳躍鍵且不在地面上且jumpCount大于0
else if (isJump && !isGround && jumpCount > 0)
{
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
SoundManager.instance.JumpAudio();
jumpCount--;
isJump = false;
}
}
//切換動(dòng)畫
void SwitchAnim()
{
//如果在下落狀態(tài)
if (rb.velocity.y < 0 && !isGround)
{
anim.SetBool("fall", true);
anim.SetBool("jump", false);
}
//如果在跳躍狀態(tài)
if (!isGround && rb.velocity.y > 0)
{
anim.SetBool("jump", true);
}
//如果人物受擊
else if (isHurt)
{
anim.SetBool("hurt", true);
if (Mathf.Abs(rb.velocity.x) < 0.1f)
{
anim.SetBool("hurt", false);
isHurt = false;
}
}
//如果在地面上
else if (coll.IsTouchingLayers(ground))
{
anim.SetBool("fall", false);
}
}
//判斷是否碰到物品
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag=="Collection")
{
Destroy(collision.gameObject);
cherries++;
cherryText.text = "櫻桃:" + cherries;
SoundManager.instance.CherryAudio();
}
}
//消滅敵人
private void OnCollisionEnter2D(Collision2D collision)
{
//判斷是否碰到敵人
if(collision.gameObject.tag=="Enemy")
{
//消滅敵人
Enemy enemy = collision.gameObject.GetComponent <Enemy>();//獲得敵人父類引用
if(anim.GetBool("fall"))//判斷是否下落跳到敵人頭上消滅敵人
{
enemy.Death();//調(diào)用父類函數(shù)
rb.velocity = new Vector2(rb.velocity.x, jumpForce);
anim.SetBool("jump", true);
}
//如果人物在敵人的左邊
else if(transform.position.x<collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(-8, rb.velocity.y);
isHurt = true;
SoundManager.instance.HurtAudio();
}
//如果人物在敵人的右邊
else if(transform.position.x>collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(8, rb.velocity.y);
isHurt = true;
SoundManager.instance.HurtAudio();
}
}
}
}
如有錯(cuò)漏之處,敬請(qǐng)指正!?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-474362.html
到了這里,關(guān)于unity2D橫版游戲教程8-音效的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!