三、功能的具体实现

这里只介绍部分主要功能以及一些核心代码,其他细节可自行设计

1. 开始游戏场景:

开始游戏点击开始按钮,调用Gamanager里的公开方法,运行开始面板的动画(这里用的是DoTween插件)并播放声音即可

    public void OnStartGameButton(){startGamePanelTween.DOPlayForward();clickAudioSource.PlayOneShot(clickClip);}

游戏选项通过Slider的value来控制AudioSource的volume;通过正则表达式来验证玩家名字是否合法;通过QualitySettings.SetQualityLevel(int level)方法来调节画质
查看排行榜我这里建了一个单链表用来表示玩家信息(名字;分数),通过单链表里的排序方法(简单的冒泡排序表)对玩家进行排名,并将排名信息填充到排行榜的预制件单元中。而对于玩家信息的存储则通过PlayerPrefab实现,他存储了string类型字符串,通过对字符串的分割实现了玩家信息的获取。
单链表接口:

public interface IListDS
{

void Sort();//排序
void Add(T item1,T item2);//添加信息
bool CheckIsNeedToAdd(T item1,T item2);//检查该信息是否能被添加
Node<T> this[int index] { get; set; }//索引器实现

}
玩家信息存储以及获取:

 void CreateRecordBoard(){//PlayerPrefs.SetString("unitData", "");string strData = PlayerPrefs.GetString("unitData");if (strData.CompareTo("") == 0)//初始化玩家信息{strData = "暗夜之鸦,39886;暴躁的恐角龙,8944;士兵76,22000;闪光萨,15886;死亡之翼,6532;YoungForever,9876";PlayerPrefs.SetString("unitData", strData);}string[] firstSplitStr = strData.Split(';');for (int i = 0; i < firstSplitStr.Length; i++)//分割字符串{string[] secodnSplitStr = firstSplitStr[i].Split(',');if (secodnSplitStr[0] == ""){continue;}CreateCell(secodnSplitStr[0], secodnSplitStr[1]);//将玩家信息存储在排行榜的预制件单元里面}}

退出游戏退出游戏只需一句代码即可

 public void OnExitGame(){clickAudioSource.PlayOneShot(clickClip);Application.Quit();}

2. 第一(三)关场景:

虚拟摇杆控制移动的实现:

    [SerializeField]private EasyJoystick joys; void PlayerMove(){if (Gamanager.isOver || Gamanager.isPause)//如果游戏出于暂停状态或结束状态,则不进行移动{return;}float h = joys.JoystickAxis.x;float v = joys.JoystickAxis.y;if (h < -0.5f)//玩家旋转{transform.rotation = Quaternion.Euler(begionRotation + new Vector3(0, 45, 0));}else if (v > 0.5f){transform.rotation = Quaternion.Euler(begionRotation - new Vector3(0, 45, 0));}else{transform.rotation = Quaternion.Euler(begionRotation);}rigibid.velocity = new Vector3(h, v, 0) * speed;rigibid.position = new Vector3(Mathf.Clamp(rigibid.position.x, board.minx, board.maxx), Mathf.Clamp(rigibid.position.y, board.miny, board.maxy), 0);//差值函数实现平滑渐变}

玩家射击(两种子弹的切换):

 public void PlayerShoot(){if (timer < shootRate){timer += Time.deltaTime;}rayBullet.SetActive(false);if (isShoot){if (tempBulet == TempBullet.Bullet){if (timer >= shootRate){playerAudio.PlayOneShot(playerShootAudio);timer = 0;GameObject.Instantiate(bullet, shotPos.position, Quaternion.identity);}}if (tempBulet == TempBullet.Laser){if (!playerAudio.isPlaying){playerAudio.PlayOneShot(raySound);}rayBullet.SetActive(true);rayBullet.GetComponent<LineRenderer>().SetPosition(0, rayBullet.transform.position);rayBullet.GetComponent<LineRenderer>().SetPosition(1, rayBullet.transform.position + new Vector3(0, 10, 0));}}}


敌人的AI以及交互条件相对于外界少了很多,但是敌人有不同种类,不同种类的敌人却又许多共有的行为以及属性,所以这里定义一个抽象类,其他不同种类的敌人继承这个类即可
敌人抽象类:

public enum AwardType
{Laser,Bullet,Plane,Life
}
[System.Serializable]
public class Awards//也可以改变Text即可,更简单方便
{public AwardType awardType;public GameObject AwardPre;public float minRange;public float maxRange;
}public abstract class Enemy : MonoBehaviour
{public Awards[] awards;protected Rigidbody rigidbody;public int blood;public GameObject enemyBoom;public int demage;public float shotRate;[HideInInspector]public float shotTimer = 0;private bool isDied = false;[SerializeField] private AudioClip enemyBoomClip;[SerializeField]private GameObject rayShootHurt;[SerializeField] private GameObject bulletHurt;public void SetDemage(int demage){//if (isDied)//{//    return;//}blood -= demage;Gamanager.score += demage;if (blood <= 0){if (transform.name == "Boss(Clone)"&&Gamanager.level!=3){PlayerPrefs.SetInt("level2",1);Gamanager.isOver = true;}CreateAward();//GetComponent<AudioSource>().PlayOneShot(enemyBoomClip);//gameObject.SetActive(false);Destroy(GameObject.Instantiate(enemyBoom, transform.position, Quaternion.identity), .5f);//MeshRenderer[] renders = GetComponentsInChildren<MeshRenderer>();//foreach (var render in renders)//{//    render.enabled = false;//}//isDied = true;Destroy(this.gameObject);return;}if (demage <= 5){//int index = Random.Range(0, 20);//if (index == 0)//{Destroy(GameObject.Instantiate(rayShootHurt, transform.position, Quaternion.identity), .5f);//}}else{int index = Random.Range(0, 2);if (index == 0){Destroy(GameObject.Instantiate(bulletHurt, transform.position, Quaternion.identity), .5f);}}}void CreateAward(){float randomNum = Random.Range(0f, 4f);for (int i = 0; i < awards.Length; i++){if (randomNum >= awards[i].minRange && randomNum < awards[i].maxRange){GameObject.Instantiate(awards[i].AwardPre, transform.position, Quaternion.identity);}}}public void DestorySelf(){Destroy(this.gameObject);}protected abstract void Move();protected abstract void Shoot();}


UI主要操纵了玩家的移动以及配置一些其他的共有信息,其中进入UI界面时游戏需要暂停,通过让Time.timescale=0即可实现游戏的暂停Time.timescale=1实现游戏的正常运行。
同时游戏管理者在场景切换的时候需要或许并传递场景件公用的信息:

void OnLevelWasLoaded(int level){PlayerSettings();}void PlayerSettings(){//声音volume = PlayerPrefs.GetFloat("volume");backgroundAudio.volume = volume;volumeSlider.value = volume;//画质if (PlayerPrefs.GetInt("frame") == 0){frame = Frame.Fluency;QualitySettings.SetQualityLevel(0);frameToggle.isOn = false;}else if (PlayerPrefs.GetInt("frame") == 1){frame = Frame.HighQuatility;QualitySettings.SetQualityLevel(5);frameToggle.isOn = true;}//玩家playerId = PlayerPrefs.GetInt("playerId");if (playerId == 1){player1.SetActive(true);}else{player2.SetActive(true);}//昵称playerName = PlayerPrefs.GetString("playerName");level = PlayerPrefs.GetInt("enterLevel");}

* 3. 第二关场景*
对于第二关的处理性相应的简单了许多,这一关主要是游戏的内容的构思。

4. CG场景
这一关主要用来播放CG并跳转到第二关,没有什么额外的操作。
同时附上场景间切换时进度条的显示方法:

using UnityEngine.SceneManagement;[SerializeField]private GameObject loadPanel;[SerializeField]private Slider processBar;public  void LoadScene(string str){StartCoroutine(StartLoadingScene(str));}IEnumerator StartLoadingScene(string str){float i = 0;loadPanel.SetActive(true);AsyncOperation acOp = SceneManager.LoadSceneAsync(str);//异步加载场景acOp.allowSceneActivation = false;//该值为false时即使加载到下一场景也不会立即跳转,知道该值为truewhile (i<=100){i++;processBar.value=i/100;yield return new WaitForSeconds(.05f);}acOp.allowSceneActivation=true;loadPanel.SetActive(false);}

四、心得体会
制作这个游戏最大的收获就在于通过自己的构思去设计出了一个完整而有效的框架,正是这个框架才使得自己能把整个游戏制作出来,相较于以前制作游戏时“写到哪想到哪”的方式,确实对我而言有了质的飞跃。同时对UGUI以及一些插件的再次使用也加深了我自己对这些插件以及相应API的印象。

Unity编写雷霆战机流程(二)相关推荐

  1. Unity Sunny Land开发流程(二)

    文章目录 0.开发流程一 1.Animation Events 2.Class调用&死亡动画&继承多态 3.音效Audio 4.对话框Dialog&淡入动画效果 5.场景控制S ...

  2. steam游戏上架流程二:steamworks SDK API steamworks.net 对接 unity

    参考: steamworks.net 官方文档的说明 http://steamworks.github.io/gettingstarted/ steam游戏上架流程一:使用官方SDK上传游戏  htt ...

  3. Unity 3D学习之雷霆战机(一)

    雷霆战机(一) 注:本文包括雷霆战机的第一部分,在没书的情况下,慢慢摸索自己真的了解到许多知识,现于初学者分享并求指教,因为自己是初学者中间可能会有许多不成熟的地方或者错误的地方,望指教.再次重申本人 ...

  4. 纯c语言打造的雷霆战机,飞机大战。可吃道具加强。

    纯c语言编写的雷霆战机,简单容易上手 本博客将持续更新带给大家日常生活中的简单经典的C语言小项目和生活中的电子DIY.以后会陆续推出讲解视频发布在b站上.所有程序和日常学习资料全都可以在 群文件中免费 ...

  5. java 雷霆战机游戏 飞机大战 全过程教学+免费素材(附全部源代码)

    这个游戏已是我第二次编写了,之前写过一个简易版的飞机大战类似demo.这次在上一次基础上添加了许多元素,增添了可玩性. 游戏效果图如下: ps :完整源码+视频教程+论文文档 :java雷霆战机完整资 ...

  6. Unity编写Shader内置各种矩阵和方法介绍

    返回目录 大家好,我是阿赵. 这里记录一下Unity编写Shader内置各种矩阵和方法 一.Unity内置转换矩阵 1.MVP类矩阵 UNITY_MATRIX_MVP:Current model * ...

  7. python 0基础如何做出雷霆战机?【源码送上】

    嗨害大家好鸭!我是小熊猫~ 大家都玩过雷霆战机吧? 这样的 我的qun友 才学三周就做出了雷霆战机这种游戏, 看起来确实不错啊~ 今天就实现一下雷霆战机的运作,开始整活! 一.准备工作 使用的软件版本 ...

  8. Unity编写冰球对战游戏 2D版

    Unity编写冰球对战游戏 2D版 Unity是一款非常方便.简洁.低成本的一款游戏引擎.在这里,向大家介绍这样用Unity这个引擎编写冰球对战游戏 因为Unity这个引擎可以编写3D游戏 ,同样的也 ...

  9. JavaSwing多线程小游戏雷霆战机

    在做完连连看以后,想到要做一个多线程游戏,本来是做的一个跳伞的小游戏的.但是做到一半的时候,觉得可玩性太低了.后面想来想去还是打算做一个以前玩过的雷霆战机小游戏,也就是飞机大战. 1.效果展示 2.绘 ...

最新文章

  1. vue入门教程(二)
  2. 程序员也要寻找贸易的机会,要参加研讨会
  3. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?
  4. 清华大学:2021元宇宙研究报告
  5. 把关与服务的关系_泉州代做投标书-电子标书值得信赖 - 泉州广告服务
  6. java RuntimeException
  7. WinForm BackgroundWorker笔记
  8. Ant Design + React 中将分页组件的英文转为中文
  9. 获取第二天凌晨12点时间
  10. 和数集团首款自研虚拟数字人上线,“始祖龙”带你跨山海,链未来
  11. 托管网站需要知道的网站优化指标有哪些
  12. 西门子PLC1200学习之模拟量的使用
  13. pytorch入门笔记
  14. Python-鼠标自动点击
  15. 如何在ArcGIS中应用七参数对影像进行坐标投影变换
  16. edge 浏览器主页启动页无法修改
  17. AOP相关术语(连接点、切入点、通知、引介、目标对象、织入、代理、切面)
  18. SpringBoot33-springboot开发部署与测试-spring boot测试
  19. 老司机 iOS 周报 #26 | 2018-07-09
  20. Spire.Office for .NET/JAVA 和谐版

热门文章

  1. U-Boot 之一 零基础编译 U-Boot 过程详解、Image 镜像介绍及使用说明、DTB 文件使用说明
  2. html表格内图片填充颜色设置,使用HTML添加表格4(行颜色与表格嵌套)——零基础自学网页制作...
  3. java中final double_举例讲解Java中final关键字的用法
  4. 清理 yarn 缓存、清理 npm 缓存
  5. MySQL获取当前日期、时间、时间戳函数
  6. 获取当天凌晨和第二天凌晨时间戳的工具类
  7. phpstudy添加php扩展,phpstudy怎么安装swoole扩展
  8. 淘宝自动回复机器人店小蜜配置手册——目录
  9. FreeCAD Toothbrush Head Stand 牙刷头架
  10. glog从下载到使用实录