小白贪狼做塔防(5)

下面,我们为游戏加一点变数——天气
最初的设想为晴天时,火焰·炮弹防御塔正常运行,弩箭·激光武器威力加1/2,冰塔减速效果削弱;雨天时,火焰·炮弹伤害减半,减速效果提升,雪天火焰·炮弹伤害减3/4,除减速的冰塔,其余防御塔攻速减半。

然后我们下载一个雨雪的插件,或者自己写也行。
unity3d 游戏插件 移动平台天气系统 UniStorm Mobile
链接: http://pan.baidu.com/s/1sjIEY41
密码: n23b

unity3d 游戏插件 天气 气候 模拟 Nuaj' v1.2 天气制作系统
链接: http://pan.baidu.com/s/1pJvIyKz
密码: r289

unity3d 游戏插件 Storm Effects 天气特效支持IOS
链接: http://pan.baidu.com/s/1qW00hqc
密码: p6qn

我使用的是第三个。
那么开始动手吧!
首先创建一个空物体,并放在在合适的位置,并创建WeatherController脚本控制天气转变,代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeatherController : MonoBehaviour 
{
    private GameObject Wea;
    public int weather = 0;
    GameObject o = null;
    private int oldweather;
    void Awake()
    {
        Wea = (GameObject)Resources.Load("Weather/Clouds Light");
        
    }
    public void Change()
    {
        if (weather == 0)
        {
            Wea = (GameObject)Resources.Load("Weather/Clouds Light");
        }
        else if (weather == 1)
        {
            Wea = (GameObject)Resources.Load("Weather/Rain Mobile Heavy");
        }
        else if (weather == 2)
        {
            Wea = (GameObject)Resources.Load("Weather/Snow Medium Happy");
        }
        if (transform.GetChildCount() == 0)
        {
            o = Instantiate(Wea, transform.position , Wea.transform.rotation) as GameObject;
            o.transform.parent = transform;
            oldweather = weather;
        }
        else if (transform.GetChildCount() > 0 && weather != oldweather)
        {
            Destroy(transform.GetChild(0).gameObject);
            o = Instantiate(Wea, transform.position , Wea.transform.rotation) as GameObject;
            o.transform.parent = transform;
            oldweather = weather;
        }
    }   
}

我暂时打算分波次改变天气(随机也行,固定也可,随你喜欢),weather记录当前天气编号,oldweather记录上一次天气编号,如果前后不同才更新,否则不变(减少实例化和销毁次数),然后在EnemyCreatePos 脚本的Test02协程中,随机weather值,达到改变天气从而改变防御塔的作用(防止玩家过分依赖某一种防御塔)。

然后更改CheckEnemy脚本:

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

public class CheckEnemy : MonoBehaviour 
{
    private WeatherController wc;
    /// <summary>
    /// 是否能打到飞行怪
    /// </summary>
    public bool IsHitFly;
    /// <summary>
    /// 开火频率
    /// </summary>
    public float firewaittime = 2;
    private float fw;
    private float dv;
    /// <summary>
    /// 炮塔价格
    /// </summary>
    public float value = 100;
    /// <summary>
    /// 临时ID,测试
    /// </summary>
    public int idi = 0;
    /// <summary>
    /// 是否是特效炮塔,比如激光,火焰枪
    /// </summary>
    public bool IsEffectTow;
    /// <summary>
    /// 炮塔转动速度
    /// </summary>
    public float turnSpeed = 10;
    /// <summary>
    /// 最远攻击距离
    /// </summary>
    public float disFire = 12;
    /// <summary>
    /// 是否有正在攻击的目标
    /// </summary>  
    private bool isAlarm;
    /// <summary>
    /// 子弹
    /// </summary>
    public GameObject ziDan;
    /// <summary>
    /// 子弹生成位置
    /// </summary>
    public Transform firePos;
    /// <summary>
    /// 攻击目标
    /// </summary>
    private Transform targetEnemy;
    /// <summary>
    /// 存储所有检测到的敌人
    /// </summary>
    private List<Transform> enemyList;
    /// <summary>
    /// 开火的协程是否开启
    /// </summary>
    private bool isFire = false;
    void Start () 
    {
        fw = firewaittime;
        wc = GameObject.Find("Weather").GetComponent<WeatherController>();
        enemyList = new List<Transform>();
        //if (ziDan.name == "ZhaDan" || ziDan.name == "FireIce")
        //{
        //    IsHitFly = false;
        //}
        //else {
        //    IsHitFly = true;
        //}
        //如果是特效炮塔,关闭特效
        if (IsEffectTow) {
            if (transform.GetComponentInChildren<ParticleSystem>() != null) {
                transform.GetComponentInChildren<ParticleSystem>().Stop();
            }
        }
    }
    
    void Update () {
        //攻击队列里有敌人
        if (enemyList.Count != 0)
        {
            if (enemyList[0] == null) 
            {
                if (enemyList.Count != 1)
                {
                    enemyList[0] = enemyList[1];
                    enemyList.Remove(enemyList[1]);
                }
                else {
                    enemyList = new List<Transform>();
                }
            }     
            else 
            {
                if (!isFire)
                {
                    isFire = true;
                    StartCoroutine("Fire");
                }
                //瞄准敌人
                //transform.LookAt(enemyList[0]);
                if (transform.name != "HighTower") 
                {
                    Vector3 direction = enemyList[0].position - transform.GetChild(0).GetChild(0).position + new Vector3(0, 1.2f, 0);
                    Quaternion qua = Quaternion.LookRotation(direction);
                    transform.GetChild(0).GetChild(0).rotation = Quaternion.Lerp(transform.GetChild(0).GetChild(0).rotation, qua, Time.deltaTime * turnSpeed);
                }
                
                ////如果敌人脱离攻击范围,或者死亡                   
                if (enemyList[0].GetComponent<EnemyContrl>().Blood <= 0)
                {
                    enemyList.Remove(enemyList[0]);
                }
            }         
        }
        else {
            if (isFire) 
            {
                StopCoroutine("Fire");
                if (IsEffectTow) {
                    transform.GetComponentInChildren<ParticleSystem>().Stop();
                }            
                isFire = false;
                enemyList = new List<Transform>();
            }
        }
    }
    /// <summary>
    /// 检测触发物是否为敌人,是的话放入攻击列表
    /// </summary>
    void OnTriggerEnter(Collider other) 
    {
        if (IsHitFly)
        {
            if (other.transform.tag == "Enemy" || other.transform.tag == "FlyEnemy")
            {
                if (!enemyList.Contains(other.transform))
                {
                    enemyList.Add(other.transform);
                }
            }
        }
        else 
        {
            if (other.transform.tag == "Enemy")
            {
                if (!enemyList.Contains(other.transform))
                {
                    enemyList.Add(other.transform);
                }
            }
        }       
    }
    void OnTriggerExit(Collider other)
    {
        if (other.transform.tag == "Enemy" || other.transform.tag == "FlyEnemy")
        {
            if (enemyList.Contains(other.transform))
            {
                enemyList.Remove(other.transform);
            }
        }
    }

    /// <summary>
    /// 炮塔射击敌人
    /// </summary>
    IEnumerator Fire() {
        //播放特效
        if (IsEffectTow) {
            transform.GetComponentInChildren<ParticleSystem>().Play();
        }
        GameObject go = null;
        while (true) 
        {
            yield return new WaitForSeconds(firewaittime);
            if (enemyList.Count != 0 && enemyList[0] != null)
            {
                //生成子弹并指定发射的目标
                 go = Instantiate<GameObject>(ziDan, firePos.transform.position, firePos.transform.rotation);                 
                if (transform.tag == "Pao")
                {
                    dv = go.GetComponent<ZhaDan>().damageValue;
                    go.GetComponent<ZhaDan>().target = enemyList[0];
                }
                else if(transform.tag == "NoPao")
                {
                    go.GetComponent<Bullet>().target = enemyList[0];
                }
                if (go.tag == "Bomb")
                {
                    go.GetComponent<ZhaDan>().damageValue = dv;
                    firewaittime = fw;
                    if (wc.weather == 1)
                    {
                        go.GetComponent<ZhaDan>().damageValue = dv * 0.75f;
                        firewaittime = fw * 0.75f;
                    }
                    else if (wc.weather == 0)
                    {
                        go.GetComponent<ZhaDan>().damageValue = dv * 1.25f;
                    }
                }
                else if (go.tag == "Ice")
                {
                    firewaittime = fw;
                    if (wc.weather == 1)
                    {
                        go.GetComponent<ZhaDan>().damageValue = dv * 1.25f;
                    }
                    else if (wc.weather == 2)
                    {
                        firewaittime = fw * 1.25f;
                    }
                    else
                    {
                        go.GetComponent<ZhaDan>().damageValue = dv * 0.75f;
                        firewaittime = fw * 0.75f;
                    }
                }
                else if (go.tag == "Untagged")
                {
                    firewaittime = fw;
                    if (wc.weather == 0)
                    {
                        firewaittime = fw * 1.25f;
                    }
                    else if (wc.weather == 1)
                    {
                        firewaittime = fw * 1.25f;
                    }
                }
            }
            else if (enemyList.Count != 0 && enemyList[0] == null) 
            {
                if (IsEffectTow)
                {
                    transform.GetComponentInChildren<ParticleSystem>().Stop();
                }
                enemyList.Remove(enemyList[0]);
                Destroy(go);
            }
                   
        }      
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • 现在呢我们来搞一下防御塔对怪物的检测逻辑。首先呢,我想到了触发器检测,并配以一条列表储存在该防御塔射程内的所有敌人...
    貪狼大人阅读 429评论 0 1
  • 最近学习到了项目期,分配了组员之后,我们经过一番推敲,决定做一个塔防类型游戏,首先我们先建立了游戏场景(第一关)。...
    貪狼大人阅读 496评论 4 4
  • 让我们继续探讨防御塔的建造,升级,卖出建造: 首先,/判断钱够不够/,够的话我们就将基座等级+1,并通过Canva...
    貪狼大人阅读 255评论 1 1
  • 现在我们来探讨怪物的相关事宜:首先我们给怪物加一个EnemyContrl脚本,用来储存怪物的各种属性以及寻路,各种...
    貪狼大人阅读 232评论 0 1
  • 1.正确答案思维 微信做了,苹果做了,所以我们也要做 根源在于不知道如何面对一个“没有正确答案”的思考环境。读书好...
    gqyjlu阅读 609评论 1 0