Unity-3D塔防
技术点:
1. UGUI 事件的绑定 动画的制作
2. 创建preFab对象
3. 类对象的封装
4. 泛型集合List
实现效果:
在整个游戏开发过程中,游戏设计思路很重要,实现的方法其次,先是搭建游戏的场景,场景搭建完毕之后,创建敌人的预设和你的炮塔的预设,在这里面需要用到泛型集合List,以及封装类对象,产生类的对象集合,
封装类的对象 public Wave[] waves;
根据敌人的预设,不断产生敌人按照每波敌人产生,中间设置等待时间。
void Start() {
StartCoroutine(SpawnEnemy());
}
IEnumerator SpawnEnemy() {
foreach(Wave wave in waves ){
for (int i=0;i<wave.count ;i++ )
{
GameObject.Instantiate(wave.enemyPreFab,START.position,Quaternion.identity);
EnemyCount++;
yield return new WaitForSeconds(wave.rate);
}
while (EnemyCount>0)
{
yield return 0;
}
yield return new WaitForSeconds(waitTime);
}
}
等待敌人产生之后 设置敌人的运动轨迹,通过不带的设置坐标 实现敌人的轨迹行走
void Move() {
if (index > positions.Length - 1)
return;
transform.Translate((positions[index].position-transform.position).normalized*Time.deltaTime*speed);
if(Vector3.Distance(positions[index].position,transform.position)<0.2f)
{
index++;
}
if (index > positions.Length - 1)
{
RechDestination();
}
}
当敌人走到终点时 销毁敌人
void RechDestination() {
GameObject.Destroy(this.gameObject);
}
根据初始金钱去建造炮塔
判断当前点击的地,是否存在炮塔,和金钱是否够用,将预设炮塔实例化生成在场景中,
void Update() {
if (SelectTurrentData != null&&Input.GetMouseButtonDown(0))
{
//如¨?果?点Ì?击¡Â的Ì?不?是º?UI
if(EventSystem.current.IsPointerOverGameObject()==false)
{
//炮¨²台¬¡§的Ì?建¡§造¨¬
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//可¨¦以°?省º?去¨£¤距¨¤离¤?直¡À接¨®发¤¡é射¦?射¦?线?
bool istrueet=Physics.Raycast(ray, out hit,1000, LayerMask.GetMask("MapCube"));
if (istrueet)
{
//获?取¨?当Ì¡À前¡ã点Ì?击¡Â的Ì?块¨¦
MapCube mapCube = hit.collider.GetComponent<MapCube>();
if (SelectTurrentData != null && mapCube.turrentGo == null)
{
//可¨¦以°?创ä¡ä建¡§
//再¨´次ä?判D断?钱?是º?否¤?够?
if (money >= SelectTurrentData.cost)
{
ChangeMoney(-SelectTurrentData.cost);
mapCube.BuildTurrent(SelectTurrentData.TurrentPrefab);
}
else
{
//钱?不?够?
moneyAnimator.SetTrigger("MoneyTrigger");
}
}
else if (mapCube.turrentGo != null)
{
//做Á?升¦y级?处ä|理¤¨ª
//if (mapCube.isUpdreged)
//{
// showUpgragededUI(mapCube.transform.position, true);
//}
//else
//{
// showUpgragededUI(mapCube.transform.position,false);
//}
if (mapCube.turrentGo == selectTurrentGo && updgerdedcanvas.activeInHierarchy)
{
hideUpgragededUI();
}
else
{
showUpgragededUI(mapCube.transform.position, mapCube.isUpdreged);
}
selectTurrentGo = mapCube.turrentGo;
}
}
}
}
}
炮塔攻击,给炮塔添加碰撞体,敌人进入碰撞体,开始创建子弹,目标点敌人,
void Attack() {
//修T改?BUG 目?标À¨º销¨²毁¨´ 不?在¨²创ä¡ä造¨¬子Á¨®弹Ì¡¥
if(enemys[0]==null)
{
UpdateEnemys();
}
if (enemys.Count > 0)
{
GetComponent<AudioSource>().Play();
GameObject Bullit = GameObject.Instantiate(builltPreFab, firePosition.position, firePosition.rotation);
Bullit.GetComponent<Built>().SetTarget(enemys[0].transform);
}
else
{
timer = attackRateTime;
}
}
子弹面朝敌人运动
void Update() {
if (target== null)
{
Destroy(this.gameObject);
return;
}
transform.LookAt(target.position);
transform.Translate(Vector3.forward * speed * Time.deltaTime);
Vector3 dir = target.position - this.transform.position;
if (dir.magnitude < 1.3f)
{
target.GetComponent<Enemy1>().TakeDamage(damage);
Die();
}
}
子弹碰撞到敌人,敌人呢掉血,子弹消失
void Die() {
GameObject effect = GameObject.Instantiate(explosionEffict, transform.position, transform.rotation);
Destroy(effect,1);
Destroy(this.gameObject);
}
敌人开始掉血
public void TakeDamage(int damage) {
if (hp <= 0)
return;
hp -= damage;
silderHp.value = (float)hp / totleHp;
if(hp<=0)
{
Die();
}
}
void Die() {
BuildManger._instance.addMoney(money);
Destroy(this.gameObject);
GameObject exp=GameObject.Instantiate(expliseenemy,transform.position,transform.rotation);
Destroy(exp,1);
}
血量为0时死亡。