塔防游戏 Day2
1. 创建炮塔选择的 UI
使用 UI -> Toggle 。注意指定同一 group。
2. 创建炮台的数据类
[System.Serializable] // 序列化
public class TurretData{
public GameObject turretPrefab; // 炮塔模型
public int cost; // 建造炮塔花费
public GameObject turretUpgradedPrefab; // 升级炮塔模型
public int costUpgraded; // 升级花费
public TurretType type; // 炮台类型
} public enum TurretType // 炮塔类型
{
LaserTurret,
MissileTurret,
StandardTurret
}
3. 监听炮塔选择的事件
在 Inspector 中指定 On Value Changed 触发函数。

public void onLaserSelected(bool isOn) // 当监听变量发生变化时触发
{
if (isOn)
{
selectedTurretData = laserTurretData;
}
} public void onMissileSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = missileTurretData;
}
} public void onStandardSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = standardTurretData;
}
}
4. 鼠标点击创建炮塔
void Update()
{
if (Input.GetMouseButtonDown()) // 监测鼠标左键点击
{
if (!EventSystem.current.IsPointerOverGameObject()) // 鼠标没有点击 UI 图标
{
// 有鼠标所在位置发射射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; // 存储射线碰撞物
bool isCollider = Physics.Raycast(ray, out hit, , LayerMask.GetMask("MapCube"));
if (isCollider)
{
MapCube mapCube = hit.collider.GetComponent<MapCube>(); // 获取点击方块
// 当前已选择炮台且方块上没有放置炮台
if (selectedTurretData != null && mapCube.turretGo == null)
{
if (money > selectedTurretData.cost) // 钱够用
{
ChangeMoney(-selectedTurretData.cost);
mapCube.BuildTurret(selectedTurretData.turretPrefab);
}
else
{
// 钱不够,则触发动画
moneyAnimator.SetTrigger("Flicker");
}
}
else if (mapCube.turretGo != null)
{
// TODO 升级处理
}
}
}
}
}
// 建造炮塔
public void BuildTurret(GameObject turretPrefab)
{
// 实例化炮塔模型
turretGo = GameObject.Instantiate(turretPrefab, transform.position, Quaternion.identity);
// 产生建造特效
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, ); // 一秒后销毁特效
}
5. 检测炮塔附近的敌人
public class Turret : MonoBehaviour {
// 存储炮塔攻击范围内的敌人
public List<GameObject> enemys = new List<GameObject>();
void OnTriggerEnter(Collider col)
{
if (col.tag == "Enemy") // 敌人进入
{
enemys.Add(col.gameObject);
}
}
void OnTriggerExit(Collider col)
{
if (col.tag == "Enemy") // 敌人离开
{
enemys.Remove(col.gameObject);
}
}
public float attackRateTime = ; // 攻击频率
private float timer = ; // 记录时间
public GameObject bulletPrefab; // 子弹模型
public Transform firePosition; // 子弹生成位置
public Transform head; // 炮塔头部位置
void Start()
{
timer = attackRateTime; // 有敌人立刻攻击
}
void Update()
{
if (enemys.Count > )
{
if (enemys[] != null)
{
// 炮塔头部转向敌人位置
Vector3 targetPosition = enemys[].transform.position;
targetPosition.y = head.position.y; // 要注意高度相同
head.LookAt(targetPosition);
}
timer += Time.deltaTime;
if (timer >= attackRateTime) // 攻击
{
timer -= attackRateTime;
Attack();
}
}
}
void Attack()
{
if (enemys[] == null) // 若第一个敌人为空
{
updateEnemys(); // 更新攻击范围内敌人
}
if (enemys.Count > )
{
// 实例化子弹
GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);
bullet.GetComponent<Bullet>().setTarget(enemys[].transform);
}
else
{
timer = attackRateTime;
}
}
// 去除已经死亡的敌人
void updateEnemys()
{
List<int> emptyIndex = new List<int>();
for (int i = ; i < enemys.Count; ++i)
{
if (enemys[i] == null)
{
emptyIndex.Add(i);
}
}
for (int i = ; i < emptyIndex.Count; ++i)
{
enemys.RemoveAt(emptyIndex[i] - i);
}
}
}
6. 敌人添加血条设计
使用 UI -> Slider
hpSlider.value = (float)hp / totalHp; // 更新血条

7.
塔防游戏 Day2的更多相关文章
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(三)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇 二.本篇目标: l 说说游戏中各种角色的动作.属性以及重构思路 l 进行代码重构让色狼大叔和 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l 说说关于cocos2dx手机分辨率适配 l 对前一篇完成的塔防游戏原型进 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)
一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l 说说关于塔防游戏的想法和思路 l 实现一个简单的塔防游戏 ...
- 三国塔防游戏android源码
三国塔防游戏源码,这个游戏源码比较完整的,因为上传有20M限制,把代码工程包分开了,主文件是TFGame,其他res大家按照安卓包加进去就行,欢迎下载并交流 ,大家可以参考一下吧.<ignore ...
- HTML5塔防游戏——《三国塔防》 - Yorhom's Game Box
h3{ font-size:20px; } HTML5塔防游戏--<三国塔防> 游戏介绍: <三国塔防>是一款基于HTML5和Javascript的2D塔防游戏.游戏中除了塔防 ...
- HTML5另类塔防游戏 -《三国战线》公布
关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...
- [译]终极塔防——运用HTML5从头创建一个塔防游戏
翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
- 使用Unity创建塔防游戏(Part1)
How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...
随机推荐
- 使用jenkins持续集成自动化测试
本文采用Springboot开发一个简易的添加个人资料和查询个人资料接口,并采用testng进行测试,使用jenkis进行持续继承,allure输出测试报告. 个人资料查询接口开发(集成H2数据库) ...
- ueditor使用小结【来源网络】
原文地址:http://www.cnblogs.com/janes/p/5072496.html ueditor是百度编辑器,官网地址:http://ueditor.baidu.com/website ...
- BZOJ2131 免费的馅饼【线段树优化DP】
Input 第一行是用空格隔开的二个正整数,分别给出了舞台的宽度W(1到10^8之间)和馅饼的个数n(1到10^5). 接下来n行,每一行给出了一块馅饼的信息.由三个正整数组成,分别表示了每个馅饼落到 ...
- LOJ2424 NOIP2015 子串 【DP】*
LOJ2424 NOIP2015 子串 LINK 题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数 首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算 然后设dpi,j, ...
- BZOJ3566 SHOI2014 概率充电器 【概率DP】
BZOJ3566 SHOI2014 概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能 ...
- 【DUBBO】dubbo架构详解(转载)
转载地址:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...
- Web 漏洞分析与防御之 CSRF(二)
原文地址:Web 漏洞分析与防御之 CSRF(二) 博客地址:http://www.extlight.com 一.全称 跨站请求伪造(Cross-site Request Forgery) 二.原理 ...
- 没有80端口的备案域名,如何做微信公众平台的开发?本文介绍可以通过任何域名来做开发,www.baidu.com和www.163.com和www.so.com这样的域名都可以
1.首先做过微信开发的朋友都知道,微信后台需要绑定80端口的备案域名,如果此时手上没有80端口的备案域名就不能进行开发了吗?当然不是 首先在这些地方绑定一个备案域名,国内公司的网址基本上是有备案的如w ...
- pycaffe + anaconda2 + python2.7.配置
1.首先要把caffe-windows用VS2013编译好(这一步很多门道,很麻烦很多坑),编辑props文件,使python支持选项开启,单独编译pycaffe项目就可以 2.将生成的在build/ ...
- CentOS 7 named设置主从复制
前两篇文章介绍了named的安装和配置forward. 本文将介绍named的主从复制. 在从named的配置中添加: zone "weiheng.ink" IN { type s ...