塔防篇: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);}}
明天实现炮台攻击!
阅读全文
0 0
- 塔防篇:Day2
- Day2
- day2
- DAY2
- day2
- DAY2
- day2
- day2
- day2
- day2
- day2
- day2
- day2
- day2:
- day2
- Day2
- Day2
- Day2
- LINUX——网络编程UDP
- jsday6
- java String类字符串常量的理解
- 开源 java CMS
- HttpClient方式调用接口的实例
- 塔防篇:Day2
- 【Spring】Spring3.x的下载与配置
- jvm-java中对象的访问
- POJ1700 Crossing River
- Tomcat和Weblogic的区别
- 这些痛,只有程序员懂… | 搞笑动图
- APP UI 真的可以实现自动化测试吗?
- 如何用 Node.js 爬虫?
- 大数据早报:国产新一代人工智能芯片发布 「龙猫数据」获3370万元A轮融资(11.8)