塔防篇:Day2

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值