Tower Defence Demo

四人小组作业,通过unity实现
塔攻击的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AttackTower : MonoBehaviour
{Transform firePosition;public GameObject bulletPrefab;// Start is called before the first frame updatevoid Start(){firePosition = transform.Find("FirePosition");}// Update is called once per framevoid Update(){}public void Fire(Transform _target){GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);bullet.GetComponent<Missile>().SetTarget(_target.gameObject.transform);Destroy(this);}
}

子弹攻击代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Bullet : MonoBehaviour
{public int damage = 50;public float speed = 20;public GameObject explosionEffectPrefab;private Transform target;// Update is called once per framevoid Update(){if (target == null){Destroy(this.gameObject);return;}transform.LookAt(target);transform.eulerAngles += new Vector3(0, -90, 90);transform.position = Vector3.MoveTowards(transform.position, target.position, Time.deltaTime * speed);}public void SetTarget(Transform _target){this.target = _target;}private void OnTriggerEnter(Collider other){if(other.tag == "Enemy"){if (other.GetComponent<Enemy1>() != null){other.GetComponent<Enemy1>().TakeDamage(damage);}else{other.GetComponent<Enemy2>().TakeDamage(damage);}GameObject.Instantiate(explosionEffectPrefab, transform.position, transform.rotation);Destroy(this.gameObject);}if(other.tag == "Shield"){Debug.Log("击中护盾");Destroy(this.gameObject);}}
}

生成敌人波次

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EnemySpawner : MonoBehaviour
{public static int enemyAliveCount = 0;public Wave[] waves;public Transform START;public Transform enemyGroup;public Transform START2;public Transform enemyGroup2;private Coroutine coroutine;//  public static int enemyAliveCount2 = 0;public Wave[] waves2;// Start is called before the first frame updatevoid Start(){coroutine = StartCoroutine(SpawnerEnemy());}public void stop(){StopCoroutine(coroutine);}IEnumerator SpawnerEnemy(){foreach (Wave wave in waves){for(int i = 0; i < wave.count; i++){GameObject.Instantiate(wave.enemyPrefab, START.position, Quaternion.identity,enemyGroup);enemyAliveCount++;yield return new WaitForSeconds(wave.rate);//等待每个敌人出现间隔的时差}//while(enemyAliveCount != 0)//{//    yield return 0;//}yield return new WaitForSeconds(wave.waveRate);//等待每波之间的时差}foreach (Wave wave in waves2){for (int i = 0; i < wave.count; i++){GameObject.Instantiate(wave.enemyPrefab, START2.position, Quaternion.identity, enemyGroup2);enemyAliveCount++;yield return new WaitForSeconds(wave.rate);//等待每个敌人出现间隔的时差}//while(enemyAliveCount != 0)//{//    yield return 0;//}yield return new WaitForSeconds(wave.waveRate);//等待每波之间的时差}while(enemyAliveCount>0){yield return 0;}Debug.Log("aaaaa");Debug.Log(gameObject);Gamemanager.Instance.Win();}
}

敌人角色脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Enemy1 : MonoBehaviour
{private Transform[] positions;[SerializeField]private int index = 0;[SerializeField]private float speed = 10.0f;[SerializeField] private float hp = 200;private float totalHp;private Slider hpSlider;// Start is called before the first frame updatevoid Start(){positions = SwapPoint.positions;totalHp = hp;hpSlider = GetComponentInChildren<Slider>();TurnRotation();}// Update is called once per framevoid FixedUpdate(){Move();}void Move(){transform.position = Vector3.MoveTowards(transform.position, positions[index].position, Time.deltaTime * speed);//transform.Translate((positions[index].position-transform.position).normalized *Time.deltaTime * speed);if (Vector3.Distance(positions[index].position, transform.position) < 0.4f)//到达转换点,去寻找下一个目标点,同时做出相应的旋转{index++;if (index > positions.Length - 1){ReachDestination();return;}TurnRotation();}}void TurnRotation(){Vector3 rot = transform.eulerAngles;rot.y += positions[index].transform.eulerAngles.y;transform.eulerAngles = rot;}void ReachDestination(){Gamemanager.Instance.Failed();EnemySpawner.enemyAliveCount--;Destroy(this.gameObject);}void Death(){EnemySpawner.enemyAliveCount--;}public void TakeDamage(float damage){if (hp < 0) return;hp -= damage;hpSlider.value = (float)hp / totalHp;if(hp  <= 0){BuildManager.instance.money += 10;EnemySpawner.enemyAliveCount--;Destroy(this.gameObject);}}
}

管理敌人路径

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SwapPoint : MonoBehaviour
{public static Transform[] positions;// Start is called before the first frame updateprivate void Awake(){positions = new Transform[transform.childCount];for(int i =0;i < positions.Length; i++){positions[i] = transform.GetChild(i);}}// Update is called once per framevoid Update(){}
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Turret : MonoBehaviour
{public List<GameObject> enemys = new List<GameObject>();public int attackRateTime = 1;//多少秒攻击一次private float timer = 0;//计时器public GameObject bulletPrefab;//public Transform  firePosition;public bool useLaser = false;public float damagerate = 60;public LineRenderer laserrenderer;public GameObject LaserEffect;public MapCube mapcube;private void OnTriggerEnter(Collider other){if(other.tag == "Enemy"){enemys.Add(other.gameObject);if (other.GetComponent<AttackTower>() != null){other.GetComponent<AttackTower>().Fire(this.transform);}}}private void OnTriggerExit(Collider other){if (other.tag == "Enemy"){enemys.Remove(other.gameObject);}}private void Start(){firePosition = this.transform.Find("FirePosition");timer = attackRateTime;}private void Update(){if (useLaser == false){timer += Time.deltaTime;if (enemys.Count > 0 && timer >= attackRateTime){timer = 0f;Attack();}}else if(enemys.Count>0){if(laserrenderer.enabled == false)laserrenderer.enabled = true;LaserEffect.SetActive(true);if(enemys[0] == null){enemys.RemoveAll(c => c.gameObject == null);}if(enemys.Count>0){laserrenderer.SetPositions(new Vector3[] { firePosition.position, enemys[0].transform.position });if(enemys[0].GetComponent<Enemy1>() != null){enemys[0].GetComponent<Enemy1>().TakeDamage(damagerate * Time.deltaTime);}else{enemys[0].GetComponent<Enemy2>().TakeDamage(damagerate * Time.deltaTime);}LaserEffect.transform.position = enemys[0].transform.position;Vector3 pos = transform.position;pos.y = enemys[0].transform.position.y;LaserEffect.transform.LookAt(pos);}}else{LaserEffect.SetActive(false);laserrenderer.enabled = false;}}void Attack(){if (enemys[0] == null){enemys.RemoveAll(c => c.gameObject == null);}if(enemys.Count > 0){GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);bullet.GetComponent<Bullet>().SetTarget(enemys[0].transform);}}public void RebackMapCube(){mapcube.isUpgraded = false;mapcube.turretGo = null;mapcube.turretGoData = null;}
}

图形学课设 塔防游戏相关推荐

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

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

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

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

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

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

  4. 【Unity小游戏】游戏开发案例,轻松打造一款塔防游戏!(下)

    欢迎来到如何在 Unity 中创建塔防游戏的第二部分.你正在Unity中制作一个塔防游戏,在第一部分结束时,你可以放置和升级怪物.你还有一个敌人攻击饼干. 然而,敌人不知道该面对哪条路!此外,这是攻击 ...

  5. (译)如何使用cocos2d制作一个塔防游戏:引子

    原文链接地址:http://www.iphonegametutorials.com/2011/04/11/cocos2d-game-tutorial-how-to-build-a-tower-defe ...

  6. 塔防游戏的路径寻找算法分析

    在塔防游戏中,有很多敌人都是向着同一目标前进的.在众多塔防游戏当中,有一条或几条预定好的路径.在一些塔防游戏中,比如经典的<Desktop Tower Defense>,你可以将塔放在地图 ...

  7. cocos2d-x游戏实例(10)-塔防游戏(修改地图图素,地图整体缩放)

    小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 塔防游戏在目前的智能机游戏中占据很重要的部分, ...

  8. unity塔防游戏怪物转向_Unity官方新手游戏项目推荐合集

    Unity官方新手游戏项目推荐合集 今天给同学们介绍一些Unity官方发布过的一些游戏项目,这些项目都简化了游戏开发的入门学习过程,可以快速地制作出游戏,适合新手入门体验,下面就带同学们看一看: Un ...

  9. 如何制作一个塔防游戏 Cocos2d x 2 0 4

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...

最新文章

  1. 你连原理都还没弄明白?java的基本单位
  2. java 前端页面传过来的值怎么防止篡改_反爬虫,到底是怎么回事儿?
  3. global与nonlocal关键字
  4. 工业轨式 1-16路 4-20MA 模拟量光端机产品介绍
  5. CSS的三种基础选择器,面试必问
  6. hibernate基于单表curd
  7. 给你1分钟,回答下RabbitMQ如何保证消息不丢?
  8. vue3vite工程里面引入assets目录下的图片文件(一种方法)
  9. 我是如何在5 天内,完成 60 个类的核心模块的重构
  10. eclipse 配置maven tomcat 环境
  11. 微信小程序之点餐系统附源码
  12. Hive调优全方位指南(推荐收藏)
  13. c语言窗体关机程序代码,c语言 关机程序代码
  14. 深夜读萧红《呼兰河传》
  15. 动态矩阵控制(DMC)的简单理解及其示例
  16. 会员制营销与EMAIL营销
  17. 解决visio对象在word中显示不全的问题
  18. 2022建筑架子工(建筑特殊工种)操作证考试题库及在线模拟考试
  19. android x86 mip,mip-appdl
  20. android蓝牙传输文件到mysql_使用Android将图像发送到MySQL数据库

热门文章

  1. Python源码学习笔记:Python程序执行过程与字节码
  2. IT软件培训学校现场面试过程纪要及总结
  3. 最新综述:视频数据的无监督域适应
  4. js 对象动态添加/设置属性名和属性值
  5. dreamweaver作业静态HTML网页设计模板 中国传统书法
  6. 项目中引入阿里巴巴矢量库(unicode)
  7. 周边pd是什么意思_在韩国,PD是什么意思啊?
  8. Android怎么实现数字增减,Android实现数字跳动效果的TextView方法示例
  9. 外贸英语900句之 保险 Insurance
  10. oracle中表结果对比,ORACLE 两个表或两个结果集的数据对比常用的函数