unity3D技术分享

小白贪狼做塔防(2)

2017-10-20  本文已影响0人  貪狼大人

让我们继续探讨防御塔的建造,升级,卖出
建造:

void Biuld()
    {
        if (GameData.Instance.money < gameObj.tw.GetComponent<CheckEnemy>().value)
        {
            return;
        }
        hitInfo.collider.gameObject.GetComponent<Tower>().level++;
        //动态加载防御塔
        gameObj.tw = (GameObject)Resources.Load("Prefabs_Turrets/" + bt.cv.GetComponent<Text>().text + hitInfo.collider.gameObject.GetComponent<Tower>().level.ToString());
        //金币处理      
        GameData.Instance.money -= gameObj.tw.GetComponent<CheckEnemy>().value;
        //实例化o
        o = Instantiate(gameObj.tw, hitInfo.collider.gameObject.transform.position + Vector3.up * 2.8f, hitInfo.collider.gameObject.transform.rotation) as GameObject;
        o.transform.parent = hitInfo.collider.gameObject.transform;
        hitInfo.collider.gameObject.GetComponent<Tower>().towername = bt.cv.GetComponent<Text>().text;
        //o = Instantiate(gameObj.tower, hitInfo.collider.gameObject.transform.position + Vector3.up * 2.8, hitInfo.collider.gameObject.transform.rotation) as GameObject;
        hitInfo.collider.gameObject.GetComponent<Tower>().isBiuld = true;       
        bt.cv.GetComponent<Text>().text = "";
    }

首先,/判断钱够不够/,够的话我们就将基座等级+1,并通过Canvas上的Text获取想要建造的名字(前面已经判断基座上没有塔,并判定Canvas上的Text是否为空),并/扣除对应金币/,然后实例化防御塔,并将isBiuld设为true,表明基座上已经有塔,避免同一位置重复建造。然后重点来了,一定一定要将bt.cv.GetComponent<Text>().text清空,不然,你建完一座塔后,鼠标点中其他基座,也会建造并扣钱。
卖出:

void Des()
    {
        GameData.Instance.money += (hitInfo.collider.gameObject.transform.GetChild(1).gameObject.GetComponent<CheckEnemy>().value*0.7f);
        Debug.Log("卖了之后,金币数-----" + GameData.Instance.money);
        Destroy(hitInfo.collider.gameObject.transform.GetChild(0).gameObject);
        //卖炮塔   
        hitInfo.collider.gameObject.GetComponent<Tower>().isBiuld = false;        
        bt.cv.GetComponent<Text>().text = "";
    }

这个逻辑比较简单,选中卖出操作后,点击基座。如果上面没有塔,则将bt.cv.GetComponent<Text>().text清空,若有塔,则将点击的塔的子物体销毁(我之前将防御塔实例化再基座的子物体上了)并返还部分金币。

升级:

void Up()
    {
        hitInfo.collider.gameObject.GetComponent<Tower>().level++;
        gameObj.tw = (GameObject)Resources.Load("Prefabs_Turrets/" + hitInfo.collider.gameObject.GetComponent<Tower>().towername + hitInfo.collider.gameObject.GetComponent<Tower>().level.ToString());
        //金币处理
        if (GameData.Instance.money < gameObj.tw.GetComponent<CheckEnemy>().value)
        {
            hitInfo.collider.gameObject.GetComponent<Tower>().level--;
            return;
        }
        GameData.Instance.money -= gameObj.tw.GetComponent<CheckEnemy>().value;
        Debug.Log("金币数-----" + GameData.Instance.money);       
        //实例化
        o = Instantiate(gameObj.tw, hitInfo.collider.gameObject.transform.position + Vector3.up * 2.8f, hitInfo.collider.gameObject.transform.rotation) as GameObject;
        o.transform.parent = hitInfo.collider.gameObject.transform;        
        //销毁旧       
        Destroy(hitInfo.collider.gameObject.transform.GetChild(1).gameObject);
        hitInfo.collider.gameObject.GetComponent<Tower>().isBiuld = true;
        bt.cv.GetComponent<Text>().text = "";
    }

当时我卡在升级操作一整个上午,完全找不到错误,知道某一位神明在冥冥之中点醒了我,原来我之前在上级函数里,写的还是,销毁原来的塔,并实例化level+1的塔,我却忽略了,我是使用Canvas上的Text获取的“塔名”,但是事实上并没有“LvUp”这个塔,所以我在Tower脚本里加了String towername,用来记录基座上面塔的名字(在Biuld里,赋值)。并且在钱不够的return,操作我忘记了把升过的级扣回去,导致出现了,钱不够时点击也会升级底座记录的等级,不过不实例化,然后当你钱够在该塔基座建新塔时,会出现用一级的钱造出2级甚至3级塔的bug(已修复)。

biuld.gif Up.gif Destory.gif
上一篇下一篇

猜你喜欢

热点阅读