塔防游戏 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 ...
随机推荐
- LOJ2360. 「NOIP2016」换教室【概率DP】【Floyed】【傻逼题】
LINK 思路 先floyed出两点最短路 然后就可以直接\(dp_{i,j,0/1}\)表示前i节课选择换j节,换不换当前这一节的最小贡献 直接可以枚举上一次决策的状态计算概率进行统计就可以了 我变 ...
- 20179223《Linux内核原理与分析》第三周学习笔记
测试3的实验: 1. 用gcc -g编译vi输入的代码 2. 在main函数中设置一个行断点 3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点 4. 提交调 ...
- JAVA类的加载、连接与初始化
JAVA类的加载.连接与初始化 类的声明周期总共分为5个步骤1.加载2.连接3.初始化4.使用5.卸载 当java程序需要某个类的时候,java虚拟机会确保这个类已经被加载.连接和初始化,而连接这个类 ...
- hdfs会出现的一些问题
实训的第一篇博客献给坑了我的hdfs…… 由于电脑的原因,突然花屏,虚拟机来不及挂起.之后发现50070端口进不去,查看jps进程发现没有namenode 先用stop-all.sh命令再start还 ...
- 《DSP using MATLAB》示例Example 6.8
今天情人节,又在外地出差,苦逼中…… 继续写读书笔记吧. 代码: % All-Zeros FIR filter to Lattice structure filter b = [2, 13/12, 5 ...
- OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析
1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...
- Oracle存储过程记录异常日志
一般我们会将一些涉及到数据库的定时任务直接用存储过程搞定,省去了后端代码的开发.部署,简单.快速,但这种方式存在一个弊端——当存储过程执行出错了,我们无法感知.解决办法也简单,学代码那样去捕获异常.打 ...
- Error[Li006]: duplicate definitions for "******"
今天参考别人程序写程序时出现Error[Li006]: duplicate definitions for "******". 参考程序中将变量和数据定义在(.h)文件中,我也就直 ...
- dts、dtb编译
设备树(Device Tree)包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob). dtc编译器能够把 ...
- 后台判断ajax请求的请求后字段
headers设置:X-Requested-With:XMLHttpRequest 后台我就是根据这个来判断的