这篇文章进行对游戏ui逻辑的总结。

首先给每个机器人添加一个血条的效果,在机器人的游戏物体下创建一个画布,并添加一个slider,只保留其中的Fill Area,把其他的删掉,如图。

将Fill中的image修改为红色,然后给slider添加一个脚本,主要功能是让slider的value的值与血量占比相当

using UnityEngine;
using UnityEngine.UI;
public class follower : MonoBehaviour
{[SerializeField]private float m_offsety;public Transform m_robot;private float m_robotinithp;//机器人初始的hpprivate void Start(){m_robotinithp = m_robot.gameObject.GetComponent<RobotController>().M_hp;}private void Update(){//确定血条位置gameObject.transform.position = new Vector3(m_robot.position.x, m_robot.position.y + m_offsety, m_robot.position.z);//根据实际情况扣血gameObject.GetComponent<Slider>().value=((m_robot.gameObject.GetComponent<RobotController>().M_hp / m_robotinithp));}
}

然后对该画布的Canvas组件中的Render Mode进行如图设置:

创建一个新的相机,将它拖入Canvas组件中的Render Camera,在第三篇文章中的gamemanager类中拥有该相机游戏对象的引用,名为m_secondcamera,并将其与主相机的transform同步。这样子就相当与每个机器人都拥有一个与血量相当slider,并且它时刻面向玩家的视角,形成血条的效果。

血条设置好以后,创建多个scene来存储关卡,把每个scene的地图自己div一下,将多个机器人放置其中并设置好巡逻点。然后开始进行ui脚本的创建。

首先是第一个scene也就是主菜单,创建一个名为UI的空物体,在它下面创建三个画布,再为每个画布添加各种功能对象,如图:

创建脚本进行管理,挂在ui上

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class menuui : MonoBehaviour {public GameObject m_setcanvas;public GameObject m_Authorcanvas;public GameObject m_volumeslider;private void Start(){m_setcanvas.SetActive(false);m_Authorcanvas.SetActive(false);m_volumeslider.GetComponent<Slider>().value = datamanager.m_volume;}private void Update(){//音量调节datamanager.m_volume = m_volumeslider.GetComponent<Slider>().value;}//下面的方法全都挂在不同的Button上public void OnStart(){SceneManager.LoadScene(1);}public void OnExit(){Application.Quit();}public void OnSetOpen(){m_setcanvas.SetActive(true);}public void OnSetClose(){m_setcanvas.SetActive(false);}public void OnAuthorOpen(){m_Authorcanvas.SetActive(true);}public void OnAuthorClose(){m_Authorcanvas.SetActive(false);}
}

还创建一个空物体负责播放bgm,也挂一个脚本控制音量,在其他scene中也有这个物体

using UnityEngine;public class bgm : MonoBehaviour { void Update (){gameObject.GetComponent<AudioSource>().volume = datamanager.m_volume;}
}

然后是开始游戏后的ui,之前在创建武器系统时做了一部分,现在补充完整

创建脚本对其进行管理

using System.Collections;
using UnityEngine;
using UnityEngine.UI;//游戏界面状态
enum PlayUiState
{BATTLE,END,SET
}public class playui : MonoBehaviour
{private PlayUiState m_state;//当前界面状态private gun m_gun;private playerhp m_playerhp;private player m_player;private gamemanager m_manager;public GameObject m_hptext;//获取画布中的一个textpublic GameObject m_bulletText;//子弹数文本public GameObject m_snipertexture;//瞄准时加载的图片public GameObject m_aimtexture;public GameObject m_time;public GameObject m_endcanvas;public GameObject m_endtext;public GameObject m_playerstatetext;public GameObject m_hurtimage;public GameObject m_warningtext;public GameObject m_scoretext;public GameObject m_setcanvas;public GameObject m_bgm;public GameObject m_volumeslider;public GameObject m_mouseslider;private Color m_flashcolor; //记录受伤图片的色彩值public float m_flashspeed = 2;private float m_musictime = 0;//记录音乐播放位置private bool m_dead = false;private float m_finaltime = 0;void Start(){m_state = PlayUiState.BATTLE;m_player = FindObjectOfType<player>();m_playerhp = FindObjectOfType<playerhp>();m_manager = FindObjectOfType<gamemanager>();m_playerhp.diedelegate += OnDie;//添加委托事件m_volumeslider.GetComponent<Slider>().value = datamanager.m_volume;m_mouseslider.GetComponent<Slider>().value = datamanager.m_mosen;//记录当前设置好的受伤图片的颜色值m_flashcolor = m_hurtimage.GetComponent<Image>().color;//将受伤图片先设置为透明m_hurtimage.GetComponent<Image>().color = Color.clear;m_setcanvas.SetActive(false);m_endcanvas.SetActive(false);m_hurtimage.SetActive(true);m_playerstatetext.SetActive(false);m_warningtext.SetActive(false);//若是第一关 为玩家显示提示if (datamanager.M_gamelevel == 1){StartCoroutine(FirstWarning());}Cursor.visible = false;//隐藏鼠标}void Update(){#region 战斗界面if (m_state == PlayUiState.BATTLE){m_gun = FindObjectOfType<gun>();FreshHpText();FreshBulletText();ShowAimImage();ShowTheTime();//当玩家处于休息状态 显示提示if (playerstatemanager.m_state == PlayerState.RELAXE){m_playerstatetext.GetComponent<Text>().text = "Relaxing...";m_playerstatetext.SetActive(true);}else m_playerstatetext.SetActive(false);//将受伤图片的颜色渐变为透明m_hurtimage.GetComponent<Image>().color =Color.Lerp(m_hurtimage.GetComponent<Image>().color,Color.clear,m_flashspeed * Time.deltaTime);//设置鼠标灵敏度datamanager.m_mosen = m_mouseslider.GetComponent<Slider>().value;m_player.m_mouserate = datamanager.m_mosen * 5;//状态转换if (datamanager.M_gamelevel == datamanager.m_maxlevel || m_dead) m_state = PlayUiState.END;if (Input.GetKeyUp(KeyCode.Y)) m_state = PlayUiState.SET;}#endregion#region 结束界面if (m_state == PlayUiState.END){Cursor.visible = true;//显示鼠标m_gun.enabled = false;m_player.enabled = false;m_endcanvas.SetActive(true);string score = "";if (datamanager.M_gamelevel == datamanager.m_maxlevel)//胜利{m_endtext.GetComponent<Text>().text = "Victory!";//记录游戏时间if (m_finaltime == 0)m_finaltime = (int)datamanager.M_playtime;score ="杀敌数:" + datamanager.M_gamescore +"\n当前关卡:" + "final" +"\n用时:" + m_finaltime + "s";}else if (m_dead)//死亡{m_endtext.GetComponent<Text>().text = "Game Over";m_playerhp.diedelegate -= OnDie;//释放委托事件//记录游戏时间if (m_finaltime == 0)m_finaltime = (int)datamanager.M_playtime;score ="杀敌数:" + datamanager.M_gamescore +"\n当前关卡:" + datamanager.M_gamelevel +"\n用时:" + m_finaltime + "s";}m_scoretext.GetComponent<Text>().text = score.ToString();}#endregion#region 设置界面if (m_state == PlayUiState.SET){m_gun.enabled = false;//音乐暂停m_musictime = m_bgm.GetComponent<AudioSource>().time;m_bgm.GetComponent<AudioSource>().Pause();Cursor.visible = true;//显示鼠标Time.timeScale = 0;//时间暂停m_setcanvas.SetActive(true);//声音设置datamanager.m_volume = m_volumeslider.GetComponent<Slider>().value;}#endregion}void FreshHpText(){m_hptext.GetComponent<Text>().text = "HP:" + m_playerhp.M_hp.ToString();}void FreshBulletText(){m_bulletText.GetComponent<Text>().text = m_gun.Curbulletnum.ToString() + "/"+ m_gun.Storebulletnum.ToString();}void ShowAimImage(){if (sniperscope.m_isaiming){m_snipertexture.SetActive(true);m_aimtexture.SetActive(false);}else{m_snipertexture.SetActive(false);m_aimtexture.SetActive(true);}}void OnDie(){m_dead = true;}void ShowTheTime(){int time = (int)m_manager.M_WaitTime;if (time == 0)m_time.GetComponent<Text>().text = "The door is open!";elsem_time.GetComponent<Text>().text = time.ToString();}public void HurtEffect(){m_hurtimage.GetComponent<Image>().color = m_flashcolor;}//下面两个方法是绑定在Button上的public void OnSetClose(){Cursor.visible = false;// 继续播放音乐m_bgm.GetComponent<AudioSource>().Play();m_bgm.GetComponent<AudioSource>().time = m_musictime;Time.timeScale = 1;//时间恢复正常m_setcanvas.SetActive(false);m_gun.enabled = true;m_state = PlayUiState.BATTLE;//转换状态}public void OnExit(){Application.Quit();}//显示警告,延迟消失IEnumerator FirstWarning(){m_warningtext.GetComponent<Text>().text = "Live and get out";m_warningtext.SetActive(true);yield return new WaitForSeconds(5f);m_warningtext.GetComponent<Text>().text = " ";m_warningtext.SetActive(false);}
}

因为每个关卡的ui都相同,可以设置为全局ui,在gamemanager中将名为ui的物体DontDestroyOnLoad了就行。

效果如下(结束界面):

ui写完后,这个小游戏就基本完成的差不多了,后面可能还会有些改进和补充,现在已经可以愉快的玩耍了,谢谢观看:)

unity应用实例——从头撸一个全新的FPS游戏(5)相关推荐

  1. unity应用实例——从头撸一个全新的FPS游戏(1)

    从今天开始打算从头开始搞一个全新的FPS游戏,引擎使用的是unity2017,所有美术资源都计划从商店购买或是网上下载(自己实在搞不来),主要玩法是玩家需要穿越多个地图到达目的地,每个地图类似于一个地 ...

  2. unity应用实例——从头撸一个全新的FPS游戏(4)

    这一篇是对追踪机器人的总结,首先我们需要分析一下机器人的行为特点,在这里我们用有限状态机(FSM)进行设计. 首先,每个机器人都会有巡逻(Patrol).追踪(Chase).攻击(Attack)和死亡 ...

  3. 【Unity实战】实现一款简单的FPS游戏

    步骤 实现一款FPS游戏需要以下步骤: 1.创建场景:在Unity中创建3D场景,设定地形.灯光.天气等环境,新增角色.武器等道具. 2.角色控制:创建角色,并添加Unity内置的角色控制器或自定义控 ...

  4. 【从头到脚】撸一个多人视频聊天 — 前端 WebRTC 实战(一)

    前言 [ 从头到脚 ]会作为一个系列文章来发布,它包括但不限于 WebRTC 多人视频,预计会有: WebRTC 实战(一):也就是本期,主要是基础讲解以及一对一的本地对等连接,网络对等连接. Web ...

  5. 实践:《从头到脚撸一个多人视频聊天 — 前端 WebRTC 实战(一)》

    2019独角兽企业重金招聘Python工程师标准>>> 请先阅读原文,链接:从头到脚撸一个多人视频聊天 - 前端 WebRTC 实战(一),本文只涉及实践过程中的问题 1.video ...

  6. Vchat — 从头到脚,撸一个社交聊天系统(vue + node + mongodb)

    前言 项目开始是因为工作需要一个聊天室功能,但是因为某些原因最终选用的是基于xmpp协议的Strophe.js写的.于是就想用node自己写一套,本来只是想简单的写个聊天页面,但是写完了又不满意,所以 ...

  7. uglifyjs报错 webpack_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置

    webpack说复杂也不复杂.不复杂,核心概念不外乎是entry, output, loader, plugins.webpack4还新增了optimization选项,用于代码分割和打包优化.现在w ...

  8. flutter 获取定位_从头开发一个Flutter插件(二)高德地图定位插件

    在上一篇文章从头开发一个Flutter插件(一)开发流程里具体介绍了flutter插件的具体开发流程,从创建项目到发布.接下来将会为Flutter天气项目开发一个基于高德定位sdk的flutter定位 ...

  9. vsc写vue生成基本代码快捷键_基于vue2.X的webpack基本配置,教你手动撸一个webpack4的配置...

    webpack说复杂也不复杂.不复杂,核心概念不外乎是entry, output, loader, plugins.webpack4还新增了optimization选项,用于代码分割和打包优化.现在w ...

最新文章

  1. AICompiler动态shape编译框架案例和效果数据
  2. Git工作流指南:集中式工作流
  3. linux系统运行pbs出现ntf,Linux系统启动故障修复
  4. 什么是数字孪生?有哪些关键能力?
  5. Bootstrap 警告框(Alert)插件
  6. Failed to update system registry. Need permission to add?
  7. 混凝土墙开洞_失传已久的混凝土墙体加固“秘籍”
  8. ERROR 1064 (42000): ; check the manual that corresponds to y
  9. Apache服务器 403 Forbidden的几种错误原因小结!
  10. Nginx如何配置静态文件过期时间
  11. 虽然今天angular5发布了,但我还是吧这篇angularjs(1)+webpack的文章发出来吧哈哈哈...
  12. 德标螺纹规格对照表_德标 国标,国际标准中英文对照表
  13. OpenCC的编译与多语言使用
  14. 有效沟通沟通的9大技巧
  15. linux使用TCP聊天室设计详解,基于linux的TCP网络聊天室设计与实现
  16. Mybatis 官网地址
  17. Java 旋转、翻转图片工具类(附代码) | Java工具类
  18. SpringBoot+Spock的熟悉之路(二):Spock,Mock和Mockitio的关系
  19. 【DL】时间序列的深度学习
  20. android intelhaxm,Android和Intel HAXM的问题

热门文章

  1. 机器学习算法之聚类算法拓展:K-Means和Mini Batch K-Means算法效果评估
  2. astar插件下载 就行_PS模拟下雨插件下载 一键为照片添加下雨效果 小伙伴们收货啦...
  3. 关于我的专业(niit软件工程方向)
  4. ​深圳国际会展中心希尔顿、茂名浪漫海岸喜来登度假、南昌青山湖希尔顿欢朋酒店开业 | 中国酒店周刊...
  5. 基于FPGA的高速电路板设计
  6. CDA数据分析师level2(模拟题考点记录)
  7. php 合成微信头像,PHP 图片合成、仿微信群头像的方法示例
  8. 安卓开发基础知识3(国内深度摄像头方案)
  9. 半导体测试概论笔记——第二章半导体测试基本概念
  10. 基于模板匹配的知识图谱问答系统