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.

最新文章

  1. Devexpress WPF Theme Editor 02
  2. There are no resources that can be added or removed from the server
  3. Java(数组)动手动脑
  4. lvs DR模式下vip的端口无法telnet
  5. 在设置代理的环境下使用SharePoint CSOM
  6. 自定义一个叫 ReadOnlyXmlMembershipProvider 的 MembershipProvider,用 XML 作为用户储藏室
  7. 每日Scrum--No.4
  8. POJ 3009 Curling 2.0 回溯,dfs 难度:0
  9. pureftpd安装配置-pureftp参数详解(一)
  10. Jquery选择器,操作DOM
  11. Javascript进阶篇——( JavaScript内置对象---下)--Math对象---笔记整理
  12. BroadcastReceiver的两种注册方式之------静态注册
  13. 深入设计电子计算器(一)——CPU指令集设计
  14. 学习JAVA的几大优处
  15. linux实时文件事件监听--inotify
  16. centos7之关于时间和日期以及时间同步的应用
  17. Android Studio 合并分支代码到主干的操作总结
  18. hibernate 5的二级缓存案例讲解
  19. python dictionay(字典 )基本用法
  20. ReentrantReadWriteLock——读读共享(一)

热门文章

  1. HihoCoder 1063 : 缩地 树形DP第二题(对象 边)
  2. request接收表单提交数据及其中文参数乱码问题
  3. 从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配
  4. 记录一些WPF常用样式方便以后复用(转)
  5. 关于RAS加密中pfx格式提取字符串私钥 (转)
  6. 洛谷八连测R4
  7. [Java][Web]利用 referer 防盗链
  8. [Java][Web]Response学习.缓存
  9. 【转】Hadoop学习路线图
  10. Hive使用入门