1、设置一个Create Empty 挂上三个脚本取名GameControlScript、CreatTowerScript、CreatEnemyScripts

(1)、GameControlScript

sing System.Collections;
using System.Collections.Generic;
//这个脚本
//1、控制怪物的产生
//2、保存怪物的相关信息
public class GameControlScript : MonoBehaviour {
//将一波怪物的相关信息保存在结构体当中
public struct Enemy
{
//1、每一个的血量
public int Enemy_Hp;
//2、每一个怪物的速度
public int Enemy_Speed;
//3、每一波怪物刷新的时间
public float Level_RefreshTime;
//4、每一波怪的个数
public int Level_Count;
}
public static GameControlScript instance;
void Awake()
{
instance = this;
}

public Enemy[] enemy ;
//随机产生波数
public int Levels ;
//第一波怪物的相关属性
public int First_Hp = 1000;
public int First_Speed = 1;
public float First_RefreshTime = 3;
public int First_Count = 5;
void Start () {
Levels = Random.Range(5,8);
//根据 波数 去声明 结构体数组中 结构体的个数
enemy = new Enemy[Levels];
for (int i = 0; i < enemy.Length; i++) {
enemy [i].Enemy_Hp = First_Hp;
First_Hp += 1200;
enemy [i].Enemy_Speed = First_Speed;
First_Speed += 2;
enemy [i].Level_RefreshTime = First_RefreshTime;
First_RefreshTime += 0.5f;
enemy [i].Level_Count = First_Count;
First_Count += 2;

}
}

}

(2)、CreatEnemyScripts

//这个脚本用来控制怪物的产生

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class CreatEnemyScripts : MonoBehaviour {
public GameObject EnemyPrefab;
public Transform BirthPosition;
public Text text;
// Use this for initialization
void Start () {
}
//判断游戏是否结束
bool GameIsOver = false;
//判断一波怪的刷新时间是否结束
bool refreTime = true;
// Update is called once per frame
void Update () {
CreatEnemy ();

}
// 当前怪物的数量
int Current_Level_Count =0;
//波数
public int Levels = 0;
//控制多少时间产生怪物
float timerEnemy = 0;
//控制刷新间隔
float timerreftime = 0;

void CreatEnemy(){
//如果没有结束游戏结束.怪物开始刷新
if (GameIsOver == false) {
timerreftime += Time.deltaTime;
//如果怪物的刷新间隔大于GameControlScript里面的每一波怪物刷新的时间并仍然在刷新
if (timerreftime >= GameControlScript.instance.enemy [Levels].Level_RefreshTime && refreTime == true) {
//判断刷新结束
refreTime = false;
//刷新时间归零
timerreftime = 0;
}
//如果怪物的刷新间隔结束,开始生产怪物
else if (refreTime == false) {
timerEnemy += Time.deltaTime;
//每间隔1秒产生一个物体
if (timerEnemy > 1) {
GameObject enemy = Instantiate (EnemyPrefab, BirthPosition.position, Quaternion.identity) as GameObject;
enemy.GetComponent<EnemyScript> ().Hp = GameControlScript.instance.enemy [Levels].Enemy_Hp;
//当前怪物的数量+1
Current_Level_Count++;
//时间归零
timerEnemy = 0;
//如果当前产生怪物的数量等于GameControlScript里面每一波怪的个数
if (Current_Level_Count == GameControlScript.instance.enemy [Levels].Level_Count) {
//怪物开始刷新
refreTime = true;
//波数+1
Levels++;
//刷新时间归零
timerreftime = 0;
//当前怪物数量归零
Current_Level_Count = 0;
//如果 波数等于GameControlScript里面怪物数组的长度
if (Levels == GameControlScript.instance.enemy.Length) {
//游戏结束
GameIsOver = true;
Debug.Log ("这是最后一波怪了");
}
}
}
}
}
}
}

(3)、CreatTowerScript

//这个脚本用来控制炮塔的产生

using UnityEngine;
using System.Collections;

public class CreatTowerScript : MonoBehaviour {
public GameObject GunPrefab;  // 炮的预制体
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
//如果点击鼠标右键,产生一条射线
if (Input.GetMouseButtonDown(0)) {
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
RaycastHit[] infohits;
//将射线所穿过的所有物体加入这个数组内
infohits = Physics.RaycastAll (ray);
//如果射线内存在物体
if (infohits.Length > 0) {
//遍历射线
foreach (var item in infohits) {
//射线穿过的物体的tag值为tower,并且他的子物体没有任何东西
if (item.transform.tag == "tower" && item.transform.childCount == 0) {
//产生的地方为此物体的地点并且往上偏移2.7f
Vector3 GunPosition = item.transform.position + Vector3.up * 2.7f;
//创建预制体
GameObject gun = Instantiate (GunPrefab, GunPosition, Quaternion.identity) as GameObject;
//将预制体的父体设置为此物体
gun.transform.SetParent (item.transform);
}
}
}
}
}
}

2、在怪物身上挂一个脚本叫 EnemyScript

using UnityEngine;
using System.Collections;

public class EnemyScript : MonoBehaviour {
NavMeshAgent agent;
GameObject TargetPosition;
Animation myanimator;
public int Hp = 0;
//一出生就自动寻路到目标点
void Start () {
agent = GetComponent<NavMeshAgent> ();
TargetPosition = GameObject.Find ("DeadPosition");
agent.destination = TargetPosition.transform.position;
myanimator = GetComponent<Animation> ();
}

// Update is called once per frame
void Update () {

//如果距离目标点还剩0.1,就销毁物体
if (agent.remainingDistance <= 0.1f) {
Destroy (gameObject);
} else if (Hp <= 0) {
agent.Stop ();
myanimator.CrossFade ("Dead");
Destroy (gameObject, 1);
}

}
}

3、在炮的上半部分挂上一个脚本 Controlgunscript

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Controlgunscript : MonoBehaviour {
Queue<Transform> Target; //设置攻击目标
Transform AttackTarget; //攻击物体
public GameObject bulletPrefab;
public Transform BulletPosition;
void Start () {
Target = new Queue<Transform> ();
}
 
public float angel;
//设置多少时间产生子弹
public float TimeIntval;
float fireTimer = 0;
void Update () {
//如果攻击目标为空
if (AttackTarget == null) {
//如果集合内存在物体
if (Target.Count > 0) {
//攻击目标指定为其中之一
AttackTarget = Target.Dequeue ();
}
} else{
Vector3 direct = AttackTarget.position - transform.position;
//将方向转化为旋转
Quaternion qua = Quaternion.LookRotation (direct);
每次 让 炮往 目标点的位置旋转 总 角度的 angel *Time.deltaTime
Quaternion result = Quaternion.Lerp (transform.rotation, qua, angel * Time.deltaTime);
//炮的旋转方向
transform.rotation = result;
//炮的正方向 与 敌人到炮的方向 的夹角小于10度,就开炮
if (Vector3.Angle (transform.forward, direct) < 10) {
fireTimer += Time.deltaTime;
if (fireTimer > TimeIntval) {
GameObject bullet = Instantiate (bulletPrefab, BulletPosition.position, Quaternion.identity) as GameObject;
fireTimer = 0;
//创建子弹的时候 给子弹设置攻击目标
bullet.GetComponent<fireScript>().target = AttackTarget;
}
}
}
}
//碰触检测
void OnTriggerEnter(Collider other)
{
//如果被碰触的tag值为enemy时
if (other.transform.tag == "enemy") {
//将物体加入进集合中
Target.Enqueue (other.gameObject.transform);
}
}

void OnTriggerExit(Collider other)
{
//将离开碰撞检测的物体离开集合内
if (Target.Count > 0) {
Target.Dequeue ();
}
//如果离开的物体就是攻击目标
if (other.transform == AttackTarget) {
//攻击目标为空
AttackTarget = null;
}
}
}

4、在子弹上面建立一个脚本fireScript

public class fireScript : MonoBehaviour {
//设置攻击目标
public Transform target;
//子弹的伤害值
public int damage = 100;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (target == null) {

//如果目标为空
Destroy (gameObject);
} else {

Vector3 dir = Vector3.MoveTowards (transform.position, target.position, 0.2f);
transform.position = dir;
}
}

void OnTriggerEnter(Collider other){
if (other.gameObject.tag == "enemy") {
other.transform.GetComponent<EnemyScript> ().Hp -= damage;
}
Destroy (gameObject);
}
}

做一个简单的塔防游戏相关推荐

  1. QT实现简单的塔防游戏

    QT实现简单的塔防游戏 该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射炮弹.爆炸效果.怪物走到家时我方生命值减少.方便添加关卡等功能. 另附重构版本代码 ...

  2. 用pygame做一个简单的python小游戏---贪吃蛇

    用pygame做一个简单的python小游戏-贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/artic ...

  3. 用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便加强一下pygame库的学习. 玩法:每次点击鼠标时,会以鼠标 ...

  4. 用pygame做一个简单的python小游戏---生命游戏

    用pygame做一个简单的python小游戏-生命游戏 生命游戏(Game of Life) 生命游戏(Game of Life)是剑桥大学约翰·何顿·康威(John Horton Conway)教授 ...

  5. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

  6. 做一个简单的java小游戏--单机版五子棋

    做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...

  7. 做一个简单的java小游戏--贪吃蛇

    做一个简单的java小游戏–贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/detail ...

  8. QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划

    作者 | 白家名 责编 | 王晓曼 出品 | CSDN博客 本文作者使用 QT 框架写了一个塔防游戏程序,该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射 ...

  9. python做一个简单的对战游戏

    今天没什么事情,就自己做了一个简单的对战游戏. 这个小游戏流程大概是这样的 开始游戏 ↓ 选择人物出场顺序及技能 ↓  ←  ←  ←  ←  ←  ←  ←  ←  ← ← ↖ 开始战斗→胜利方→+ ...

最新文章

  1. 【Prometheus Pushgateway】 推送数据踩坑
  2. linux安装mysql8依赖的环境_CentOS Linux release 8 安装mysql8.
  3. 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
  4. CentOS7.1下targetcli的使用
  5. 远程桌面剪贴板失效的解决办法
  6. vue请求PHP接口报错provisional headers are shown
  7. Activiti获取当前活动(任务)的出口(动态生成提交按钮)
  8. 一篇不错的v4l2 (实用)
  9. getlibs_解决32位ubun12.04-linux_mint13中lotus-notes-8.5.3界面不正常问题
  10. GIS应用开发AO(1)_普通几何图形绘制
  11. Axure实例:即刻 app 产品需求文档
  12. mysql查询所有男生中姓王的_数据库6.22
  13. sqlserver的文件导入到mysql_导入50G文件到mysql,然后再倒入sqlserver
  14. VSCode安装使用教程(最新详细版)
  15. rss下载_Microsoft下载中心RSS提要
  16. 自如上线分期支付,租金贷发展受限后充分利用流量变现
  17. mysql函数中打印信息_mysql信息函数
  18. 关闭互斥句柄达到游戏多开MFC源码
  19. sony DSC-M2使用感受
  20. M3DGIS全息裸眼三维电子沙盘数字沙盘大数据系统开发教程视频第6课

热门文章

  1. 补水雾化器专用MOS管直接替代AO3400节约成本MOSFET SOT23-3
  2. HTML学习3:常用标签之文本标签
  3. 实验10-1 圆形体体积计算器
  4. 杨建允:透过2022年双十一GMV,我们看到了什么?
  5. Java中Queue类实现
  6. java编译命令用什么写_要编译java程序需要使用的命令是什么
  7. MySQL数据备份与恢复----------mysqldump-----多种恢复方法
  8. 【小诗一首,大家给意见】
  9. 【经验总结】10年的嵌入式开发老手,到底是如何快速学习和使用RT-Thread的?(文末赠书5本)
  10. 中国功夫-chinese kung fu