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);
}
}
明天实现炮台攻击!