1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public struct WaveMsg
  5. {
  6. //该波次生成的怪物
  7. public GameObject monster;
  8. //时间间隔
  9. public float waveInterval;
  10. //生成个数
  11. public float count;
  12. //生成间隔
  13. public float interval;
  14. //怪物血量
  15. public float hp;
  16.  
  17. /// <summary>
  18. /// 构造函数
  19. /// </summary>
  20. /// <param name="monster">Monster.</param>
  21. /// <param name="waveInterval">Wave interval.</param>
  22. /// <param name="count">Count.</param>
  23. /// <param name="interval">Interval.</param>
  24. public WaveMsg(GameObject monster,float waveInterval,
  25. float count,float interval,float hp)
  26. {
  27. this.monster = monster;
  28. this.waveInterval = waveInterval;
  29. this.count = count;
  30. this.interval = interval;
  31. this.hp = hp;
  32. }
  33. }
  34.  
  35. public class MonsterInit : MonoBehaviour {
  36.  
  37. //怪物预设体
  38. public GameObject[] monsters;
  39. //波次信息
  40. public WaveMsg[] waveMsg;
  41. //每波怪之间的时间计时器
  42. private float waveTimer;
  43. //每个怪之前的时间计时器
  44. private float monsterTimer;
  45. //波次计数器
  46. private int count;
  47. //怪物个数计数器
  48. private int monsterCount;
  49. //游戏开关
  50. private bool gameBegin = true;
  51.  
  52. void Awake()
  53. {
  54. waveMsg = new WaveMsg[]{
  55. new WaveMsg(monsters[],,,,),
  56. new WaveMsg(monsters[],2.5f,,1.5f,),
  57. new WaveMsg(monsters[],,,1f,),
  58. new WaveMsg(monsters[],,,0.5f,),
  59. new WaveMsg(monsters[],,,0.5f,)
  60. };
  61. }
  62.  
  63. void Update()
  64. {
  65. if (gameBegin) {
  66. //波次计时器计时
  67. waveTimer += Time.deltaTime;
  68. if (waveTimer >= waveMsg [count].waveInterval) {
  69. //如果当前生成怪的个数不够,继续生成
  70. if (monsterCount < waveMsg [count].count) {
  71. //计时器计时
  72. monsterTimer += Time.deltaTime;
  73. //计时结束
  74. if (monsterTimer > waveMsg [count].interval) {
  75. //生成怪物
  76. GameObject currentMaster = Instantiate (
  77. waveMsg [count].monster,
  78. transform.position,
  79. Quaternion.identity) as GameObject;
  80. //给新生成的怪物设置血量值
  81. currentMaster.GetComponent<Monster> ().hp =
  82. waveMsg [count].hp;
  83. //怪物个数++
  84. monsterCount++;
  85. //计时器清零
  86. monsterTimer = ;
  87. }
  88. } else {
  89. //波次加一
  90. count++;
  91. if (count < waveMsg.Length) {
  92. //怪物个数清零
  93. monsterCount = ;
  94. //波次计时器清零
  95. waveTimer = ;
  96. } else {
  97. //表示怪兽生成结束
  98. gameBegin = false;
  99. }
  100. }
  101. }
  102. }
  103. }
  104. }

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class GameOver : MonoBehaviour {
  5.  
  6. //血量
  7. public int hp = ;
  8.  
  9. //触发
  10. void OnTriggerEnter(Collider other)
  11. {
  12. //如果是怪物
  13. if (other.tag == "Monster") {
  14. //减血操作
  15. if (--hp <= ) {
  16. Debug.Log ("GameOver");
  17. }
  18. //销毁怪物
  19. Destroy (other.gameObject);
  20. }
  21. }
  22. }

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4.  
  5. public class GaussAttack : MonoBehaviour {
  6.  
  7. //攻击队列
  8. Queue<Transform> monsters;
  9. //当前攻击目标
  10. public Transform currentTarget;
  11. //炮筒旋转速度
  12. public float turnSpeed = ;
  13. //发射特效
  14. private GameObject muzzle;
  15. //炮塔伤害值
  16. public float damage = ;
  17.  
  18. void Awake()
  19. {
  20. monsters = new Queue<Transform> ();
  21. muzzle = transform.Find ("Base/Turret/Muzzle_1").gameObject;
  22. }
  23.  
  24. void Update()
  25. {
  26. if (currentTarget) {
  27. //转向
  28. LookAtTargetSmooth();
  29. //给敌人减血
  30. currentTarget.GetComponent<Monster>().hp-=Time.deltaTime * damage;
  31. //如果当前目标已经死亡
  32. if (!currentTarget.GetComponent<Monster> ().monsterAlive) {
  33. //切换下一个目标
  34. TargetSwitch ();
  35. }
  36. }
  37. }
  38.  
  39. /// <summary>
  40. /// 平滑旋转看向敌人
  41. /// </summary>
  42. void LookAtTargetSmooth()
  43. {
  44. //方向向量
  45. Vector3 dir = currentTarget.position - transform.position;
  46. //目标旋转
  47. Quaternion qua = Quaternion.LookRotation (dir);
  48. //先找到炮筒
  49. Transform gun = transform.GetChild ().GetChild ();
  50. //炮筒转向目标四元数
  51. gun.rotation = Quaternion.Lerp (gun.rotation, qua,
  52. Time.deltaTime * turnSpeed);
  53. }
  54.  
  55. /// <summary>
  56. /// 进入攻击范围
  57. /// </summary>
  58. /// <param name="other">Other.</param>
  59. void OnTriggerEnter(Collider other)
  60. {
  61. //如果是怪物
  62. if (other.tag == "Monster") {
  63. //进队列
  64. monsters.Enqueue (other.transform);
  65. // 如果没有攻击目标
  66. if (currentTarget == null) {
  67. TargetSwitch ();
  68. }
  69. }
  70. }
  71.  
  72. void OnTriggerExit(Collider other)
  73. {
  74. //如果是怪物,且在队列内
  75. if (other.tag == "Monster" && other.transform == currentTarget) {
  76. //切换下一个目标
  77. TargetSwitch ();
  78. }
  79. }
  80.  
  81. /// <summary>
  82. /// 切换目标
  83. /// </summary>
  84. void TargetSwitch()
  85. {
  86. //如果队列中有数据
  87. if (monsters.Count > ) {
  88. //队列中出来的怪物即为下一个攻击目标
  89. currentTarget = monsters.Dequeue ();
  90. //有怪,开枪
  91. muzzle.SetActive (true);
  92. } else {
  93. //如果队列中没有数据,此时目标为空
  94. currentTarget = null;
  95. //没怪,停止开枪
  96. muzzle.SetActive (false);
  97. }
  98. }
  99. }

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class CameraMove : MonoBehaviour {
  5.  
  6. private float hor,ver;
  7. public float moveSpeed = ;
  8.  
  9. void Update()
  10. {
  11. hor = Input.GetAxis ("Horizontal");
  12. ver = Input.GetAxis ("Vertical");
  13.  
  14. transform.position += new Vector3 (hor,,ver)
  15. * Time.deltaTime * moveSpeed;
  16. //24 0 2
  17. //40 0 35
  18.  
  19. transform.position = new Vector3 (
  20. Mathf.Clamp(transform.position.x,24f,40f),
  21. transform.position.y,
  22. Mathf.Clamp(transform.position.z,2f,35f)
  23. );
  24.  
  25. }
  26.  
  27. }
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class TowerInit : MonoBehaviour {
  5.  
  6. //射线碰撞检测器
  7. RaycastHit hit;
  8. //炮塔预设体
  9. public GameObject towerPrefab;
  10.  
  11. void Update()
  12. {
  13. //获取屏幕射线
  14. Ray r = Camera.main.ScreenPointToRay (
  15. Input.mousePosition);
  16. //射线碰撞到了碰撞体
  17. if (Physics.Raycast (r, out hit)) {
  18. //如果该物体名字中包含‘Base’字符串,且基座没有子物体
  19. if (hit.collider.name.Contains ("Base") &&
  20. hit.transform.childCount == ) {
  21. if (Input.GetMouseButtonDown ()) {
  22. ///TODO:生成炮塔
  23. GameObject currentTower = Instantiate (
  24. towerPrefab,
  25. hit.transform.position + Vector3.up * 2.7f,
  26. Quaternion.identity) as GameObject;
  27. //设置炮塔为基座的子物体
  28. currentTower.transform.SetParent (hit.transform);
  29. }
  30. }
  31. }
  32. }
  33.  
  34. }

炮塔需要触发事件设置好范围来检测怪物,进入范围触发事件攻击。

地图设置导航。

怪物添加刚体,设置动力学。避免出现碰撞弹奏,或者穿透现象。

Demo_塔防(自动生成怪物,导航,炮塔攻击,怪物掉血死忙)的更多相关文章

  1. 使用Python从Markdown文档中自动生成标题导航

    概述 知识与思路 代码实现 概述 Markdown 很适合于技术写作,因为技术写作并不需要花哨的排版和内容, 只要内容生动而严谨,文笔朴实而优美. 为了编写对读者更友好的文章,有必要生成文章的标题导航 ...

  2. PHP自动生成后台导航网址的最佳方法

    'http://www.jbxue.com'=> '脚本学堂首页', </script>

  3. Markdown使用TOC自动生成导航栏

    经常使用markdown 的玩家一定很想要一个自动生成的导航栏吧,自己写的基本思路就是 轮询监听滚动条的位置,通过抛锚和跳锚实现,这里介绍一下今天的主角,markdown-toc插件: https:/ ...

  4. vite插件-自动生成vue组件文档

    特点 支持热更新 快速启动,依赖于 vite,无需另起服务 自动生成组件导航 ui 采用了vant-ui的样式 核心方法覆盖率达到了 92.86% 使用 yarn add vite-plugin-vu ...

  5. SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口

    前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...

  6. fiddler4自动生成jmeter脚本

    接口.性能测试任务当遇到从浏览器或移动app自己抓包的情况出现时就变得巨苦逼了,苦在哪里?苦在需要通过抓包工具抓报文,需要通过抓包报文梳理业务逻辑.需要将梳理的逻辑编写成脚本.最最苦的情况是,自己抓包 ...

  7. JavaScript自动生成博文目录导航

    转载于:JavaScript自动生成博文目录导航 我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到 具体的内容 ...

  8. JavaScript自动生成博文目录导航/TOP按钮

    博客园页面添加返回顶部TOP按钮 进入网页管理->设置 在"页面定制CSS代码"中添加如下css样式,当然你可以改为自己喜欢的样式 此处可以将背景色background-co ...

  9. JavaScript:自动生成博文目录导航

    感谢 孤傲苍狼 分享了 自动生成博文目录的方法,本文仅作存档使用. 图 1:效果预览 CSS 样式 #TOCbar{ font-size:12px; text-align:left; position ...

随机推荐

  1. Codeforces 527E Data Center Drama(欧拉回路)

    题意: 给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数. Solution: 题目很长,并且很多条件说的不太直接,确实不太好懂. 首先先看得到的无向图, ...

  2. 神秘链接__proto__是什么鬼

    _proto_实际上是某个实例对象的隐藏属性,而prototype是其构造器函数(或者说‘类’)的原型属性; function Mine() {} var  hi = new Function(), ...

  3. js+css3 动画数字累加

    css: .kk{ width:100px; height:100px; display:inline-block; color:red; text-align:center; position: r ...

  4. oracle常见为题汇总,以及一个简单数据连接操作工厂

    本人软件环境:win8.1 64位操作系统,vs2013,安装好了与oracle数据库对应的客户端         连接oracle数据库.以及操作数据库 1.使用IIS建立网站,浏览网页时候,提示“ ...

  5. hadoop 2.2.0 集群部署 坑

    注意fs.defaultFS为2..0新的变量,代替旧的:fs.default.name hadoop 2.2.0 集群启动命令:bin/hdfs namenode -formatsbin/start ...

  6. 使用单调队列优化的 O(nm) 多重背包算法

    我搜索了一下,找到了一篇很好的博客,讲的挺详细:链接. 解析 多重背包的最原始的状态转移方程: 令 c[i] = min(num[i], j / v[i]) f[i][j] = max(f[i-1][ ...

  7. c# 类;一维数组;二维数组

    1. 输入邮箱帐号,判断格式是否正确  (1)有且只有一个@          Contains IndexOf ==LastIndexOf  (2)不能以@开头           StartsWi ...

  8. Hibernate中的事务隔离

    在我们的项目中,老发现程序报告sesssion is closed或者因数据已经被其他事务修改而导致当前事务无法提交,由于系统的运行用户最多也就几十个人,所以考虑使用严格的事务隔离来防止这种类型的问题 ...

  9. 几个Uboot命令

    1 nand scrub 这个命令会擦除坏块信息,将坏块标识成好的,但此时这个坏块有潜在有危险,在特定条件下仍会造成数据的丢失,所以应该谨慎使用. Run U-boot and then use th ...

  10. POJ 2594 Treasure Exploration(带交叉路的最小路径覆盖)

    题意:  派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.有的点可以重复去. 输入数据: 首先是n和 ...