【Unitydemo制作】音游制作—控制器与特效

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创
👨‍💻 收录于专栏:就业宝典

🅰️推荐专栏

⭐-软件设计师高频考点大全



文章目录

    • 前言
    • 🎶(==1==) 特效
      • 结算特效
      • 游戏特效
      • 场景特效
    • 🎶(==2==) 控制器
      • 账户控制器
      • 数据控制器
      • 音轨控制器
      • 面板启动器
    • 🅰️


前言


🎶(1 特效


结算特效


在这里插入图片描述

游戏特效


在这里插入图片描述

场景特效


在这里插入图片描述


🎶(2 控制器


账户控制器

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

//-------------------------------
//-------功能: 账户控制器
//-------创建者:         -------
//------------------------------

public class acountContorller : SingleManager<acountContorller>
{
    public AcountData foreverAcountData = new AcountData();  //用来存储上一次的账户


    /// <summary>
    /// 用Json序列化存储数据
    /// </summary>
    /// <param name="name"></param>
    public void SaveData(AcountData acountData, string name)
    {
        if (acountData == null) //如果为空的话
        {
            Debug.Log("为空");
            foreverAcountData.aount.Add(name); //直接存名字
            JsonManager.Instance.SaveData(foreverAcountData, "acountArrary");
        }
        acountData.aount.Add(name);
        JsonManager.Instance.SaveData(acountData, "acountArrary");
    }
    /// <summary>
    /// Json序列化读取数据
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public AcountData ReadData()
    {
        return JsonManager.Instance.LoadData<AcountData>("acountArrary");
    }

}

数据控制器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能:  数据管理
//___________创建者:
//_____________________________________
//-------------------------------------
public class DataContorl : SingleManager<DataContorl>
{
    //场景
    public bool levelGame;  //是否是关卡游戏
    public bool livingGame; //是否是生存模式
    public bool foreverGame;//是否是无尽模式
    public float speed;//中介存储,供外部调用
    public AudioClip[] audioClip = new AudioClip[5];
    public int index = 0;

  
    //单例模式中单个全局信息不会随着改变
    public PlayerData foreverPalyerdata = new PlayerData();  //用来存储上一次选中的item数据
    //private List<ServerData> serverLists = new List<ServerData>();
    //public List<ServerData> ServerLists => serverLists;


   
    /// <summary>
    /// 用Json序列化存储数据
    /// </summary>
    /// <param name="name"></param>
    public void SaveData(string name, PlayerData data)
    {
        JsonManager.Instance.SaveData(data, name);
    }

    //更新存储高分信息
    public void UpdateHightSocer( int socers , int index)
    {
        switch (index)
        {
            case 1:
                if (socers > foreverPalyerdata.AllScore) //如果大于关卡模式的最高星星就保留否则不保留
                {
                    foreverPalyerdata.AllScore = socers;
                }
                break;
            
            case 2:
                if (socers > foreverPalyerdata.livingScore) //如果大于生存模式的最高分数就保留否则不保留
                {
                    foreverPalyerdata.livingScore = socers;
                }
                break;
            case 3:
                if (socers > foreverPalyerdata.foreverScore) //如果大于无尽模式的最高分数就保留否则不保留
                {
                    foreverPalyerdata.foreverScore = socers;
                }
                break;
            default:
                break;
        }
        SaveData(foreverPalyerdata.userName , foreverPalyerdata);
        

    }

    public void CloseALL()
    {
        levelGame = false;
        livingGame = false;
        foreverGame = false;
    }
    /// <summary>
    /// Json序列化读取数据
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public PlayerData ReadData(string name)
    {
       return  JsonManager.Instance.LoadData<PlayerData>(name);
    }

    /// <summary>
    /// 供外部调用识别账号密码是否正确
    /// </summary>
    /// <param name="userName"></param>
    /// <param name="password"></param>
    /// <returns></returns>
    public bool Tip(string userName, string password)
    {
        try
        {
            string pass = ReadData(userName).password ;
            Debug.Log(pass);
            if (userName != null && pass == password)
            {
                return true;
            }
            else return false;
        }
        catch
        { return false; }
    }

    /// <summary>
    /// 供外部调用识别注册时是否有相同的账号
    /// </summary>
    public bool TipSame(string userName)
    {
        Debug.Log("该账号已注册");
       return false;
    }
    
 
    /// <summary>
    /// 全局性玩家数据存盘
    /// </summary>
    public void UpdataPlayerInfo()
    {
        SaveData(foreverPalyerdata.userName, foreverPalyerdata);
    }

}

音轨控制器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SonicBloom.Koreo;

public class LaneController : MonoBehaviour {

    //-------------------------------
    //-------功能: 音轨管理器脚本  
    //-------创建者:          
    //------------------------------

    RhythmGameController gameController;

    [Tooltip("此音轨使用的键盘按键")]
    public KeyCode keyboardButton;

    [Tooltip("此音轨对应事件的编号")]
    public int laneID;

    //对“目标”位置的键盘按下的视觉效果
    public Transform targetVisuals;

    //上下边界
    public Transform targetTopTrans;
    public Transform targetBottomTrans;

    //包含在此音轨中的所有事件列表
    List<KoreographyEvent> laneEvents = new List<KoreographyEvent>();

    //包含此音轨当前活动的所有音符对象的队列
    Queue<NoteObject> trackedNotes = new Queue<NoteObject>();

    //检测此音轨中的生成的下一个事件的索引
    int pendingEventIdx = 0;

    public GameObject downVisual;

    //音符移动的目标位置
    public Vector3 TargetPosition
    {
        get
        {
            return transform.position;
        }
    }

    public bool hasLongNote;

    public float timeVal = 0;

    public GameObject longNoteHitEffectGo;

    // Update is called once per frame
    void Update() {

        if (gameController.isPauseState)
        {
            return;
        }
        //清除无效音符
        while (trackedNotes.Count>0&&trackedNotes.Peek().IsNoteMissed())
        {
            if (trackedNotes.Peek().isLongNoteEnd)
            {
                hasLongNote = false;
                timeVal = 0;
                downVisual.SetActive(false);
                longNoteHitEffectGo.SetActive(false);
            }
            gameController.comboNum = 0;
            gameController.HideComboNumText();
            gameController.ChangeHitLevelSprite(0);
            gameController.UpdateHP();
            trackedNotes.Dequeue();
        }

        //检测新音符的产生
        CheckSpawnNext();
        //检测玩家的输入
        if (Input.GetKeyDown(keyboardButton))
        {
            CheckNoteHit();
            downVisual.SetActive(true);
        }
        else if (Input.GetKey(keyboardButton))
        {
            //检测长音符
            if (hasLongNote)
            {
                if (timeVal>=0.15f)
                {
                    //显示命中等级(Great Perfect)
                    if (!longNoteHitEffectGo.activeSelf)
                    {
                        gameController.ChangeHitLevelSprite(2);
                        CreateHitLongEffect();
                    }
                    timeVal = 0;
                }
                else
                {
                    timeVal += Time.deltaTime;
                }
            }
        }
        else if (Input.GetKeyUp(keyboardButton))
        {
            downVisual.SetActive(false);
            //检测长音符
            if (hasLongNote)
            {
                longNoteHitEffectGo.SetActive(false);
                CheckNoteHit();
            }
        }

    }

    //初始化
    public void Initialize(RhythmGameController controller)
    {
        gameController = controller;
    }

    //检测事件是否匹配当前编号的音轨
    public bool DoesMatch(int noteID)
    {
        return noteID == laneID;
    }

    //如果匹配,则把当前事件添加进音轨所持有的事件列表
    public void AddEventToLane(KoreographyEvent evt)
    {
        laneEvents.Add(evt);
    }

    //音符在音谱上产生的位置偏移量
    int GetSpawnSampleOffset()
    {
        //出生位置与目标点的位置
        float spawnDistToTarget = targetTopTrans.position.z - transform.position.z;

        //到达目标点的时间
        float spawnPosToTargetTime = spawnDistToTarget / gameController.noteSpeed;

        return (int)spawnPosToTargetTime * gameController.SampleRate;
    }

    //检测是否生成下一个新音符
    void CheckSpawnNext()
    {
        int samplesToTarget = GetSpawnSampleOffset();

        int currentTime = gameController.DelayedSampleTime;

        while (pendingEventIdx < laneEvents.Count
            && laneEvents[pendingEventIdx].StartSample < currentTime + samplesToTarget)
        {
            KoreographyEvent evt = laneEvents[pendingEventIdx];
            int noteNum = evt.GetIntValue();
            NoteObject newObj = gameController.GetFreshNoteObject();
            bool isLongNoteStart = false;
            bool isLongNoteEnd = false;
            if (noteNum > 6)
            {
                isLongNoteStart = true;
                noteNum = noteNum - 6;
                if (noteNum > 6)
                {
                    isLongNoteEnd = true;
                    isLongNoteStart = false;
                    noteNum = noteNum - 6;
                }
            }
            newObj.Initialize(evt, noteNum, this, gameController, isLongNoteStart, isLongNoteEnd);
            trackedNotes.Enqueue(newObj);
            pendingEventIdx++;
        }
    }

    /// <summary>
    /// 生成特效的有关方法
    /// </summary>
    void CreateDownEffect()
    {
        GameObject downEffectGo = gameController.GetFreshEffectObject(gameController.downEffectObjectPool, gameController.downEffectGo);
        downEffectGo.transform.position = targetVisuals.position;
    }

    void CreateHitEffect()
    {
        GameObject hitEffectGo = gameController.GetFreshEffectObject(gameController.hitEffectObjectPool, gameController.hitEffectGo);
        hitEffectGo.transform.position = targetVisuals.position;
    }

    void CreateHitLongEffect()
    {
        longNoteHitEffectGo.SetActive(true);
        longNoteHitEffectGo.transform.position = targetVisuals.position;
    }

    //检测是否有击中音符对象
    //如果是,它将执行命中并删除
    public void CheckNoteHit()
    {
        if (!gameController.gameStart)
        {
            CreateDownEffect();
            return;
        }
        if (trackedNotes.Count>0)
        {
            NoteObject noteObject = trackedNotes.Peek();
            if (noteObject.hitOffset>-6000)
            {
                trackedNotes.Dequeue();
                int hitLevel= noteObject.IsNoteHittable();
                gameController.ChangeHitLevelSprite(hitLevel);
                if (hitLevel>0)
                {
                    //更新分数
                    gameController.UpdateScoreText(100 * hitLevel);
                    if (noteObject.isLongNote)
                    {
                        hasLongNote = true;
                        CreateHitLongEffect();
                    }
                    else if (noteObject.isLongNoteEnd)
                    {
                        hasLongNote = false;
                    }
                    else
                    {
                        CreateHitEffect();
                    }

                    //增加连接数
                    gameController.comboNum++;
                }
                else
                {
                    //未击中
                    //减少玩家HP
                    gameController.UpdateHP();
                    //断掉玩家命中连接数
                    gameController.HideComboNumText();
                    gameController.comboNum = 0;
                }
                noteObject.OnHit();
            }
            else
            {
                CreateDownEffect();
            }
        }
        else
        {
            CreateDownEffect();
        }
    }
}

面板启动器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:  
//___________功能: UI面板启动器
//___________创建者:
//_____________________________________
//-------------------------------------
public class UIContorl : SingletonMono<UIContorl>
{
    // Start is called before the first frame update
 
    void Start()
    {
        UIManager.GetInstance().ShowPanel<BKPanel>("BKPanel"); //先加载背景面板 
        UIManager.GetInstance().ShowPanel<LoginPanel>("LoginPanel"); //先加载开始登陆面板
       // DataContorl.GetInstance().LoadServerData(); //加载所有区服数据到数据管理器中
        Debug.Log(Application.persistentDataPath); 
    }   


    /// <summary>
    /// 提供改变提示面板内容的方法并显示
    /// </summary>
    /// <param name="component"></param>
    public void ChangeTipPanel(string component)
    {
      
        UIManager.GetInstance().ShowPanel<TipPanel>("TipPanel", E_UI_Layer.Top, (panel) =>
        {
            panel.ChangComponent(component);
        });
    }
}

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024电工杯A题详细思路代码分析数学建模:园区微电网风光储协调优化配置

题目分析&#xff1a;园区微电网风光储协调优化配置 我们会先给出三个问题总体的分析&#xff0c;最后会详细分析问题一的建模和详细内容。 背景&#xff1a; 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的负荷占比&#xff0c;需配置较高比…

《TortoiseSVN》简单使用说明

##################工作记录#################### 常用图标说明 一个新检出的工作副本 修改过的文件 更新过程遇到冲突的文件 你当前对文件进行了锁定&#xff0c;不要忘记不使用后要解锁&#xff0c;否则别人无法使用 当前文件夹下的某些文件或文件夹已经被调度从版本控制…

Lc42---- 1200. 最小绝对差(java版)---排序

1.题目描述 2.知识点和思路 &#xff08;1&#xff09;先排序 &#xff08;2&#xff09;再计算元素对之间的差值&#xff0c;找到最小绝对差&#xff1a; &#xff08;初始化 minDiff 为最大整数值&#xff0c;然后遍历数组找出相邻元素之间的最小差值。&#xff09; int m…

在R中赞扬下努力工作的你,奖励一份CheetShet

传说有个R&#xff0c;R里有个包&#xff0c;包的名字叫praise&#xff0c;会一直不停地夸赞你。 > praise() [1] "You are sensational!" > praise() [1] "You are luminous!" > praise() [1] "You are pioneering!" > praise() […

文件中海量数据的排序

文件中海量数据的排序 题目&#xff1a; 跟之前堆排序可以解决TopK问题一样&#xff0c;我们来看看归并排序会用来解决什么问题&#xff1f; 思路&#xff1a; 我们说归并排序是外排序。其实就是将数据分成一个个小段&#xff0c;在内存中进行排序&#xff0c;再拿出内存&am…

2024年 电工杯 (B题)大学生数学建模挑战赛 | 大学生平衡膳食食谱的优化设计 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是电工杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 问题1&…

摸鱼大数据——Hadoop基础理论知识之ZooKeeper1-3

1、ZK概述 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。HA搭建&#xff1b;管理去中心化的集群&#xff08;例如Kafka&#xff09; ZooKeeper结构: 采用树形…

回溯法——(2)n皇后问题(C语言讲解)(LeetCode51 N皇后思想)(4皇后棋盘画图举例)(附代码)

目录 一、问题概括 二、算法分析 三、举例&#xff08;4皇后棋盘&#xff09; 四、算法实现 4.1运行结果&#xff1a; 51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; 一、问题概括 n皇后问题是19世纪著名数学家高斯于1850年提出的。 问题是&#xff1a;在nn的棋盘上…

QT 使用QLsitView 实现多个子项选中取消效果

文章目录 效果图概述部分代码总结 效果图 概述 整个界面的布局介绍请看这篇博客想要的到这种自由选择中的Item效果&#xff0c;需要使用到Model-view的思想&#xff0c;每个item中都要存放一个标志位&#xff0c;用在Paint函数去判断是否绘制为按下的状态。每次item被点击时&a…

docker- 购建服务镜像并启动

文章目录 前言docker- 购建服务镜像并启动1. 前期准备2. 构建镜像3. 运行容器4. 验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

顶坚北斗有源终端有什么功能跟用途

顶坚北斗有源终端作为现代卫星导航与通信技术融合的杰出代表&#xff0c;其用途广泛且功能强大。在广袤无垠的偏远山区、深邃的海洋以及荒芜的沙漠中&#xff0c;当用户面临移动通信信号无法覆盖的困境时&#xff0c;北斗有源终端便成为了连接世界的桥梁。 该终端的核心功能之一…

开关电源重点可靠性测试项目与测试方法

为确保开关电源在复杂工作环境下的安全性与稳定性&#xff0c;各种安全性测试成为不可或缺的环节。本文将深入探讨几项关键的安全性测试项目&#xff0c;帮助用户全面了解如何评估开关电源的可靠性和安全性。 一、过压保护测试方法 目的是为了检测当输出电压过高时&#xff0c;…

陕西煤矿化工集团如何投稿刊登到央媒

随着信息技术的飞速发展&#xff0c;国家级媒体平台已经成为了众多作者追求发表文章的热门选择。然而&#xff0c;要想在这些平台上成功发表文章&#xff0c;除了具备优秀的文稿质量外&#xff0c;还需要掌握一定的投稿技巧和策略。本文将为您详细介绍国家级媒体投稿方式&#…

【重磅】史上最全的论文图表基本规范

会议文章对图片质量的要求比较低&#xff0c;一般投了后基本都没有修改的机会&#xff0c;而杂志文章对图片质量的要求相当高&#xff0c;可能来回改几次才能满足要求。如果论文投稿前就达到了较高的质量&#xff0c;相信修改时会轻松很多。 以《Nature》期刊为例&#xff0c;…

BFT Robotics - 您的智能自动化伙伴

“买机器人&#xff0c;上BFT” 自动化和机器人技术是推动现代工业发展的重要力量。BFT Robotics以其创新的产品系列和定制化解决方案&#xff0c;为企业提供了一条通往高效、智能生产环境的道路。通过采用BFT Robotics的产品和服务&#xff0c;企业不仅能够提高生产效率&#…

JMeter 基本使用【Windows Jmeter GUI 图形界面】

1.安装jmeter GUI图形界面 需要安装JDK 官方网址: Apache JMeter - Apache JMeter™ linux tgz windows zip 2. 目录及文件 bin: 核心可执行文件&#xff0c;包含配置 extras&#xff1a;插件扩展包 lib&#xff1a;核心依赖包 ext&#xff1a;核心包 junit&#xff1a;单…

四川古力科技抖音小店,创新科技点亮购物新体验

在这个数字化浪潮汹涌的时代&#xff0c;四川古力科技以其前瞻性的战略眼光和创新能力&#xff0c;闪耀于抖音小店这片电商新蓝海&#xff0c;开启了未来购物的新纪元。作为一家集技术研发、产品创新、市场营销于一体的科技型企业&#xff0c;古力科技不仅为消费者带来了前所未…

html+css绘制自定义样式输入框

效果&#xff1a; 代码&#xff1a; html部分&#xff1a; <div class"box"> <div class"newbox"><input type"text" required><div class"name">Username</div></div> </div>css部分 …

神经网络的工程基础(三)——更优化的最优化算法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论更优化的最优化问题算法。 关于大语言模型的内容&#xff0c;推荐参考这个专栏。 内容大纲 相关说明一、概述二、算…