图形学课设 塔防游戏
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;}
}
图形学课设 塔防游戏相关推荐
- 用Unity开发一款塔防游戏(一):攻击方设计
大家好.偶尔想起了这个手把手教学的.但现已长满杂草的坑,还是来挖几铲子. 这一期的游戏是最常见的类型之一--塔防. 塔防游戏相信大家并不陌生,几个主要元素如下: 1.敌方士兵 2.我方防御塔 3.我方 ...
- QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划
作者 | 白家名 责编 | 王晓曼 出品 | CSDN博客 本文作者使用 QT 框架写了一个塔防游戏程序,该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射 ...
- QT实现简单的塔防游戏
QT实现简单的塔防游戏 该程序中实现了购买炮塔.炮塔升级.怪物按照设定路径移动.炮塔自动寻找范围内目标.朝目标怪物发射炮弹.爆炸效果.怪物走到家时我方生命值减少.方便添加关卡等功能. 另附重构版本代码 ...
- 【Unity小游戏】游戏开发案例,轻松打造一款塔防游戏!(下)
欢迎来到如何在 Unity 中创建塔防游戏的第二部分.你正在Unity中制作一个塔防游戏,在第一部分结束时,你可以放置和升级怪物.你还有一个敌人攻击饼干. 然而,敌人不知道该面对哪条路!此外,这是攻击 ...
- (译)如何使用cocos2d制作一个塔防游戏:引子
原文链接地址:http://www.iphonegametutorials.com/2011/04/11/cocos2d-game-tutorial-how-to-build-a-tower-defe ...
- 塔防游戏的路径寻找算法分析
在塔防游戏中,有很多敌人都是向着同一目标前进的.在众多塔防游戏当中,有一条或几条预定好的路径.在一些塔防游戏中,比如经典的<Desktop Tower Defense>,你可以将塔放在地图 ...
- cocos2d-x游戏实例(10)-塔防游戏(修改地图图素,地图整体缩放)
小满(bill man)个人原创,欢迎转载,转载请注明地址,小满(bill man)的专栏地址http://blog.csdn.net/bill_man 塔防游戏在目前的智能机游戏中占据很重要的部分, ...
- unity塔防游戏怪物转向_Unity官方新手游戏项目推荐合集
Unity官方新手游戏项目推荐合集 今天给同学们介绍一些Unity官方发布过的一些游戏项目,这些项目都简化了游戏开发的入门学习过程,可以快速地制作出游戏,适合新手入门体验,下面就带同学们看一看: Un ...
- 如何制作一个塔防游戏 Cocos2d x 2 0 4
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本文实践 ...
最新文章
- 你连原理都还没弄明白?java的基本单位
- java 前端页面传过来的值怎么防止篡改_反爬虫,到底是怎么回事儿?
- global与nonlocal关键字
- 工业轨式 1-16路 4-20MA 模拟量光端机产品介绍
- CSS的三种基础选择器,面试必问
- hibernate基于单表curd
- 给你1分钟,回答下RabbitMQ如何保证消息不丢?
- vue3vite工程里面引入assets目录下的图片文件(一种方法)
- 我是如何在5 天内,完成 60 个类的核心模块的重构
- eclipse 配置maven tomcat 环境
- 微信小程序之点餐系统附源码
- Hive调优全方位指南(推荐收藏)
- c语言窗体关机程序代码,c语言 关机程序代码
- 深夜读萧红《呼兰河传》
- 动态矩阵控制(DMC)的简单理解及其示例
- 会员制营销与EMAIL营销
- 解决visio对象在word中显示不全的问题
- 2022建筑架子工(建筑特殊工种)操作证考试题库及在线模拟考试
- android x86 mip,mip-appdl
- android蓝牙传输文件到mysql_使用Android将图像发送到MySQL数据库
热门文章
- Python源码学习笔记:Python程序执行过程与字节码
- IT软件培训学校现场面试过程纪要及总结
- 最新综述:视频数据的无监督域适应
- js 对象动态添加/设置属性名和属性值
- dreamweaver作业静态HTML网页设计模板 中国传统书法
- 项目中引入阿里巴巴矢量库(unicode)
- 周边pd是什么意思_在韩国,PD是什么意思啊?
- Android怎么实现数字增减,Android实现数字跳动效果的TextView方法示例
- 外贸英语900句之 保险 Insurance
- oracle中表结果对比,ORACLE 两个表或两个结果集的数据对比常用的函数