using UnityEngine;
using System.Collections;public struct WaveMsg
{//该波次生成的怪物public GameObject monster;//时间间隔public float waveInterval;//生成个数public float count;//生成间隔public float interval;//怪物血量public float hp;/// <summary>/// 构造函数/// </summary>/// <param name="monster">Monster.</param>/// <param name="waveInterval">Wave interval.</param>/// <param name="count">Count.</param>/// <param name="interval">Interval.</param>public WaveMsg(GameObject monster,float waveInterval,float count,float interval,float hp){this.monster = monster;this.waveInterval = waveInterval;this.count = count;this.interval = interval;this.hp = hp;}
}public class MonsterInit : MonoBehaviour {//怪物预设体public GameObject[] monsters;//波次信息public WaveMsg[] waveMsg;//每波怪之间的时间计时器private float waveTimer;//每个怪之前的时间计时器private float monsterTimer;//波次计数器private int count;//怪物个数计数器private int monsterCount;//游戏开关private bool gameBegin = true;void Awake(){waveMsg = new WaveMsg[]{new WaveMsg(monsters[0],0,3,2,10),new WaveMsg(monsters[1],2.5f,5,1.5f,15),new WaveMsg(monsters[2],2,10,1f,20),new WaveMsg(monsters[1],2,10,0.5f,25),new WaveMsg(monsters[0],2,15,0.5f,30)};}void Update(){if (gameBegin) {//波次计时器计时waveTimer += Time.deltaTime;if (waveTimer >= waveMsg [count].waveInterval) {//如果当前生成怪的个数不够,继续生成if (monsterCount < waveMsg [count].count) {//计时器计时monsterTimer += Time.deltaTime;//计时结束if (monsterTimer > waveMsg [count].interval) {//生成怪物GameObject currentMaster = Instantiate (waveMsg [count].monster,transform.position, Quaternion.identity) as GameObject;//给新生成的怪物设置血量值currentMaster.GetComponent<Monster> ().hp = waveMsg [count].hp;//怪物个数++monsterCount++;//计时器清零monsterTimer = 0;}} else {//波次加一count++;if (count < waveMsg.Length) {//怪物个数清零monsterCount = 0;//波次计时器清零waveTimer = 0;} else {//表示怪兽生成结束gameBegin = false;}}}}}
}

using UnityEngine;
using System.Collections;public class GameOver : MonoBehaviour {//血量public int hp = 10;//触发void OnTriggerEnter(Collider other){//如果是怪物if (other.tag == "Monster") {//减血操作if (--hp <= 0) {Debug.Log ("GameOver");}//销毁怪物
            Destroy (other.gameObject);}}
}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;public class GaussAttack : MonoBehaviour {//攻击队列Queue<Transform> monsters;//当前攻击目标public Transform currentTarget;//炮筒旋转速度public float turnSpeed = 10;//发射特效private GameObject muzzle;//炮塔伤害值public float damage = 30;void Awake(){monsters = new Queue<Transform> ();muzzle = transform.Find ("Base/Turret/Muzzle_1").gameObject;}void Update(){if (currentTarget) {//转向
            LookAtTargetSmooth();//给敌人减血currentTarget.GetComponent<Monster>().hp-=Time.deltaTime * damage;//如果当前目标已经死亡if (!currentTarget.GetComponent<Monster> ().monsterAlive) {//切换下一个目标
                TargetSwitch ();}}}/// <summary>/// 平滑旋转看向敌人/// </summary>void LookAtTargetSmooth(){//方向向量Vector3 dir = currentTarget.position - transform.position;//目标旋转Quaternion qua = Quaternion.LookRotation (dir);//先找到炮筒Transform gun = transform.GetChild (0).GetChild (0);//炮筒转向目标四元数gun.rotation = Quaternion.Lerp (gun.rotation, qua,Time.deltaTime * turnSpeed);}/// <summary>/// 进入攻击范围/// </summary>/// <param name="other">Other.</param>void OnTriggerEnter(Collider other){//如果是怪物if (other.tag == "Monster") {//进队列
            monsters.Enqueue (other.transform);// 如果没有攻击目标if (currentTarget == null) {TargetSwitch ();}}}void OnTriggerExit(Collider other){//如果是怪物,且在队列内if (other.tag == "Monster" && other.transform == currentTarget) {//切换下一个目标
            TargetSwitch ();}}/// <summary>/// 切换目标/// </summary>void TargetSwitch(){//如果队列中有数据if (monsters.Count > 0) {//队列中出来的怪物即为下一个攻击目标currentTarget = monsters.Dequeue ();//有怪,开枪muzzle.SetActive (true);} else {//如果队列中没有数据,此时目标为空currentTarget = null;//没怪,停止开枪muzzle.SetActive (false);}}
}

using UnityEngine;
using System.Collections;public class CameraMove : MonoBehaviour {private float hor,ver;public float moveSpeed = 3;void Update(){hor = Input.GetAxis ("Horizontal");ver = Input.GetAxis ("Vertical");transform.position += new Vector3 (hor,0,ver)* Time.deltaTime * moveSpeed;//24 0 2//40 0 35
transform.position = new Vector3 (Mathf.Clamp(transform.position.x,24f,40f),transform.position.y,Mathf.Clamp(transform.position.z,2f,35f));}}

using UnityEngine;
using System.Collections;public class TowerInit : MonoBehaviour {//射线碰撞检测器
    RaycastHit hit;//炮塔预设体public GameObject towerPrefab;void Update(){//获取屏幕射线Ray r = Camera.main.ScreenPointToRay (Input.mousePosition);//射线碰撞到了碰撞体if (Physics.Raycast (r, out hit)) {//如果该物体名字中包含‘Base’字符串,且基座没有子物体if (hit.collider.name.Contains ("Base") &&hit.transform.childCount == 0) {if (Input.GetMouseButtonDown (0)) {///TODO:生成炮塔GameObject currentTower = Instantiate (towerPrefab,hit.transform.position + Vector3.up * 2.7f,Quaternion.identity) as GameObject;//设置炮塔为基座的子物体
                    currentTower.transform.SetParent (hit.transform);}}}}}

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

地图设置导航。

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

转载于:https://www.cnblogs.com/VR-1024/p/6021287.html

Demo_塔防(自动生成怪物,导航,炮塔攻击,怪物掉血死忙)相关推荐

  1. 用Unity开发一款塔防游戏(一):攻击方设计

    大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...

  2. MarkdownPad2自动生成侧边导航栏目录

    想要开启导航栏,需要写代码进行自定义,具体操作如下: 就在 Tools→ Options → Advanced 中的Custom Html Head Content中,点击HTML head edit ...

  3. [cocos2d-x学习笔记][入门基础][塔防]塔防游戏中箭塔旋转并攻击实现

    1. 检测炮塔视线范围内距离它最近的敌人. int length=0; float index=0; for (int i=0; i<Game::allEnemy.size(); i++) { ...

  4. 塔防游戏c语言源代码,用Unity开发一款塔防游戏(一):攻击方设计

    private void Update() { hpObj.rotation = mainCamera.rotation; //血条始终面向镜头 if (GameMain.instance.gameO ...

  5. unity塔防游戏怪物转向_怪兽塔防手游下载-怪兽塔防官方版v1.0下载

    怪兽塔防官方版是一款画风Q萌的塔防手游,怪兽塔防里有很多可爱的怪物,保护你身后的城堡,不断到来的敌人会对你造成极大的威胁,你可以通过在固定的位置放置武器进行防御,这将考验你对紧急情况的反应和应对能力, ...

  6. 游戏开发(十三) 之 塔防 炮塔技能设计思路

    继续上一篇内容,这次说塔防类型游戏的炮塔设计思路 图片压缩gif的时候有问题..但是可以将就看. 这里我一共实现了5种炮塔的攻击: 单体暴击 范围群攻 毒液 减速 整排攻击 先说下我之前见过的这类游戏 ...

  7. 微信塔防小游戏开发教程,唤境引擎制作塔防游戏分享

    今天带来的是塔防游戏制作攻略! 点击这里来下载工程文件, 点击这里可以下载工程中所用的素材哦~ 预览状态时敌人会从四个生成点随机生成,并且会自动寻路绕过黑色墙体走向红色终点.点击黑色墙体可以创建炮塔, ...

  8. 十大iOS塔防游戏评点

    塔防游戏,即炮塔防御(Tower Defence,TD)游戏的简称.炮塔防御游戏起源于PC时代,有不少移动平台上的塔防游戏都是从PC游戏改编而来.现在除了单纯的建造炮塔防御怪物的传统模式(其中又包括固 ...

  9. GemCraft Labyrinth:超耐玩的在线flash塔防游戏

    GemCraft Labyrinth是一个在线flash塔防游戏,中文名字可以理解为宝石塔防.这个游戏拥有众多的关卡(169关),所以和植物大战僵尸一样十分的耐玩,除此之外,独特的宝石合成模式.技能点 ...

最新文章

  1. 【Sphinx】MySQL+Sphinx 全文检索的使用和测试
  2. mysql数据库如何让表单与表单关联共用_这样的表单如何做到和数据库相连,我想知道与SQL和mysql这两种的连接方法,在线等,谢谢各位!...
  3. SAP BSP应用configuration的加载原理
  4. 一代人的回忆!国产游戏机传奇落幕:官网已无法正常访问
  5. 惊艳!Uber 的豪华开源深度学习“全家桶”
  6. vs中c语言图形显示,VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)...
  7. Java: 将中文名转换为指定格式拼音
  8. python 中的拷贝、浅拷贝与深拷贝
  9. 计算机的学情分析报告,计算机教学计划合集总结5篇
  10. 如何建立自己的【渲染农场】终极指南(1)
  11. 书籍《阅读的方法》读后感
  12. 华为云服务器的使用方法
  13. Android GMS认证项总结
  14. 为什么服务器运行失败怎么回事,服务器运行失败_Win7旗舰版提示服务器运行失败怎么解决...
  15. 5G NR-无线接口架构
  16. “打工与创业”普通人该怎么选择;唯有创业才能改变命运实现财务自由。丨国仁网络资讯
  17. 佳能镜头EOS系统EF协议逆向工程(一)
  18. 秀场精灵陈梓桐 受邀担任第六季完美童模全球总决赛首席体验官
  19. 尚硅谷前端项目开发笔记
  20. pdf阅读器如何语音朗读文件

热门文章

  1. 内网穿透-公网访问家庭内网
  2. java 常见异常汇总_Java常见异常总结
  3. ElasticSearch 基本原理之全文检索
  4. python tkinter出牌洗牌
  5. 《算法工程师带你去》读书笔记
  6. 【成电860考研】经验贴汇总(专业课部分)-扒遍所有网站:信软群、王道、知乎、csdn等,截止21年7月整理出的所有帖子-共15篇
  7. HKEY_LOCAL_MACHINE\Software\WOW6432Node
  8. 一整只烧鹅价格=烧鹅上庄价格+烧鹅下庄价格这个关系不因货币变掉而变
  9. DLR in Silverlight
  10. 重温Scrum精髓 - Scrum的核心到底是什么