Demo_塔防(自动生成怪物,导航,炮塔攻击,怪物掉血死忙)

using UnityEngine;
using System.Collections;

public struct WaveMsg
{
    //该波次生成的怪物
    public GameObject monster;
    //时间间隔
    public float waveInterval;
    //生成个数
    public float count;
    //生成间隔
    public float interval;
    //怪物血量
    public float hp;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="monster">Monster.</param>
    /// <param name="waveInterval">Wave interval.</param>
    /// <param name="count">Count.</param>
    /// <param name="interval">Interval.</param>
    public WaveMsg(GameObject monster,float waveInterval,
            float count,float interval,float hp)
    {
        this.monster = monster;
        this.waveInterval = waveInterval;
        this.count = count;
        this.interval = interval;
        this.hp = hp;
    }
}

public class MonsterInit : MonoBehaviour {

    //怪物预设体
    public GameObject[] monsters;
    //波次信息
    public WaveMsg[] waveMsg;
    //每波怪之间的时间计时器
    private float waveTimer;
    //每个怪之前的时间计时器
    private float monsterTimer;
    //波次计数器
    private int count;
    //怪物个数计数器
    private int monsterCount;
    //游戏开关
    private bool gameBegin = true;

    void Awake()
    {
        waveMsg = new WaveMsg[]{
            new WaveMsg(monsters[0],0,3,2,10),
            new WaveMsg(monsters[1],2.5f,5,1.5f,15),
            new WaveMsg(monsters[2],2,10,1f,20),
            new WaveMsg(monsters[1],2,10,0.5f,25),
            new WaveMsg(monsters[0],2,15,0.5f,30)
        };
    }

    void Update()
    {
        if (gameBegin) {
            //波次计时器计时
            waveTimer += Time.deltaTime;
            if (waveTimer >= waveMsg [count].waveInterval) {
                //如果当前生成怪的个数不够,继续生成
                if (monsterCount < waveMsg [count].count) {
                    //计时器计时
                    monsterTimer += Time.deltaTime;
                    //计时结束
                    if (monsterTimer > waveMsg [count].interval) {
                        //生成怪物
                        GameObject currentMaster = Instantiate (
                            waveMsg [count].monster,
                            transform.position,
                            Quaternion.identity) as GameObject;
                        //给新生成的怪物设置血量值
                        currentMaster.GetComponent<Monster> ().hp =
                            waveMsg [count].hp;
                        //怪物个数++
                        monsterCount++;
                        //计时器清零
                        monsterTimer = 0;
                    }
                } else {
                    //波次加一
                    count++;
                    if (count < waveMsg.Length) {
                        //怪物个数清零
                        monsterCount = 0;
                        //波次计时器清零
                        waveTimer = 0;
                    } else {
                        //表示怪兽生成结束
                        gameBegin = false;
                    }
                }
            }
        }
    }
}

using UnityEngine;
using System.Collections;

public class GameOver : MonoBehaviour {

    //血量
    public int hp = 10;

    //触发
    void OnTriggerEnter(Collider other)
    {
        //如果是怪物
        if (other.tag == "Monster") {
            //减血操作
            if (--hp <= 0) {
                Debug.Log ("GameOver");
            }
            //销毁怪物
            Destroy (other.gameObject);
        }
    }
}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GaussAttack : MonoBehaviour {

    //攻击队列
    Queue<Transform> monsters;
    //当前攻击目标
    public Transform currentTarget;
    //炮筒旋转速度
    public float turnSpeed = 10;
    //发射特效
    private GameObject muzzle;
    //炮塔伤害值
    public float damage = 30;

    void Awake()
    {
        monsters = new Queue<Transform> ();
        muzzle = transform.Find ("Base/Turret/Muzzle_1").gameObject;
    }

    void Update()
    {
        if (currentTarget) {
            //转向
            LookAtTargetSmooth();
            //给敌人减血
            currentTarget.GetComponent<Monster>().hp-=Time.deltaTime * damage;
            //如果当前目标已经死亡
            if (!currentTarget.GetComponent<Monster> ().monsterAlive) {
                //切换下一个目标
                TargetSwitch ();
            }
        }
    }

    /// <summary>
    /// 平滑旋转看向敌人
    /// </summary>
    void LookAtTargetSmooth()
    {
        //方向向量
        Vector3 dir = currentTarget.position - transform.position;
        //目标旋转
        Quaternion qua = Quaternion.LookRotation (dir);
        //先找到炮筒
        Transform gun = transform.GetChild (0).GetChild (0);
        //炮筒转向目标四元数
        gun.rotation = Quaternion.Lerp (gun.rotation, qua,
            Time.deltaTime * turnSpeed);
    }

    /// <summary>
    /// 进入攻击范围
    /// </summary>
    /// <param name="other">Other.</param>
    void OnTriggerEnter(Collider other)
    {
        //如果是怪物
        if (other.tag == "Monster") {
            //进队列
            monsters.Enqueue (other.transform);
            // 如果没有攻击目标
            if (currentTarget == null) {
                TargetSwitch ();
            }
        }
    }

    void OnTriggerExit(Collider other)
    {
        //如果是怪物,且在队列内
        if (other.tag == "Monster" && other.transform == currentTarget) {
            //切换下一个目标
            TargetSwitch ();
        }
    }

    /// <summary>
    /// 切换目标
    /// </summary>
    void TargetSwitch()
    {
        //如果队列中有数据
        if (monsters.Count > 0) {
            //队列中出来的怪物即为下一个攻击目标
            currentTarget = monsters.Dequeue ();
            //有怪,开枪
            muzzle.SetActive (true);
        } else {
            //如果队列中没有数据,此时目标为空
            currentTarget = null;
            //没怪,停止开枪
            muzzle.SetActive (false);
        }
    }
}

using UnityEngine;
using System.Collections;

public class CameraMove : MonoBehaviour {

    private float hor,ver;
    public float moveSpeed = 3;

    void Update()
    {
        hor = Input.GetAxis ("Horizontal");
        ver = Input.GetAxis ("Vertical");

        transform.position += new Vector3 (hor,0,ver)
            * Time.deltaTime * moveSpeed;
        //24 0 2
        //40 0 35

        transform.position = new Vector3 (
            Mathf.Clamp(transform.position.x,24f,40f),
            transform.position.y,
            Mathf.Clamp(transform.position.z,2f,35f)
        );

    }

}
using UnityEngine;
using System.Collections;

public class TowerInit : MonoBehaviour {

    //射线碰撞检测器
    RaycastHit hit;
    //炮塔预设体
    public GameObject towerPrefab;

    void Update()
    {
        //获取屏幕射线
        Ray r = Camera.main.ScreenPointToRay (
            Input.mousePosition);
        //射线碰撞到了碰撞体
        if (Physics.Raycast (r, out hit)) {
            //如果该物体名字中包含‘Base’字符串,且基座没有子物体
            if (hit.collider.name.Contains ("Base") &&
                hit.transform.childCount == 0) {
                if (Input.GetMouseButtonDown (0)) {
                    ///TODO:生成炮塔
                    GameObject currentTower = Instantiate (
                        towerPrefab,
                        hit.transform.position + Vector3.up * 2.7f,
                        Quaternion.identity) as GameObject;
                    //设置炮塔为基座的子物体
                    currentTower.transform.SetParent (hit.transform);
                }
            }
        }
    }

}

炮塔需要触发事件设置好范围来检测怪物,进入范围触发事件攻击。

地图设置导航。

怪物添加刚体,设置动力学。避免出现碰撞弹奏,或者穿透现象。

时间: 2024-10-19 08:07:42

Demo_塔防(自动生成怪物,导航,炮塔攻击,怪物掉血死忙)的相关文章

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&amp;怪物受伤---所有源码和资源完结下载

好吧,到这一步,整个游戏基本上弄完啦,由于自己的水平也就这样.....重写的过程中很多细节处理的不好. 游戏中很多地方都留下了可扩充的代码,可是时间方面有点不够...而且也没美工 本次笔记内容: 1.思路&代码&效果展示 2.完结代码&资源下载 一:思路&代码 后面的内容基本上是木头书上的内容,没什么太大修改 和之前很多地方一样,把子弹单独抽离出来,然后绑定在英雄身上,那么英雄就可以带着子弹进行攻击 这样也方便之后的扩展.....毕竟这个游戏很多地方都是基本的,但是也留给可

Markdown使用TOC自动生成导航栏

经常使用markdown 的玩家一定很想要一个自动生成的导航栏吧,自己写的基本思路就是 轮询监听滚动条的位置,通过抛锚和跳锚实现,这里介绍一下今天的主角,markdown-toc插件: https://github.com/jonschlinkert/markdown-toc # 0x00 安装 TOC = Table of content , 将内容制作成导航 这个插件是基于 nodejs 的,因此需要安装 node 和 npm ,这里同样采用nvm的形式安装 curl -o- https:/

[转]JavaScript自动生成博文目录导航

转自:http://www.cnblogs.com/xdp-gacl/p/3718879.html 我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做

3D塔防游戏实现 4.2 3D怪物连续刷新(Feekood语言)

(Feekood语言介绍与习) http://www.wooyoogame.com/doc/index(学习) http://www.wooyoogame.com(首页) http://www.feekood.com/ (开发页面) ---------- 该阶段同样用到http://www.wooyoogame.com资源: http://www.wooyoogame.com/resource/5399 (3D蝎子 ) http://www.wooyoogame.com/resource/507

sharepoint 2013 中自建母版页,自动生成html中的顶部导航代码步骤

sharepoint 2013 中自建母版页,自动生成html中的顶部导航代码步骤 分类: SharePoint2013-07-05 11:21 738人阅读 评论(0) 收藏 举报 SharePointsharepoint 2013 1.点击打开设计编辑器:编辑母版页项目 2.找到或者新建一个测试页面(.html),点击网页右上方的"代码段"打开 3.点击代码段打开如下页面,点击对应导航便会自动生成html中可以直接是用的导航代码 4.复制代码段到html模板中相应位置(自行定义,可

JavaScript自动生成博文目录导航

我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做吧,研究了2天,总算是按照自己的设想做出来了,最终效果如下: 下面来介绍一下这个小工具的实现. 一.

JavaScript自动生成博文目录导航/TOP按钮

博客园页面添加返回顶部TOP按钮 进入网页管理->设置 在"页面定制CSS代码"中添加如下css样式,当然你可以改为自己喜欢的样式 此处可以将背景色background-color改为: background:url(http://images.cnblogs.com/cnblogs_com/gitwow/1393973/o_o_o_toTop.png) no-repeat -70px top; 在"页脚Html代码"中添加如下代码,可以将文字改为图片 此处&

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第八部---怪物出场

/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别完全照搬代码:第二可以说明是学习笔记---好人 **3.这里用cocos2d-x 3.0版本重写,很多地方不同,但是从重写过程中也很好的学习了cocos2d-x */ ***每一步对应的所有代码以及用到的资源都会打包在最后给出 ***为避免代码过多,每一步的代码都做了标记--一看就晓得是第几步实现的避免出错改不回去(难不成还用Git

远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

下载地址:spm=686.1000925.0.0.j3MZhz&id=550780702354" style="color:rgb(224,102,102)">下载地址 本源代码高度模仿IOS游戏王国保卫战,由国外IOS商业开发教程站点raywenderlich内部project师制作,有很完整的关卡设计,战斗流程,长达12个关卡,各种敌兵,怪物,箭塔,炮塔一应俱全,还有魔法系统,成就系统以及后台数据库.差点儿达到了能够上线的商业游戏级别. 代码严格规范,提供了