unity制作捕鱼达人

这篇具有很好参考价值的文章主要介绍了unity制作捕鱼达人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


介绍

水波荡漾的特效
鱼有多种运动轨迹
每隔一段时间自动收集金币
可以切换不同的炮台
升级后有不同的特效
捕捉到普通鱼类有金币特效
捕捉到大金鱼后有特效
playerprefs存档读档
unity制作捕鱼达人


制作水波特效

unity制作捕鱼达人

新建一个面板Plane

unity制作捕鱼达人

新建一个材质球,设置为Legacy Shaders/Particles/Additive
unity制作捕鱼达人

添加脚本:

using UnityEngine;

public class Ef_WaterWave : MonoBehaviour
{
    public Texture[] textures;  // 存储多个纹理的数组
    private Material material;  // 存储材质的变量
    private int index = 0;  // 纹理索引

    void Start()
    {
        // 获取当前对象上的MeshRenderer组件,并将其材质赋值给material变量
        material = GetComponent<MeshRenderer>().material;

        // 每隔0.1秒调用ChangeTexture方法
        InvokeRepeating("ChangeTexture", 0, 0.1f);
    }

    void ChangeTexture()
    {
        // 将当前纹理数组textures中的纹理赋值给材质的mainTexture属性
        material.mainTexture = textures[index];

        // 更新纹理索引,当索引超过纹理数组长度时,将索引重置为0
        index = (index + 1) % textures.Length;
    }
}


制作多种ui

unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人


制作不同种类鱼的动画

unity制作捕鱼达人

unity制作捕鱼达人


鱼的多种移动效果

unity制作捕鱼达人

鱼儿可以直着走、弯着走

using UnityEngine;                     // 引入UnityEngine命名空间

using System.Collections;            // 引入System.Collections命名空间

public class FishMaker : MonoBehaviour   // 定义一个名为FishMaker的类并继承MonoBehaviour
{
    public Transform fishHolder;        // 定义一个Transform类型的公共变量fishHolder,用于存储生成的鱼
    public Transform[] genPositions;    // 定义一个Transform数组类型的公共变量genPositions,用于存储生成鱼的位置
    public GameObject[] fishPrefabs;    // 定义一个GameObject数组类型的公共变量fishPrefabs,用于存储不同种类的鱼的预制体

    public float fishGenWaitTime = 0.5f;    // 定义一个公共浮点型变量fishGenWaitTime,用于控制生成鱼的时间间隔
    public float waveGenWaitTime = 0.3f;    // 定义一个公共浮点型变量waveGenWaitTime,用于控制每次生成鱼的时间间隔

    void Start()                         // Start方法,用于在游戏开始时执行初始化逻辑
    {
        InvokeRepeating("MakeFishes", 0, waveGenWaitTime);    // 重复调用MakeFishes方法,0表示不延迟,waveGenWaitTime表示每次调用之间的时间间隔
    }

    void MakeFishes()                   // MakeFishes方法,用于生成鱼
    {
        int genPosIndex = Random.Range(0, genPositions.Length);    // 随机生成一个0到genPositions.Length-1之间的整数,作为生成鱼的位置的索引
        int fishPreIndex = Random.Range(0, fishPrefabs.Length);    // 随机生成一个0到fishPrefabs.Length-1之间的整数,作为生成鱼的预制体的索引
        int maxNum = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxNum;    // 获取生成鱼预制体的FishAttr组件中的最大数量
        int maxSpeed = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxSpeed;    // 获取生成鱼预制体的FishAttr组件中的最大速度
        int num = Random.Range((maxNum / 2) + 1, maxNum);    // 随机生成一个最大数量的一半到最大数量之间的整数,作为生成鱼的数量
        int speed = Random.Range(maxSpeed / 2, maxSpeed);    // 随机生成一个最大速度的一半到最大速度之间的整数,作为生成鱼的速度
        int moveType = Random.Range(0, 2);    // 随机生成一个0或1,0表示直走,1表示转弯
        int angOffset;    // 定义一个整型变量angOffset,表示直走时的倾斜角
        int angSpeed;     // 定义一个整型变量angSpeed,表示转弯时的角速度

        if (moveType == 0)    // 如果moveType等于0,表示生成直走的鱼
        {
            angOffset = Random.Range(-22, 22);    // 随机生成一个-22到22之间的整数,表示直走的倾斜角
            StartCoroutine(GenStraightFish(genPosIndex, fishPreIndex, num, speed, angOffset));    // 使用协程生成直走的鱼
        }
        else    // 如果moveType等于1,表示生成转弯的鱼
        {
            if (Random.Range(0, 2) == 0)    // 随机生成一个0或1,表示是否取负的角速度
            {
                angSpeed = Random.Range(-15, -9);    // 随机生成一个-15到-9之间的整数,作为角速度
            }
            else
            {
               angSpeed = Random.Range(9, 15);    // 随机生成一个9到15之间的整数,作为角速度
            }
            StartCoroutine(GenTrunFish(genPosIndex, fishPreIndex, num, speed, angSpeed));    // 使用协程生成转弯的鱼
        }
    }

    IEnumerator GenStraightFish(int genPosIndex,int fishPreIndex,int num,int speed,int angOffset)    // 生成直走的鱼的协程
    {
        for (int i = 0; i < num; i++)    // 循环生成指定数量的鱼
        {
            GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);    // 生成鱼的实例
            fish.transform.SetParent(fishHolder, false);    // 设置鱼的父物体为fishHolder
            fish.transform.localPosition = genPositions[genPosIndex].localPosition;    // 设置鱼的初始位置为指定的生成位置的本地位置
            fish.transform.localRotation = genPositions[genPosIndex].localRotation;    // 设置鱼的初始角度为指定的生成位置的本地角度
            fish.transform.Rotate(0, 0, angOffset);    // 将鱼绕z轴旋转指定的倾斜角
            fish.GetComponent<SpriteRenderer>().sortingOrder += i;    // 设置鱼的渲染层级
            fish.AddComponent<Ef_AutoMove>().speed = speed;    // 添加Ef_AutoMove组件,并设置移动速度
            yield return new WaitForSeconds(fishGenWaitTime);    // 等待指定的时间后再生成下一条鱼
        }
    }

    IEnumerator GenTrunFish(int genPosIndex, int fishPreIndex, int num, int speed, int angSpeed)    // 生成转弯的鱼的协程
    {
        for (int i = 0; i < num; i++)    // 循环生成指定数量的鱼
        {
            GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);    // 生成鱼的实例
            fish.transform.SetParent(fishHolder, false);    // 设置鱼的父物体为fishHolder
            fish.transform.localPosition = genPositions[genPosIndex].localPosition;    // 设置鱼的初始位置为指定的生成位置的本地位置
            fish.transform.localRotation = genPositions[genPosIndex].localRotation;    // 设置鱼的初始角度为指定的生成位置的本地角度
            fish.GetComponent<SpriteRenderer>().sortingOrder += i;    // 设置鱼的渲染层级
            fish.AddComponent<Ef_AutoMove>().speed = speed;    // 添加Ef_AutoMove组件,并设置移动速度
            fish.AddComponent<Ef_AutoRotate>().speed = angSpeed;    // 添加Ef_AutoRotate组件,并设置旋转速度
            yield return new WaitForSeconds(fishGenWaitTime);    // 等待指定的时间后再生成下一条鱼
        }
    }
}
using UnityEngine;

public class Ef_AutoRotate : MonoBehaviour
{
    public float speed = 10f;

    void Update()
    {
        transform.Rotate(Vector3.forward, speed * Time.deltaTime);
    }
}

using UnityEngine;

public class Ef_AutoMove : MonoBehaviour
{
    public float speed = 1f;
    public Vector3 dir = Vector3.right;

    void Update()
    {
        transform.Translate(dir * speed * Time.deltaTime);
    }
}


制作鱼的生成点

unity制作捕鱼达人

这段代码主要实现了生成不同类型的鱼,并让它们在屏幕上游动。

函数功能简介:

  • Start():在游戏开始时调用,通过InvokeRepeating函数定时调用MakeFishes函数生成鱼。
  • MakeFishes():随机生成不同种类的鱼,并根据鱼的属性生成不同运动轨迹的鱼。
  • GenStraightFish():生成直走的鱼,每生成一条鱼就等待一定时间,然后再生成下一条鱼。
  • GenTrunFish():生成转弯的鱼,每生成一条鱼就等待一定时间,然后再生成下一条鱼。

变量功能简介:

  • fishHolder:存放生成的鱼的父物体。
  • genPositions:存放生成鱼的位置的数组。
  • fishPrefabs:存放不同种类鱼的预制体的数组。
  • fishGenWaitTime:生成鱼的间隔时间。
  • waveGenWaitTime:生成不同类型鱼的间隔时间。
using UnityEngine;
using System.Collections;

public class FishMaker : MonoBehaviour
{
    public Transform fishHolder;                // 鱼的父物体
    public Transform[] genPositions;            // 生成鱼的位置数组
    public GameObject[] fishPrefabs;            // 鱼的预制体数组

    public float fishGenWaitTime = 0.5f;        // 生成鱼的等待时间
    public float waveGenWaitTime = 0.3f;        // 波次生成的等待时间

    void Start()
    {
        InvokeRepeating("MakeFishes", 0, waveGenWaitTime);     // 开始重复调用MakeFishes方法
    }

    void MakeFishes()
    {
        int genPosIndex = Random.Range(0, genPositions.Length);        // 随机生成位置的索引
        int fishPreIndex = Random.Range(0, fishPrefabs.Length);        // 随机鱼的预制体的索引
        int maxNum = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxNum;       // 获取最大数量
        int maxSpeed = fishPrefabs[fishPreIndex].GetComponent<FishAttr>().maxSpeed;   // 获取最大速度
        int num = Random.Range((maxNum / 2) + 1, maxNum);              // 随机生成数量
        int speed = Random.Range(maxSpeed / 2, maxSpeed);               // 随机生成速度
        int moveType = Random.Range(0, 2);                              // 随机生成移动类型,0:直走;1:转弯
        int angOffset;                                                  // 仅直走生效,直走的倾斜角
        int angSpeed;                                                   // 仅转弯生效,转弯的角速度

        if (moveType == 0)
        {
            angOffset = Random.Range(-22, 22);                          // 随机生成倾斜角
            StartCoroutine(GenStraightFish(genPosIndex, fishPreIndex, num, speed, angOffset));   // 开始生成直走的鱼
        }
        else
        {
            if (Random.Range(0, 2) == 0)        // 是否取负的角速度
            {
                angSpeed = Random.Range(-15, -9);       // 随机生成负的角速度
            }
            else
            {
                angSpeed = Random.Range(9, 15);         // 随机生成正的角速度
            }
            StartCoroutine(GenTrunFish(genPosIndex, fishPreIndex, num, speed, angSpeed));    // 开始生成转弯的鱼
        }
    }

    IEnumerator GenStraightFish(int genPosIndex, int fishPreIndex, int num, int speed, int angOffset)
    {
        for (int i = 0; i < num; i++)
        {
            GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);         // 实例化鱼的预制体
            fish.transform.SetParent(fishHolder, false);                      // 设置鱼的父物体
            fish.transform.localPosition = genPositions[genPosIndex].localPosition;     // 设置鱼的本地位置
            fish.transform.localRotation = genPositions[genPosIndex].localRotation;     // 设置鱼的本地旋转
            fish.transform.Rotate(0, 0, angOffset);                            // 对鱼进行倾斜角旋转
            fish.GetComponent<SpriteRenderer>().sortingOrder += i;            // 设置鱼的渲染层级
            fish.AddComponent<Ef_AutoMove>().speed = speed;                     // 添加自动移动组件并设置速度
            yield return new WaitForSeconds(fishGenWaitTime);                  // 等待一段时间后继续生成下一条鱼
        }
    }

    IEnumerator GenTrunFish(int genPosIndex, int fishPreIndex, int num, int speed, int angSpeed)
    {
        for (int i = 0; i < num; i++)
        {
            GameObject fish = Instantiate(fishPrefabs[fishPreIndex]);          // 实例化鱼的预制体
            fish.transform.SetParent(fishHolder, false);                       // 设置鱼的父物体
            fish.transform.localPosition = genPositions[genPosIndex].localPosition;      // 设置鱼的本地位置
            fish.transform.localRotation = genPositions[genPosIndex].localRotation;      // 设置鱼的本地旋转
            fish.GetComponent<SpriteRenderer>().sortingOrder += i;             // 设置鱼的渲染层级
            fish.AddComponent<Ef_AutoMove>().speed = speed;                      // 添加自动移动组件并设置速度
            fish.AddComponent<Ef_AutoRotate>().speed = angSpeed;                 // 添加自动旋转组件并设置角速度
            yield return new WaitForSeconds(fishGenWaitTime);                   // 等待一段时间后继续生成下一条鱼
        }
    }
}


多种炮台

多种炮台,点击按钮进行升级

unity制作捕鱼达人

unity制作捕鱼达人

unity制作捕鱼达人

unity制作捕鱼达人
unity制作捕鱼达人


多种子弹

升级后,子弹也会升级,伤害更高。

unity制作捕鱼达人


多种网

升级后,渔网的大小和形状也会升级,范围更大、消失时间更长

unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人
unity制作捕鱼达人

unity制作捕鱼达人


游戏控制器

游戏控制器(GameController)的脚本,负责管理游戏的各种逻辑和UI元素。

该脚本的功能和作用如下:

声明了GameController的单例模式,提供对唯一实例的访问。
声明了一系列用于显示UI的文本、按钮和滑动条等元素。
定义了一些游戏的变量,如等级(lv)、经验值(exp)、金币(gold)、倒计时等等。
声明了一些用于显示游戏背景、特效和子弹的元素,如背景图片(bgImage)、特效(fireEffect、changeEffect等)、子弹对象数组等。
在Awake函数中初始化GameController的实例。
在Start函数中读取之前保存的游戏数据,并更新UI的显示。
在Update函数中更新游戏逻辑,包括切换子弹的花费、开火、更新UI、切换背景等。
定义了ChangeBg函数,用于根据当前等级切换游戏背景。
定义了UpdateUI函数,用于更新游戏UI的显示,包括倒计时、金币、等级等。
定义了Fire函数,用于处理开火逻辑,生成子弹并扣除金币。
定义了ChangeBulletCost函数,用于根据鼠标滚轮的输入切换子弹花费。
定义了一些按钮的回调函数,如OnButtonPDown和OnButtonMDown,用于切换子弹花费。
定义了OnBigCountdownButtonDown函数,用于处理大倒计时按钮的点击事件。
定义了GoldNotEnough协程函数,用于在金币不足时显示提示信息。

该脚本是一个游戏控制器,负责管理游戏的逻辑、UI和各种元素的显示和交互。它处理了游戏中的等级、经验、金币、倒计时、背景切换、开火等功能,并提供了与UI元素交互的回调函数。

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class GameController : MonoBehaviour
{
    private static GameController _instance;
    public static GameController Instance
    {
        get
        {
            return _instance;
        }
    }

    // UI 元素的引用
    public Text oneShootCostText; // 显示一次射击的花费
    public Text goldText; // 显示金币数量
    public Text lvText; // 显示等级
    public Text lvNameText; // 显示等级名称
    public Text smallCountdownText; // 显示小倒计时
    public Text bigCountdownText; // 显示大倒计时
    public Button bigCountdownButton; // 大倒计时按钮
    public Button backButton; // 返回按钮
    public Button settingButton; // 设置按钮
    public Slider expSlider; // 经验条

    // 游戏状态变量
    public int lv = 0; // 等级
    public int exp = 0; // 经验值
    public int gold = 500; // 金币数量
    public const int bigCountdown = 240; // 大倒计时常量
    public const int smallCountdown = 60; // 小倒计时常量
    public float bigTimer = bigCountdown; // 大倒计时计时器
    public float smallTimer = smallCountdown; // 小倒计时计时器
    public Color goldColor; // 金币的颜色
    public int bgIndex = 0; // 背景索引

    // 引用的游戏对象和精灵数组
    public Image bgImage; // 背景图像
    public GameObject lvUpTips; // 升级提示
    public GameObject seaWaveEffect; // 海浪特效
    public GameObject fireEffect; // 开火特效
    public GameObject changeEffect; // 切换特效
    public GameObject lvEffect; // 升级特效
    public GameObject goldEffect; // 金币特效

    public Transform bulletHolder; // 子弹容器
    public Sprite[] bgSprites; // 背景精灵数组
    public GameObject[] gunGos; // 枪支游戏对象数组
    public GameObject[] bullet1Gos; // 炮弹1游戏对象数组
    public GameObject[] bullet2Gos; // 炮弹2游戏对象数组
    public GameObject[] bullet3Gos; // 炮弹3游戏对象数组
    public GameObject[] bullet4Gos; // 炮弹4游戏对象数组
    public GameObject[] bullet5Gos; // 炮弹5游戏对象数组

    // 使用的是第几档的炮弹
    private int costIndex = 0;
    // 每一炮所需的金币数和造成的伤害值
    private int[] oneShootCosts = { 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000 };
    private string[] lvName = { "新手", "入门", "钢铁", "青铜", "白银", "黄金", "白金", "钻石", "大师", "宗师" };

    void Awake()
    {
        // 单例模式
        _instance = this;
    }

    void Start()
    {
        // 从 PlayerPrefs 中获取存储的数据
        gold = PlayerPrefs.GetInt("gold", gold);
        lv = PlayerPrefs.GetInt("lv", lv);
        exp = PlayerPrefs.GetInt("exp", exp);
        smallTimer = PlayerPrefs.GetFloat("scd", smallCountdown);
        bigTimer = PlayerPrefs.GetFloat("bcd", bigCountdown);
        UpdateUI();
    }

    void Update()
    {
        // 更新各种状态和 UI
        ChangeBulletCost();
        Fire();
        UpdateUI();
        ChangeBg();
    }

    // 改变背景
    void ChangeBg()
    {
        if (bgIndex != lv / 20)
        {
            // 根据等级计算背景索引
            bgIndex = lv / 20;
            AudioManager.Instance.PlayEffectSound(AudioManager.Instance.seaWaveClip);
            Instantiate(seaWaveEffect);
            if (bgIndex >= 3)
            {
                bgImage.sprite = bgSprites[3];
            }
            else
            {
                bgImage.sprite = bgSprites[bgIndex];
            }
        }
    }

    // 更新 UI
    void UpdateUI()
    {
        bigTimer -= Time.deltaTime;
        smallTimer -= Time.deltaTime;
        if (smallTimer <= 0)
        {
            smallTimer = smallCountdown;
            gold += 50;
        }
        if (bigTimer <= 0 && bigCountdownButton.gameObject.activeSelf == false)
        {
            bigCountdownText.gameObject.SetActive(false);
            bigCountdownButton.gameObject.SetActive(true);
        }
        // 经验等级换算公式:升级所需经验=1000+200*当前等级
        while (exp >= 1000 + 200 * lv)
        {
            exp = exp - (1000 + 200 * lv);
            lv++;
            lvUpTips.SetActive(true);
            lvUpTips.transform.Find("Text").GetComponent<Text>().text = lv.ToString();
            StartCoroutine(lvUpTips.GetComponent<Ef_HideSelf>().HideSelf(0.6f));
            AudioManager.Instance.PlayEffectSound(AudioManager.Instance.lvUpClip);
            Instantiate(lvEffect);
        }
        goldText.text = "$" + gold;
        lvText.text = lv.ToString();
        if ((lv / 10) <= 9)
        {
            lvNameText.text = lvName[lv / 10];
        }
        else
        {
            lvNameText.text = lvName[9];
        }
        smallCountdownText.text = "  " + (int)smallTimer / 10 + "  " + (int)smallTimer % 10;
        bigCountdownText.text = (int)bigTimer + "s";
        expSlider.value = ((float)exp) / (1000 + 200 * lv);
    }

    // 开火
    void Fire()
    {
        GameObject[] useBullets = bullet5Gos;
        int bulletIndex;
        if (Input.GetMouseButtonDown(0) && EventSystem.current.IsPointerOverGameObject() == false)
        {
            if (gold - oneShootCosts[costIndex] >= 0)
            {
                switch (costIndex / 4)
                {
                    case 0: useBullets = bullet1Gos; break;
                    case 1: useBullets = bullet2Gos; break;
                    case 2: useBullets = bullet3Gos; break;
                    case 3: useBullets = bullet4Gos; break;
                    case 4: useBullets = bullet5Gos; break;
                }
                bulletIndex = (lv % 10 >= 9) ? 9 : lv % 10;
                gold -= oneShootCosts[costIndex];
                AudioManager.Instance.PlayEffectSound(AudioManager.Instance.fireClip);
                Instantiate(fireEffect);
                GameObject bullet = Instantiate(useBullets[bulletIndex]);
                bullet.transform.SetParent(bulletHolder, false);
                bullet.transform.position = gunGos[costIndex / 4].transform.Find("FirePos").transform.position;
                bullet.transform.rotation = gunGos[costIndex / 4].transform.Find("FirePos").transform.rotation;
                bullet.GetComponent<BulletAttr>().damage = oneShootCosts[costIndex];
                bullet.AddComponent<Ef_AutoMove>().dir = Vector3.up;
                bullet.GetComponent<Ef_AutoMove>().speed = bullet.GetComponent<BulletAttr>().speed;
            }
            else
            {
                StartCoroutine(GoldNotEnough());
            }
        }
    }

    // 切换炮弹花费
    void ChangeBulletCost()
    {
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            OnButtonMDown();
        }
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            OnButtonPDown();
        }
    }

    // 点击 "+" 按钮
    public void OnButtonPDown()
    {
        gunGos[costIndex / 4].SetActive(false);
        costIndex++;
        AudioManager.Instance.PlayEffectSound(AudioManager.Instance.changeClip);
        Instantiate(changeEffect);
        costIndex = (costIndex > oneShootCosts.Length - 1) ? 0 : costIndex;
        gunGos[costIndex / 4].SetActive(true);
        oneShootCostText.text = "$" + oneShootCosts[costIndex];
    }

    // 点击 "-" 按钮
    public void OnButtonMDown()
    {
        gunGos[costIndex / 4].SetActive(false);
        costIndex--;
        AudioManager.Instance.PlayEffectSound(AudioManager.Instance.changeClip);
        Instantiate(changeEffect);
        costIndex = (costIndex < 0) ? oneShootCosts.Length - 1 : costIndex;
        gunGos[costIndex / 4].SetActive(true);
        oneShootCostText.text = "$" + oneShootCosts[costIndex];
    }

    // 点击大倒计时按钮
    public void OnBigCountdownButtonDown()
    {
        gold += 500;
        AudioManager.Instance.PlayEffectSound(AudioManager.Instance.rewardClip);
        Instantiate(goldEffect);
        bigCountdownButton.gameObject.SetActive(false);
        bigCountdownText.gameObject.SetActive(true);
        bigTimer = bigCountdown;
    }

    // 金币不足时的协程
    IEnumerator GoldNotEnough()
    {
        goldText.color = goldColor;
        goldText.color = Color.red;
        yield return new WaitForSeconds(0.5f);
        goldText.color = goldColor;
    }
}


声音控制器

Awake(): 在对象被创建时调用,用于初始化音频管理器。它设置音频管理器的实例,并从PlayerPrefs中获取静音状态,并根据静音状态设置音频的播放状态。

SwitchMuteState(bool isOn): 切换静音状态的方法。根据传入的参数 isOn 来确定是否要静音。它会反转静音状态,并调用 DoMute() 方法以应用变更。

DoMute(): 根据静音状态来控制背景音乐的播放和暂停。如果静音,背景音乐会暂停播放;如果非静音,背景音乐会开始播放。

PlayEffectSound(AudioClip clip): 播放音效的方法。根据当前的静音状态,判断是否播放音效。如果非静音,会在世界坐标原点(Vector3.zero)处播放传入的音效剪辑。

using UnityEngine;

public class AudioManager : MonoBehaviour
{
    private static AudioManager _instance;
    public static AudioManager Instance
    {
        get
        {
            return _instance;
        }
    }

    private bool isMute = false;
    public bool IsMute
    {
        get
        {
            return isMute;
        }
    }

    public AudioSource bgmAudioSource; // 背景音频源
    public AudioClip seaWaveClip; // 海浪音频剪辑
    public AudioClip goldClip; // 金币音频剪辑
    public AudioClip rewardClip; // 奖励音频剪辑
    public AudioClip fireClip; // 发射音频剪辑
    public AudioClip changeClip; // 切换音频剪辑
    public AudioClip lvUpClip; // 升级音频剪辑

    void Awake()
    {
        _instance = this;
        isMute = (PlayerPrefs.GetInt("mute", 0) == 0) ? false : true; // 从PlayerPrefs中获取静音状态
        DoMute();
    }

    public void SwitchMuteState(bool isOn)
    {
        isMute = !isOn; // 切换静音状态
        DoMute();
    }

    void DoMute()
    {
        if (isMute)
        {
            bgmAudioSource.Pause(); // 静音时暂停背景音乐
        }
        else
        {
            bgmAudioSource.Play(); // 恢复播放背景音乐
        }
    }

    public void PlayEffectSound(AudioClip clip)
    {
        if (!isMute)
        {
            AudioSource.PlayClipAtPoint(clip, Vector3.zero); // 在世界坐标原点播放音效
        }
    }
}


游戏存档

unity制作捕鱼达人

Start(): 在对象启动时调用,用于初始化主场景的UI。它设置静音开关的初始状态,根据音频管理器的静音状态来确定切换按钮的选中状态。

SwitchMute(bool isOn): 切换静音状态的方法。根据传入的参数 isOn 来确定是否要静音。它调用音频管理器的 SwitchMuteState() 方法来切换静音状态。

OnBackButtonDown(): 返回按钮按下时调用的方法。它保存当前游戏状态(包括金币、等级、计时器、经验和静音状态)到 PlayerPrefs 中,并加载场景索引为 0 的场景。

OnSettingButtonDown(): 设置按钮按下时调用的方法。它激活设置面板,使其可见。

OnCloseButtonDown(): 关闭按钮按下时调用的方法。它隐藏设置面板,使其不可见。

using UnityEngine;
using UnityEngine.UI;

public class MainSceneUI : MonoBehaviour
{
    public Toggle muteToogle;       // 静音切换开关
    public GameObject settingPanel; // 设置面板

    void Start()
    {
        muteToogle.isOn = !AudioManager.Instance.IsMute; // 设置静音开关的初始状态为音频管理器的静音状态的相反值
    }

    public void SwitchMute(bool isOn)
    {
        AudioManager.Instance.SwitchMuteState(isOn); // 切换静音状态
    }

    public void OnBackButtonDown()
    {
        // 保存当前游戏状态到PlayerPrefs
        PlayerPrefs.SetInt("gold", GameController.Instance.gold);
        PlayerPrefs.SetInt("lv", GameController.Instance.lv);
        PlayerPrefs.SetFloat("scd", GameController.Instance.smallTimer);
        PlayerPrefs.SetFloat("bcd", GameController.Instance.bigTimer);
        PlayerPrefs.SetInt("exp", GameController.Instance.exp);
        int temp = (AudioManager.Instance.IsMute == false) ? 0 : 1;
        PlayerPrefs.SetInt("mute", temp);

        // 加载场景索引为0的场景
        UnityEngine.SceneManagement.SceneManager.LoadScene(0);
    }

    public void OnSettingButtonDown()
    {
        settingPanel.SetActive(true); // 激活设置面板,使其可见
    }

    public void OnCloseButtonDown()
    {
        settingPanel.SetActive(false); // 关闭设置面板,使其不可见
    }
}


游戏开始

unity制作捕鱼达人文章来源地址https://www.toymoban.com/news/detail-503121.html

using UnityEngine;
using UnityEngine.SceneManagement;

public class StartSceneUI : MonoBehaviour
{
    public void NewGame()
    {
        // 删除已保存的游戏状态
        PlayerPrefs.DeleteKey("gold");
        PlayerPrefs.DeleteKey("lv");
        PlayerPrefs.DeleteKey("exp");
        PlayerPrefs.DeleteKey("scd");
        PlayerPrefs.DeleteKey("bcd");

        // 加载场景索引为1的场景(新游戏场景)
        SceneManager.LoadScene(1);
    }

    public void OldGame()
    {
        // 加载场景索引为1的场景(继续游戏场景)
        SceneManager.LoadScene(1);
    }

    public void OnCloseButton()
    {
        // 关闭应用程序
        Application.Quit();
    }
}


到了这里,关于unity制作捕鱼达人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity火焰特效与爆炸特效的制作

          通过对Unity3D游戏制作一段时间的学习,我认识到在游戏中粒子效果是一个比较重要的环节,可以帮助增强游戏的画面效果和音效效果。同时,我也对制作粒子效果缺乏经验,这次制作火焰粒子效果与爆炸粒子效果也是我在粒子效果制作的一次尝试。 flame 效果: 属性展

    2024年01月25日
    浏览(50)
  • unity制作下雨特效

    跟着B站这位博主的课程学习的: 【Unity教学-游戏特效】超简单下雨特效!_哔哩哔哩_bilibili 简单记录一下。 一、下雨 1、创建项目时选择有URP的3D模板(我做的时候一直没办法在package manager里加载URP,查了许久,发现最初创建时可以直接创建有URP的3D项目,这样就不用额外在

    2024年04月25日
    浏览(41)
  • Unity教程||Unity添加中文字体||Unity知识记录--制作UI粒子特效

    ## 1、拷贝字体文件 拷贝C:WindowsFonts文件夹下,华文细黑常规文件到项目中   ## 2、下载中文字库 链接: https://pan.baidu.com/s/1KW31KB5vEImZHUWvQ9PLEQ 提取码: bgug  3、添加字体字库 选择Window-TextMeshPro-Font Asset Creator   进入Font Asset Creator a、Source Font File 选择字体文件 b、Atlas Resolution 都

    2024年02月09日
    浏览(78)
  • Unity3D粒子系统之制作烟雾特效

    本文将会介绍如何使用Unity内的粒子系统制作烟雾效果。 如果想了解Unity粒子系统中的基础属性,可以看这篇博客:Unity3D 粒子系统之基础属性介绍 先附上预览图: 材质贴图 首先我们需要一张烟雾材质用的材质贴图,我是自己画的,可以参考下图自己画一张或者去网上找素材

    2024年02月02日
    浏览(55)
  • Unity3D粒子系统之制作火焰特效

    本文将会介绍如何使用Unity内的粒子系统制作烟雾效果。 如果想了解Unity粒子系统中的基础属性,可以看这篇博客:Unity3D粒子系统之基础属性介绍 先上预览图吧 用自己熟悉的绘画工具画一张类似这样的图片(相似即可,白灰色部分边缘不规则),注意一定要黑底。 将画好的

    2024年02月02日
    浏览(47)
  • Unity之街机捕鱼

    目录 😪炮台系统 🎶炮口方向跟随鼠标 🎶切换炮台 😪战斗系统 🎮概述 🎮单例模式  🎮开炮 🎮子弹脚本 🎮渔网脚本  🎮鱼属性信息的脚本 😪奖励和等级的实现  😪Unity数据持久化 📖保存游戏 📖继续游戏 📖开始新游戏 最近又跟着教程从头到尾完成了一个实例,虽

    2024年03月14日
    浏览(42)
  • Unity游戏源码分享-街机捕鱼2017版本

    Unity游戏源码分享-街机捕鱼2017版本 完整的单机游戏   功能玩法,积分系统都已经齐全的了。 项目源码地址:https://download.csdn.net/download/Highning0007/88105459

    2024年02月15日
    浏览(36)
  • 在Unity中制作完整的技能系统(介绍篇)

    1. 系统结构介绍 首先我们需要对技能中的部分进行一个划分。通过观察,我们不难发现,在多个技能中经常有一些相同的内容(以下的例子均来自于《英雄联盟》): 火男被动的燃烧一定时间持续伤害和提莫的E技能中毒一定时间持续伤害,效果是相同的吧。 女枪的R技能和

    2024年02月02日
    浏览(70)
  • 特效制作思路(技术层面)

    下面我主要从技术层面介绍特效制作: 特效主要分两种【两种也经常结合使用】:(1)基于着色器的特效;(2)基于粒子系统的特效 着色器制作的特效主要以材质为基础。下面举几个例子: 植物,树木随风摇摆 布料随风摆动 消融特效 水面波纹 高亮辐射光扫描 空气热扭曲

    2024年02月02日
    浏览(29)
  • Unity3D基础入门之粒子系统(属性介绍+火焰粒子系统案例制作)

    一、属性介绍 1、主面板Particle System (1)Duration:粒子发射周期 图中,5.00即在发射5秒后进入下一个粒子发射周期。若没有勾选Looping,则5秒后粒子会停止发射。 (2)Looping:粒子按照周期循环发射 让粒子发射时间循环起来,一直发射粒子。 (3)Prewarm:预热系统 开始播放粒

    2024年02月04日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包