塔防篇:Day2

来源:互联网 发布:cf手游刷枪软件2017 编辑:程序博客网 时间:2024/06/04 00:44

Morning:

上午初步计划:把炮台ui,逻辑部分搞定,begin!

先用UGUI造成一组按钮,然后添加开关组,使得每次需要建设的炮台只有一个可以被选中


效果目前是这样的。之后开始造炮台。

一: 存储炮台数据 

using System.Collections;using System.Collections.Generic;using UnityEngine;[System.Serializable]public class TurretData {public GameObject turretPrefab;public int cost;public GameObject turretUpgradedPrefab;public int costUpgraded;public TurretType type;}public enum TurretType{LaserTurret,MissileTurret,StandardTurret}


二:在GameManager上再次添加建造管理的脚本,保留当前操作选择

在inspector面板中添加监听 

using System.Collections;using System.Collections.Generic;using UnityEngine;public class BuildManager : MonoBehaviour {public TurretData laserTurretData;public TurretData missileTurretData;public TurretData standarTurretData;//当前选择炮台public TurretData selectTurretType;public void OnLaserSelected(bool isOn){Debug.Log (1);if (isOn) {selectTurretType = laserTurretData;}}public void OnMissileSelected(bool isOn){Debug.Log (2);if (isOn)selectTurretType = missileTurretData;}public void OnStandardSelected(bool isOn){Debug.Log (3);if (isOn)selectTurretType = standarTurretData;}}

咯~ 碰到了个新奇错误,上午差点死在这上。。添加完buildTurret脚本 发现开关突然死过去了,点不动了。。调了好一番。

才知道这俩东西是一起的。。 以为事件系统没用,随手一发delete。。这个不能删!!

三:检测鼠标与哪个cube (可以建造炮台的位置)发生射线碰撞

1.先把之前mapcube添加个layer 

2.build添加update鼠标点击内容

public class BuildManager : MonoBehaviour {public TurretData laserTurretData;public TurretData missileTurretData;public TurretData standarTurretData;//当前选择炮台public TurretData selectTurretType;void Update(){if (Input.GetMouseButton(0)) {if(EventSystem.current.IsPointerOverGameObject()==false) //查API得。。。 (若是移动端 要传参){//炮台建造,Cube若是空 若非空Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;bool isCollider=Physics.Raycast (ray,out hit,1000,LayerMask.GetMask("MapCube"));if (isCollider) {GameObject mapCube = hit.collider.gameObject;//得到点击的mapCube }}}}//下面和 原来部分相同
3.创建mapCube脚本 挂载在cube上, 目的是使得建立操作分离出来,直接在mapCube上判断

using System.Collections;using System.Collections.Generic;using UnityEngine;public class MapCube : MonoBehaviour {[HideInInspector]public GameObject turretGo;void Start () {} public void BuildTurret(GameObject turretPrefab){}}
4.继续完善build脚本
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;public class BuildManager : MonoBehaviour {public TurretData laserTurretData;public TurretData missileTurretData;public TurretData standarTurretData;public int money=10000;//当前选择炮台public TurretData selectTurretType;void Update(){if (Input.GetMouseButton(0)) {if(EventSystem.current.IsPointerOverGameObject()==false) //查API得。。。 (若是移动端 要传参){//炮台建造,Cube若是空 若非空Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;bool isCollider=Physics.Raycast (ray,out hit,1000,LayerMask.GetMask("MapCube"));if (isCollider) {MapCube mapCube = hit.collider.GetComponent<MapCube>();//得到点击的mapCube if (mapCube.turretGo == false) {//可以创建if (money >= selectTurretType.cost) {money -= selectTurretType.cost;mapCube.BuildTurret (selectTurretType.turretPrefab);} else {//提示钱够不够。..。}} else {//升级}}}}}public void OnLaserSelected(bool isOn){Debug.Log (1);if (isOn) {selectTurretType = laserTurretData;}}public void OnMissileSelected(bool isOn){Debug.Log (2);if (isOn)selectTurretType = missileTurretData;}public void OnStandardSelected(bool isOn){Debug.Log (3);if (isOn)selectTurretType = standarTurretData;}}

5. 把钱的组件加上

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;public class BuildManager : MonoBehaviour {public TurretData laserTurretData;public TurretData missileTurretData;public TurretData standarTurretData;private int money=10000;public Text moneyText;//当前选择炮台private TurretData selectTurretType;void ChangeMoney(int change=0){money += change;moneyText.text = "¥" + money;}void Update(){if (Input.GetMouseButton(0)) {if(EventSystem.current.IsPointerOverGameObject()==false) //查API得。。。 (若是移动端 要传参){//炮台建造,Cube若是空 若非空Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition); //Debug.Log ("er"); RaycastHit hit;bool isCollider=Physics.Raycast (ray,out hit,1000,LayerMask.GetMask("MapCube"));if (isCollider&&selectTurretType!=null) { MapCube mapCube = hit.collider.GetComponent<MapCube>();//得到点击的mapCube if (mapCube.turretGo == false) {//可以创建if (money >= selectTurretType.cost) {ChangeMoney (-selectTurretType.cost); //mapCube.BuildTurret (selectTurretType.turretPrefab);} else {//提示钱够不够。..。}} else {//升级}}}}}public void OnLaserSelected(bool isOn){ if (isOn) {selectTurretType = laserTurretData;}}public void OnMissileSelected(bool isOn){ if (isOn)selectTurretType = missileTurretData;}public void OnStandardSelected(bool isOn){ if (isOn)selectTurretType = standarTurretData;}}
//遇到问题是。。之前 第一步。。添加射线了。。但是忘记更新layer。 还有个就是要判断当前选择炮台是否为空。

编辑没有钱时候的动画。状态机如图所示


OK 上午结束,附上代码及组件关系,下午继续

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;public class BuildManager : MonoBehaviour {public TurretData laserTurretData;public TurretData missileTurretData;public TurretData standarTurretData;private int money=500 ;public Animator moneyAnimator;public Text moneyText;//当前选择炮台private TurretData selectTurretType;void ChangeMoney(int change=0){money += change;moneyText.text = "¥" + money;}void Update(){if (Input.GetMouseButton(0)) {if(EventSystem.current.IsPointerOverGameObject()==false) //查API得。。。 (若是移动端 要传参){//炮台建造,Cube若是空 若非空Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition); //Debug.Log ("er"); RaycastHit hit;bool isCollider=Physics.Raycast (ray,out hit,1000,LayerMask.GetMask("MapCube"));if (isCollider&&selectTurretType!=null) { MapCube mapCube = hit.collider.GetComponent<MapCube>();//得到点击的mapCube if (mapCube.turretGo == false) {//可以创建if (money >= selectTurretType.cost) {ChangeMoney (-selectTurretType.cost); //mapCube.BuildTurret (selectTurretType.turretPrefab);} else {//提示钱够不够。..。moneyAnimator.SetTrigger("Flicker");}} else {//升级}}}}}public void OnLaserSelected(bool isOn){ if (isOn) {selectTurretType = laserTurretData;}}public void OnMissileSelected(bool isOn){ if (isOn)selectTurretType = missileTurretData;}public void OnStandardSelected(bool isOn){ if (isOn)selectTurretType = standarTurretData;}}



afternoon:

准备开始创建炮台!

实例化出来。。就这样。

using System.Collections;using System.Collections.Generic;using UnityEngine;public class MapCube : MonoBehaviour {[HideInInspector]public GameObject turretGo=null;void Start () {} public void BuildTurret(GameObject turretPrefab){turretGo=GameObject.Instantiate (turretPrefab,transform.position,Quaternion.identity);}}


Go On.

做粒子效果, 每次实例炮台时有土飞溅, (就像QQ塔防的小锤子)。。。

效果

把粒子效果做成prefab,然后在建造炮台时直接实例。

using System.Collections;using System.Collections.Generic;using UnityEngine;public class MapCube : MonoBehaviour {[HideInInspector]public GameObject turretGo=null;public GameObject buildEffect;void Start () {} public void BuildTurret(GameObject turretPrefab){turretGo=GameObject.Instantiate (turretPrefab,transform.position,Quaternion.identity);GameObject effect=GameObject.Instantiate (buildEffect,transform.position,Quaternion.identity);Destroy (effect,5);}}

明天实现炮台攻击!

原创粉丝点击