unity2D横版游戏教程8-音效

这篇具有很好参考价值的文章主要介绍了unity2D横版游戏教程8-音效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单介绍一下unity audio,auido包括三个东西,分别是Aduio Listener,Audio Source,Audio Clips。Audio Listener就相当于耳朵,是用来听声音的,Audio Source就相当于播放器,一个音源,可以播放声音,具体播放什么声音就靠Audio Clips

通常Audio Listener只有一个,默认情况下Audio Listener就在Main Camera中,是固定的

unity2D横版游戏教程8-音效

 接下来就要在游戏场景中摆放各种声音的内容,然后播放让Audio Listener来听

所以我们要导入音频资源

unity2D横版游戏教程8-音效

 导入之后我们再导入一下bgm资源

unity2D横版游戏教程8-音效

 然后我们就要播放声音了

我们在Hierarchy栏创建一个空项目命名为SoundManager,我们用这个项目来管理我们游戏的所有音效

然后我们要写一下代码来控制声音,所以创建一个C#脚本命名为SoundManager,然后我们将这个脚本挂到空项目SoundManager上

unity2D横版游戏教程8-音效

 我们还需要给这SoundManager项目添加一个Audio Source来播放音效

我们让SoundManager项目可以挂载所有我们需要的声音效果,每当我使用某个音效的时候,我们将Audio Clip放到Audio Source里面然后将它播放,每切换到不同的声音时我们放进去不同的Audio Clip

unity2D横版游戏教程8-音效

 然后我们写一下代码,我们要先获得自身的Audio Source的引用,然后我们需要很多的Audio Clip来存储我们的音效,这里有跳跃的声音,受伤的声音,吃樱桃的声音,还有敌人死亡时的声音,敌人死亡的音效我们后面在单独做,我们这里主要针对人物来设置音效

unity2D横版游戏教程8-音效

 我们回到unity设置一下这几个引用

unity2D横版游戏教程8-音效

 有很多音效可以自己挑选

接下来我们创建不同的函数来将不同的音效输入到Audio Source播放

unity2D横版游戏教程8-音效

 当我们人物跳跃或者吃到樱桃就会播放SoundManager脚本中的函数

怎么从playercontroller访问SoundManager的函数呢,前面我们消灭敌人那里我们是生成了一个Enemy的实例,然后获得自身的组件调用死亡函数。这里我们不这么做,因为这么做我们需要在三个地方执行这样的操作,这样不是很方便。

这里我们使用静态类的方法生成一个实例,然后在其他的代码就可以直接调用这个类中的函数了

我们先回到SoundManager类,我们要先将SoundManager这个类原地进行实例化,这样我们就可以用这个实体访问这个类中的所有函数

unity2D横版游戏教程8-音效

 我们这里创建了一个SoundManager静态实例的对象,然后我们在Awake函数里面将自身赋值给instance,这样instance就是自身的静态实例,可以访问SoundManager类的所有对象。

Awake函数与start函数类似,不过Awake函数会在start函数前调用,Awake函数是脚本对象实例化后被调用的,而start函数是在对象的第一帧调用的,这里就不细说了

然后我们在playercontroller设置一下播放时的代码

跳跃时音效

unity2D横版游戏教程8-音效

 吃到樱桃时的音效

unity2D横版游戏教程8-音效

 受到伤害时的音效

unity2D横版游戏教程8-音效

 这样就设置好了

还有背景音乐还没有设置,我们在SoundManager项目那里再创建一个Audio Source组件,我们把它的Audio Clip设置我们想要的bgm就行,循环播放记得勾选loop

unity2D横版游戏教程8-音效

 之后这个Audio Source我们就不用管了

下面我们把敌人死亡时的音效给添加上去,我们给Enemy_Frog添加一个AudioSource,选择合适的死亡音效添加到它的Audio Clip,记得把play on awake取消勾选,不然游戏一运行就会播放这个音效

unity2D横版游戏教程8-音效

 然后我们在Enemy脚本里面在死亡的函数里面播放这个音效即可

unity2D横版游戏教程8-音效

 这样就ok了,我们回到游戏里实验一下就行了

最后贴一下SoundManager,Enemy还有playercontroller的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager instance;//生成静态实例
    public AudioSource audioSource;//播放器
    public AudioClip hurtAudio, jumpAudio, cherryAudio;//不同的音效资源

    private void Awake()
    {
        instance = this;
    }

    //不同音效的函数
    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>();
    }

    //播放完死亡动画销毁敌人
    public void DeathFall()
    {
        Destroy(gameObject);
    }
    
    //关闭碰撞器
    public void Death()
    {
        //先把敌人的碰撞器关闭,这样敌人就可以掉下去了
        GetComponent<Collider2D>().enabled = false;
        //播放死亡动画
        anim.SetTrigger("death");
        //播放死亡音效
        deathSource.Play();
    }
}

 

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;//获得动画组件
    public float speed, jumpForce;//公开,设置速度和跳跃力
    public LayerMask ground;//获得地面图层
    public Transform groundCheck;//检测角色是否碰到地面
    private bool isJump, isGround;//判断是否按下空格键,判断是否在地面
    private int jumpCount;//用来设置角色是几段跳
    private int cherries;//计数变量
    public Text cherryText;//樱桃计数的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();
    }

    //基础移动
    void Movement()
    {
        float horizontal = Input.GetAxisRaw("Horizontal");
        rb.velocity = new Vector2(horizontal * speed, rb.velocity.y);//设置x轴的移动
        //设置角色的转向问题
        if (horizontal != 0)
        {
            transform.localScale = new Vector3(horizontal, 1, 1);
            anim.SetBool("run", true);
        }
        else
            anim.SetBool("run", false);
    }

    //跳跃
    void Jump()
    {
        //如果在地面设置二段跳
        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;
        }
    }

    //切换动画
    void SwitchAnim()
    {
        //如果在下落状态
        if (rb.velocity.y < 0 && !isGround)
        {
            anim.SetBool("fall", true);
            anim.SetBool("jump", false);
        }
        //如果在跳跃状态
        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();//调用父类函数
                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();
            }
        }
    }
}

如有错漏之处,敬请指正! 文章来源地址https://www.toymoban.com/news/detail-474362.html

到了这里,关于unity2D横版游戏教程8-音效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 6.Unity2D 横版 受击反馈+跟随血条+延时/延迟扣血+协程的应用

    总目录 https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482  1. 受击反馈 用 Unity 探究 2D 游戏的打击感_技术宅也爱玩游戏的博客-CSDN博客_unity击退 引言这是我毕业设计的一部分emmm……我的毕设和格斗游戏相关,而对于打击感的研究算是其中我比较在意的一环。现在

    2023年04月08日
    浏览(40)
  • 13.Unity2D 横版 可上下左右移动的双向平台(双向行走+可移动+单独判定)+随机平台生成

        总目录 https://blog.csdn.net/qq_54263076/category_11900070.html?spm=1001.2014.3001.5482 大多数平台教程全是碰撞体的可移动平台,并没有可跳上的平台,并且要求按下键会从平台上跳下来。有也只是通过控制平台的“2D平台效果碰撞体”组件的单向平台的旋转偏移来做,但是这样会 出现一

    2024年02月04日
    浏览(53)
  • Unity2d游戏项目--小狐狸

    (一) 在文件夹中找到back图片,并在检查器面板中将back图片的每单位像素数设置为16。 (文件所在地) (面板设置) (二) 将图片拖入到场景中 (一) 生成矩形的瓦片地图 (二) 打开平铺调色板 (三) 新建并命名为map,在原目录新建一个文件夹,用于存放你在这个瓦

    2024年02月03日
    浏览(37)
  • Unity2D绘制游戏地图

    首先,我们选择我们的地图素材(由于笔者在前段时间已经进行切割,最近才开始整理这一段,所以这个是用的老素材,可能有朋友就会觉得切割前后不一致,但是思路是一样的,大家学习思路即可)  接着,我们找到右上角的Slice进行图片切割,我这边简单介绍一下这个切

    2024年02月08日
    浏览(48)
  • Unity2D小狐狸教程笔记

    下载 https://unity.cn/releases 默认显示方式 window - layout - default SampleScene : Project - 文件目录 Scene -游戏画面 asset store - 素材商店 在asset store下载素材 sunnyland shift + sapace 放大窗口 1.背景导入 每个格子16像素: Pixels Per Unit 16px 2.绘制瓷砖式地图 新建瓦片图层:左上角/右键 2D object

    2024年01月24日
    浏览(47)
  • Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇)

    01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇) 01 Unity2D 回合制游戏案例 - 梦幻西游(第一季 战斗逻辑篇)【B站的第一季的部分视频】 02 Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇) 03 Unity2D 商业游戏案例《梦幻西游》(番外篇 - 场景系统) 。。。。。

    2024年02月05日
    浏览(117)
  • 【用unity实现100个游戏之14】Unity2d做一个建造与防御类rts游戏(附项目源码)

    【视频】:https://www.udemy.com/course/awesome-builder-defender-game-in-unity/?couponCode=CMCOURSEDEC23 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月05日
    浏览(59)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏4(附项目源码)

    本期紧接着上一篇,本期主要内容是实现商店、购买、出售、升级等功能。 新增TurretSettings 配置不同炮塔参数 绘制商店UI 新增TurretCard,渲染商品数据,如果前面有绘制价格文本,还可以渲染价格文本,这里我就偷懒不弄了 挂载脚本,并配置 新增TurretShopManager,商店管理器

    2024年01月21日
    浏览(62)
  • 【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏1(附项目源码)

    当今,塔防游戏已经成为游戏市场上备受欢迎的一类游戏类型。《保卫萝卜》作为其中的经典之作,深受玩家喜爱。本项目旨在基于《保卫萝卜》的玩法和特点,开发一个Unity2D塔防游戏,让玩家可以在游戏中体验到精彩的策略对抗与刺激的关卡挑战。 本项目将通过Unity引擎进

    2024年02月04日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包