小白贪狼做塔防(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;
    /// 
    /// 是否能打到飞行怪
    /// 
    public bool IsHitFly;
    /// 
    /// 开火频率
    /// 
    public float firewaittime = 2;
    private float fw;
    private float dv;
    /// 
    /// 炮塔价格
    /// 
    public float value = 100;
    /// 
    /// 临时ID,测试
    /// 
    public int idi = 0;
    /// 
    /// 是否是特效炮塔,比如激光,火焰枪
    /// 
    public bool IsEffectTow;
    /// 
    /// 炮塔转动速度
    /// 
    public float turnSpeed = 10;
    /// 
    /// 最远攻击距离
    /// 
    public float disFire = 12;
    /// 
    /// 是否有正在攻击的目标
    ///   
    private bool isAlarm;
    /// 
    /// 子弹
    /// 
    public GameObject ziDan;
    /// 
    /// 子弹生成位置
    /// 
    public Transform firePos;
    /// 
    /// 攻击目标
    /// 
    private Transform targetEnemy;
    /// 
    /// 存储所有检测到的敌人
    /// 
    private List enemyList;
    /// 
    /// 开火的协程是否开启
    /// 
    private bool isFire = false;
    void Start () 
    {
        fw = firewaittime;
        wc = GameObject.Find("Weather").GetComponent();
        enemyList = new List();
        //if (ziDan.name == "ZhaDan" || ziDan.name == "FireIce")
        //{
        //    IsHitFly = false;
        //}
        //else {
        //    IsHitFly = true;
        //}
        //如果是特效炮塔,关闭特效
        if (IsEffectTow) {
            if (transform.GetComponentInChildren() != null) {
                transform.GetComponentInChildren().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();
                }
            }     
            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().Blood <= 0)
                {
                    enemyList.Remove(enemyList[0]);
                }
            }         
        }
        else {
            if (isFire) 
            {
                StopCoroutine("Fire");
                if (IsEffectTow) {
                    transform.GetComponentInChildren().Stop();
                }            
                isFire = false;
                enemyList = new List();
            }
        }
    }
    /// 
    /// 检测触发物是否为敌人,是的话放入攻击列表
    /// 
    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);
            }
        }
    }

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

你可能感兴趣的:(小白贪狼做塔防(5))