【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 framevoid 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{//未击中//减少玩家HPgameController.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 updatevoid 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#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、
相关文章:

【Unitydemo制作】音游制作—控制器与特效
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:就业…...
[程序员] 最近的感悟,错误处理占大头?
根据昨天分享的一个问题,想到的。 在代码里,异常处理的代码也算是占大头,扑面而来的就是发生错误时怎么处理的大片代码;而且出现问题的概率是绝对的占大头。所以,异常代码出现bug的概率也在不知不觉中增加!…...

vue3(一) - 结构认识
通过之前博客应该已经完成了vue脚手架的认识和创建(地址),这节我们简单介绍一下需要使用的一些关键技术,后续在详细介绍 结构目录 创建脚手架时,我选择了TypeScript,store,route这三个选项 index.html入口 node_mo…...

数据库迁移——kettle开发01
背景:数据库的多种多样,在搭建项目之初,并没有详细考虑到数据库的建设,当增加配置不能满足业务场景需要时,这时候考虑到使用更高性能的数据库,如将MySQL更换为oracle数据库。或者在搭建新项目时,…...
Netty: Netty中的组件
文章目录 一、EventLoop1、EventLoop2、EventLoopGroup(1)处理普通时间和定时任务(2)处理IO任务 二、Channel三、Future&Promise四、Handler&Pipeline五、ByteBuf 一、EventLoop 1、EventLoop EventLoop本质是一个单线程…...

Julia编程01:Julia语言介绍
在2020上半年,因为疫情无法返校,所以在家待了半年,期间学习一点了R语言、Python、Julia、linux和C语言,只是学习基础语法并没有项目练习,因此返校半年后差不多都不记得了,现在重新捡起Julia丰富下当时写的笔…...

二叉树顺序结构及链式结构
一.二叉树的顺序结构 1.定义:使用数组存储数据,一般使用数组只适合表示完全二叉树,此时不会有空间的浪费 注:二叉树的顺序存储在逻辑上是一颗二叉树,但是在物理上是一个数组,此时需要程序员自己想清楚调整…...
【Python】pandas连续变量分箱
路过了学校花店 荒野到海边 有一种浪漫的爱 是浪费时间 徘徊到繁华世界 才发现你背影 平凡得特别 绕过了城外边界 还是没告别 爱错过了太久 反而错得完美无缺 幸福兜了一个圈 🎵 林宥嘉《兜圈》 import pandas as pd import numpy as np from sklearn.model_selecti…...
Qt 打卡小程序总结
1.Qt::Alignment(枚举类型)用于指定控件或文本的对齐方式 Qt::AlignLeft:左对齐。Qt::AlignRight:右对齐。Qt::AlignHCenter:水平居中对齐。Qt::AlignTop:顶部对齐。Qt::AlignBottom:底部对齐。…...

【qt】标准项模型
标准项模型 一.使用标准型项模型1.应用场景2.界面拖放3.创建模型4.配套模型5.视图设置模型6.视图属性的设置 二.从文件中拿到数据1.文件对话框获取文件名2.创建文件对象并初始化3.打开文件对象4.创建文本流并初始化5.读取文本流6.关闭文件7.完整代码 三.为模型添加数据1.自定义…...

一文深度剖析 ColBERT
近年来,向量搜索领域经历了爆炸性增长,尤其是在大型语言模型(LLMs)问世后。学术界开始重点关注如何通过扩展训练数据、采用先进的训练方法和新的架构等方法来增强 embedding 向量模型。 在之前的文章中,我们已经深入探…...

css左右滚动互不影响
想实现左右都可以滚动,且互不影响。 只需要再左边的css里面 .threedlist {cursor: pointer;width: 280px;position: fixed;height: 100vh; /* 定义父容器高度 */overflow-y: auto; /* 只有在内容超过父容器高度时才出现滚动条 */} 如果想取消滚动条样式 .threedli…...

【linux-uboot移植-mmc及tftp启动-IMX6ULL】
目录 1. uboot简介2. 移植前的基本介绍:2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…...

Python-温故知新
1快速打开.ipynb文件 安装好anaconda后,在需要打开notebook的文件夹中, shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面: 2 快速查看函数用法 光标放在函数上——shift键tab 3......

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析
5月23日,绿联科技举行了“新一代存储方式未来已来”发布会,发布了绿联NAS私有云DXP系列(包括两盘位到八盘位的九款新品)以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品,共有两盘位、四盘位、…...
力扣:242. 有效的字母异位词
242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram"…...

设计模式14——组合模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式(Composit…...
MyBatis面试题(Mybaits的优点、缺点、适用场合、与Hibernate有哪些不同)
一、Mybaits的优点: 1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML里,解除 sql与程序代码的耦合,便于统一管理;提供 XML 标签,支持…...

python写接口性能测试
import time import requestsdef measure_response_time(api_url):try:start_time time.time()response requests.get(api_url, timeout10) # 设置超时时间为10秒end_time time.time()response_time end_time - start_timeprint(f"接口 {api_url} 的响应时间为&#…...

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我
《暮色将尽》跨越世纪的历程,慢慢走向并完善自我 戴安娜阿西尔(1917-2019),英国知名文学编辑、作家。著有《暮色将尽》《昨日清晨》《未经删节》《长书当诉》等。 曾嵘 译 文章目录 《暮色将尽》跨越世纪的历程,慢慢走…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...