Waypoints
Waypoints
ViewCollections
RoadCube
这里rigidbody失效的原因是:之前把Physics里Layer交互限定了。子弹的层级无法与Enemy交互。把子弹的Layer改为Turret就好了。
if(isOn){
selctedTurretData = laserTurretData;
}
老师做的子弹击中是计算距离的,如果按照碰撞击中的话,记得把bullet的collider和rigid body复制过来
如果摄像头不是原来的,而是自己新建的,记得给摄像头改名并且tag改成maincamera
Radius粒子效果的起始点2的位置大小。
Enemy.cs
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
public float speed = 10.0f;
public float hp = 150;
private float totalHp;
public GameObject explosionEffect;
private Slider hpSlider;
private Transform[] positions;
private int index = 0;
void Start()
{
positions = Waypoints.positions;
totalHp = hp;
hpSlider = GetComponentInChildren<Slider>();
}
void Update()
{
Move();
}
private void Move()
{
if (index > positions.Length - 1) return;
transform.Translate((positions[index].position - transform.position).normalized * speed * Time.deltaTime);
if (Vector3.Distance(positions[index].position, transform.position) < 0.2f)
{
index++;
}
if (index > positions.Length - 1)
{
ReachDestination();
}
}
private void ReachDestination()
{
GameObject.Destroy(this.gameObject);
}
private void OnDestroy()
{
EnemySpawner.CountEnemyAlive--;
}
public void TakeDamage(float damage)
{
if (hp <= 0) return;//如果当前敌人hp小于0,死了不作处理
hp -= damage;
hpSlider.value = (float)hp / totalHp;
if (hp <= 0)
{
Die();
}
}
private void Die()
{
GameObject effect = GameObject.Instantiate(explosionEffect, transform.position, transform.rotation);
Destroy(effect, 1.5f);
Destroy(this.gameObject);
}
}
Turret.cs
using System.Collections.Generic;
using UnityEngine;
public class Turret : MonoBehaviour
{
private List<GameObject> enemys = new List<GameObject>();
private void OnTriggerEnter(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Add(col.gameObject);
}
}
private void OnTriggerExit(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Remove(col.gameObject);
}
}
public float attackRateTime = 1.0f; //多少秒攻击一次
private float timer = 0.0f;
public GameObject bulletPrefab;
public Transform firePosition;
public Transform head;
public bool useLaser = false;
public float damageRate = 70.0f;
public LineRenderer laserRenderer;
public GameObject laserEffect;
private void Start()
{
timer = attackRateTime;
}
private void Update()
{
//先调整方向,再攻击
if (enemys.Count > 0 && enemys[0] != null)
{
Vector3 targetPosition = enemys[0].transform.position;
targetPosition.y = head.position.y;
head.LookAt(targetPosition);
}
//攻击
if (useLaser == false)
{
timer += Time.deltaTime;
if (enemys.Count > 0 && timer >= attackRateTime)//刚刚实例化出来的时候,攻击就绪,第一次可以攻击
{
timer = 0;
Attack();
}
}
else if (enemys.Count > 0)
{
if (laserRenderer.enabled == false)
laserRenderer.enabled = true;
laserEffect.SetActive(true);
if (enemys[0] == null)
{
UpdateEnemys();
}
if (enemys.Count > 0)
{
laserRenderer.SetPositions(new Vector3[] { firePosition.position, enemys[0].transform.position });
enemys[0].GetComponent<Enemy>().TakeDamage(damageRate * Time.deltaTime);
laserEffect.transform.position = enemys[0].transform.position;
Vector3 pos = transform.position;
pos.y = enemys[0].transform.position.y;
laserEffect.transform.LookAt(pos);
}
}
else
{
laserEffect.SetActive(false);
laserRenderer.enabled = false;
}
}
private void Attack()
{
if (enemys[0] == null)
{
UpdateEnemys();
}
if (enemys.Count > 0)
{
GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);
bullet.GetComponent<Bullet>().SetTarget(enemys[0].transform);
}
else
{
timer = attackRateTime;
}
}
private void UpdateEnemys()
{
//enemys.RemoveAll(null);
List<int> emptyIndex = new List<int>();
for (int index = 0; index < enemys.Count; index++)
{
if (enemys[index] == null)
{
emptyIndex.Add(index);
}
}
for (int i = 0; i < emptyIndex.Count; i++)
{
enemys.RemoveAt(emptyIndex[i] - i);//移除一个元素,索引会减少1,Count会减小。
}
}
}
透明度混合Shader:Shader/Particles/AlphaBlended
Turret.cs
using System.Collections.Generic;
using UnityEngine;
public class Turret : MonoBehaviour
{
private List<GameObject> enemys = new List<GameObject>();
private void OnTriggerEnter(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Add(col.gameObject);
}
}
private void OnTriggerExit(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Remove(col.gameObject);
}
}
public float attackRateTime = 1.0f; //多少秒攻击一次
private float timer = 0.0f;
public GameObject bulletPrefab;
public Transform firePosition;
public Transform head;
public bool useLaser = false;
public float damageRate = 70.0f;
public LineRenderer laserRenderer;
private void Start()
{
timer = attackRateTime;
}
private void Update()
{
//先调整方向,再攻击
if (enemys.Count > 0 && enemys[0] != null)
{
Vector3 targetPosition = enemys[0].transform.position;
targetPosition.y = head.position.y;
head.LookAt(targetPosition);
}
//攻击
if (useLaser == false)
{
timer += Time.deltaTime;
if (enemys.Count > 0 && timer >= attackRateTime)//刚刚实例化出来的时候,攻击就绪,第一次可以攻击
{
timer = 0;
Attack();
}
}
else if(enemys.Count>0)
{
if (laserRenderer.enabled == false)
laserRenderer.enabled = true;
if (enemys[0] == null)
{
UpdateEnemys();
}
if(enemys.Count>0)
{
laserRenderer.SetPositions( new Vector3[] { firePosition.position, enemys[0].transform.position });
}
}
else
{
laserRenderer.enabled = false;
}
}
private void Attack()
{
if (enemys[0] == null)
{
UpdateEnemys();
}
if (enemys.Count > 0)
{
GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);
bullet.GetComponent<Bullet>().SetTarget(enemys[0].transform);
}
else
{
timer = attackRateTime;
}
}
private void UpdateEnemys()
{
//enemys.RemoveAll(null);
List<int> emptyIndex = new List<int>();
for (int index = 0; index < enemys.Count; index++)
{
if (enemys[index] == null)
{
emptyIndex.Add(index);
}
}
for (int i = 0; i < emptyIndex.Count; i++)
{
enemys.RemoveAt(emptyIndex[i] - i);//移除一个元素,索引会减少1,Count会减小。
}
}
}
Turret.cs
using System.Collections.Generic;
using UnityEngine;
public class Turret : MonoBehaviour
{
private List<GameObject> enemys = new List<GameObject>();
private void OnTriggerEnter(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Add(col.gameObject);
}
}
private void OnTriggerExit(Collider col)
{
if (col.tag == "Enemy")
{
enemys.Remove(col.gameObject);
}
}
public float attackRateTime = 1.0f; //多少秒攻击一次
private float timer = 0.0f;
public GameObject bulletPrefab;
public Transform firePosition;
public Transform head;
public bool useLaser = false;
public float damageRate = 70.0f;
private void Start()
{
timer = attackRateTime;
}
private void Update()
{
//先调整方向,再攻击
if (enemys.Count > 0 && enemys[0] != null)
{
Vector3 targetPosition = enemys[0].transform.position;
targetPosition.y = head.position.y;
head.LookAt(targetPosition);
}
//攻击
if (useLaser == false)
{
timer += Time.deltaTime;
if (enemys.Count > 0 && timer >= attackRateTime)//刚刚实例化出来的时候,攻击就绪,第一次可以攻击
{
timer = 0;
Attack();
}
}
else
{
}
}
private void Attack()
{
if (enemys[0] == null)
{
UpdateEnemys();
}
if (enemys.Count > 0)
{
GameObject bullet = GameObject.Instantiate(bulletPrefab, firePosition.position, firePosition.rotation);
bullet.GetComponent<Bullet>().SetTarget(enemys[0].transform);
}
else
{
timer = attackRateTime;
}
}
private void UpdateEnemys()
{
//enemys.RemoveAll(null);
List<int> emptyIndex = new List<int>();
for (int index = 0; index < enemys.Count; index++)
{
if (enemys[index] == null)
{
emptyIndex.Add(index);
}
}
for (int i = 0; i < emptyIndex.Count; i++)
{
enemys.RemoveAt(emptyIndex[i] - i);//移除一个元素,索引会减少1,Count会减小。
}
}
}
看不到物体,因为,父物体的缩放比例不一致导致的,
拖到最里面,Reset一下,拖出来,保存Prefab即可。
MapCube.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class MapCube : MonoBehaviour
{
[HideInInspector]
public GameObject turretGo; //保存当前Cube身上的炮台
private TurretData turretData;
[HideInInspector]
public bool isUpgraded = false;
public GameObject buildEffect;
private Renderer renderer;
private void Start()
{
renderer = GetComponent<Renderer>();
}
public void BuildTurret(TurretData turretData)
{
this.turretData = turretData;
isUpgraded = false;
turretGo = GameObject.Instantiate(turretData.turretPrefab, transform.position, Quaternion.identity);
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.5f);
}
public void UpgradeTurret()
{
if (isUpgraded == true) return;
Destroy(turretGo);
isUpgraded = true;
turretGo = GameObject.Instantiate(turretData.turretUpgradePrefab, transform.position, Quaternion.identity);
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.5f);
}
public void DestroyTurret()
{
Destroy(turretGo);
isUpgraded = false;
turretGo = null;
turretData = null;
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.5f);
}
private void OnMouseEnter()
{
if (turretGo == null && EventSystem.current.IsPointerOverGameObject() == false)
{
renderer.material.color = Color.red;
}
}
private void OnMouseExit()
{
renderer.material.color = Color.white;
}
}
MapCube.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class MapCube : MonoBehaviour
{
[HideInInspector]
public GameObject turretGo; //保存当前Cube身上的炮台
private TurretData turretData;
[HideInInspector]
public bool isUpgraded = false;
public GameObject buildEffect;
private Renderer renderer;
private void Start()
{
renderer = GetComponent<Renderer>();
}
public void BuildTurret(TurretData turretData)
{
this.turretData = turretData;
isUpgraded = false;
turretGo = GameObject.Instantiate(turretData.turretPrefab, transform.position, Quaternion.identity);
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.0f);
}
public void UpgradeTurret()
{
if (isUpgraded == true) return;
Destroy(turretGo);
isUpgraded = true;
turretGo = GameObject.Instantiate(turretData.turretUpgradePrefab, transform.position, Quaternion.identity);
}
public void DestroyTurret()
{
Destroy(turretGo);
isUpgraded = false;
turretGo = null;
turretData = null;
}
private void OnMouseEnter()
{
if (turretGo == null && EventSystem.current.IsPointerOverGameObject() == false)
{
renderer.material.color = Color.red;
}
}
private void OnMouseExit()
{
renderer.material.color = Color.white;
}
}
MapCube.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class MapCube : MonoBehaviour
{
[HideInInspector]
public GameObject turretGo; //保存当前Cube身上的炮台
private TurretData turretData;
[HideInInspector]
public bool isUpgraded = false;
public GameObject buildEffect;
private Renderer renderer;
private void Start()
{
renderer = GetComponent<Renderer>();
}
public void BuildTurret(TurretData turretData)
{
this.turretData = turretData;
isUpgraded = false;
turretGo = GameObject.Instantiate(turretData.turretPrefab, transform.position, Quaternion.identity);
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.0f);
}
public void UpgradeTurret()
{
}
public void DestroyTurret()
{
}
private void OnMouseEnter()
{
if (turretGo == null && EventSystem.current.IsPointerOverGameObject() == false)
{
renderer.material.color = Color.red;
}
}
private void OnMouseExit()
{
renderer.material.color = Color.white;
}
}
BuildManager.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class BuildManager : MonoBehaviour
{
public TurretData laserTurretData;
public TurretData missileTurretData;
public TurretData standardTurretData;
//表示当前选择的炮台(要建造的炮台)
private TurretData selectedTurretData;
//表示当前选择的炮台(场景中的游戏物体)
private MapCube selectedMapCube;
public Text moneyText;
public Animator moneyAnimator;
private int money = 1000;
public GameObject upgradeCanvas;
private Animator upgradeCanvasAnimator;
public Button buttonUpgrade;
void ChangeMoney(int change = 0)
{
money += change;
moneyText.text = "¥" + money;
}
private void Start()
{
upgradeCanvasAnimator = upgradeCanvas.GetComponent<Animator>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject() == false)
{
//开发炮台的建造
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.gameObject.GetComponent<MapCube>();//得到点击的mapCube
if (selectedTurretData != null && mapCube.turretGo == null)
{
//可以创建
if (money > selectedTurretData.cost)
{
ChangeMoney(-selectedTurretData.cost);
mapCube.BuildTurret(selectedTurretData);
}
else
{
//提示钱不够
moneyAnimator.SetTrigger("Flicker");
}
}
else if (mapCube.turretGo != null)
{
//TODO 升级处理
//if(mapCube.isUpgraded)
//{
// ShowUpgradeUI(mapCube.transform.position, true);
//}
//else
//{
// ShowUpgradeUI(mapCube.transform.position, false);
//}
if (mapCube == selectedMapCube && upgradeCanvas.activeInHierarchy)
{
StartCoroutine(HideUpgradeUI());
}
else
{
ShowUpgradeUI(mapCube.transform.position, mapCube.isUpgraded);
}
selectedMapCube = mapCube;
}
}
}
}
}
public void OnLaserSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = laserTurretData;
}
}
public void OnMissileSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = missileTurretData;
}
}
public void OnStandardSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = standardTurretData;
}
}
private void ShowUpgradeUI(Vector3 pos, bool isDisableUpgrade = false)
{
StopCoroutine("HideUpgradeUI");
upgradeCanvas.SetActive(false);
upgradeCanvas.SetActive(true);
upgradeCanvas.transform.position = pos;
buttonUpgrade.interactable = !isDisableUpgrade;
}
IEnumerator HideUpgradeUI()
{
upgradeCanvasAnimator.SetTrigger("Hide");
//upgradeCanvas.SetActive(false);
yield return new WaitForSeconds(0.8f);
upgradeCanvas.SetActive(false);
}
public void OnUpgradeButtonDown()
{
selectedMapCube.UpgradeTurret();
StartCoroutine(HideUpgradeUI());
}
public void OnDestroyButtonDown()
{
selectedMapCube.DestroyTurret();
StartCoroutine(HideUpgradeUI());
}
}
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
public class BuildManager : MonoBehaviour
{
public TurretData laserTurretData;
public TurretData missileTurretData;
public TurretData standardTurretData;
//表示当前选择的炮台(要建造的炮台)
private TurretData selectedTurretData;
//表示当前选择的炮台(场景中的游戏物体)
private GameObject selectedTurretGo;
public Text moneyText;
public Animator moneyAnimator;
private int money = 1000;
public GameObject upgradeCanvas;
private Animator upgradeCanvasAnimator;
public Button buttonUpgrade;
void ChangeMoney(int change = 0)
{
money += change;
moneyText.text = "¥" + money;
}
private void Start()
{
upgradeCanvasAnimator = upgradeCanvas.GetComponent<Animator>();
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject() == false)
{
//开发炮台的建造
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.gameObject.GetComponent<MapCube>();//得到点击的mapCube
if (selectedTurretData != null && mapCube.turretGo == null)
{
//可以创建
if (money > selectedTurretData.cost)
{
ChangeMoney(-selectedTurretData.cost);
mapCube.BuildTurret(selectedTurretData.turretPrefab);
}
else
{
//TODO 提示钱不够
moneyAnimator.SetTrigger("Flicker");
}
}
else if (mapCube.turretGo != null)
{
//TODO 升级处理
//if(mapCube.isUpgraded)
//{
// ShowUpgradeUI(mapCube.transform.position, true);
//}
//else
//{
// ShowUpgradeUI(mapCube.transform.position, false);
//}
if (mapCube.turretGo == selectedTurretGo && upgradeCanvas.activeInHierarchy)
{
StartCoroutine(HideUpgradeUI());
}
else
{
ShowUpgradeUI(mapCube.transform.position, mapCube.isUpgraded);
}
selectedTurretGo = mapCube.turretGo;
}
}
}
}
}
public void OnLaserSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = laserTurretData;
}
}
public void OnMissileSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = missileTurretData;
}
}
public void OnStandardSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = standardTurretData;
}
}
private void ShowUpgradeUI(Vector3 pos, bool isDisableUpgrade = false)
{
StopCoroutine("HideUpgradeUI");
upgradeCanvas.SetActive(false);
upgradeCanvas.SetActive(true);
upgradeCanvas.transform.position = pos;
buttonUpgrade.interactable = !isDisableUpgrade;
}
IEnumerator HideUpgradeUI()
{
upgradeCanvasAnimator.SetTrigger("Hide");
//upgradeCanvas.SetActive(false);
yield return new WaitForSeconds(0.8f);
upgradeCanvas.SetActive(false);
}
public void OnUpgradeButtonDown()
{
//TODO
}
public void OnDestroyButtonDown()
{
//TODO
}
}
MapCube.cs
using UnityEngine;
using UnityEngine.EventSystems;
public class MapCube : MonoBehaviour
{
[HideInInspector]
public GameObject turretGo; //保存当前Cube身上的炮台
[HideInInspector]
public bool isUpgraded = false;
public GameObject buildEffect;
private Renderer renderer;
private void Start()
{
renderer = GetComponent<Renderer>();
}
public void BuildTurret(GameObject turretPrefab)
{
isUpgraded = false;
turretGo = GameObject.Instantiate(turretPrefab, transform.position, Quaternion.identity);
GameObject effect = GameObject.Instantiate(buildEffect, transform.position, Quaternion.identity);
Destroy(effect, 1.0f);
}
private void OnMouseEnter()
{
if (turretGo == null && EventSystem.current.IsPointerOverGameObject() == false)
{
renderer.material.color = Color.red;
}
}
private void OnMouseExit()
{
renderer.material.color = Color.white;
}
}
BuildManager.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class BuildManager : MonoBehaviour
{
public TurretData laserTurretData;
public TurretData missileTurretData;
public TurretData standardTurretData;
//表示当前选择的炮台(要建造的炮台)
private TurretData selectedTurretData;
//表示当前选择的炮台(场景中的游戏物体)
private GameObject selectedTurretGo;
public Text moneyText;
public Animator moneyAnimator;
private int money = 1000;
public GameObject upgradeCanvas;
public Button buttonUpgrade;
void ChangeMoney(int change = 0)
{
money += change;
moneyText.text = "¥" + money;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject() == false)
{
//开发炮台的建造
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.gameObject.GetComponent<MapCube>();//得到点击的mapCube
if (selectedTurretData != null && mapCube.turretGo == null)
{
//可以创建
if (money > selectedTurretData.cost)
{
ChangeMoney(-selectedTurretData.cost);
mapCube.BuildTurret(selectedTurretData.turretPrefab);
}
else
{
//TODO 提示钱不够
moneyAnimator.SetTrigger("Flicker");
}
}
else if (mapCube.turretGo != null)
{
//TODO 升级处理
//if(mapCube.isUpgraded)
//{
// ShowUpgradeUI(mapCube.transform.position, true);
//}
//else
//{
// ShowUpgradeUI(mapCube.transform.position, false);
//}
if(mapCube.turretGo == selectedTurretGo && upgradeCanvas.activeInHierarchy)
{
HideUpgradeUI();
}
else
{
ShowUpgradeUI(mapCube.transform.position, mapCube.isUpgraded);
}
selectedTurretGo = mapCube.turretGo;
}
}
}
}
}
public void OnLaserSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = laserTurretData;
}
}
public void OnMissileSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = missileTurretData;
}
}
public void OnStandardSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = standardTurretData;
}
}
private void ShowUpgradeUI(Vector3 pos, bool isDisableUpgrade = false)
{
upgradeCanvas.SetActive(true);
upgradeCanvas.transform.position = pos;
buttonUpgrade.interactable = !isDisableUpgrade;
}
private void HideUpgradeUI()
{
upgradeCanvas.SetActive(false);
}
public void OnUpgradeButtonDown()
{
//TODO
}
public void OnDestroyButtonDown()
{
//TODO
}
}
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class BuildManager : MonoBehaviour
{
public TurretData laserTurretData;
public TurretData missileTurretData;
public TurretData standardTurretData;
//表示当前选择的炮台(要建造的炮台)
private TurretData selectedTurretData;
public Text moneyText;
public Animator moneyAnimator;
private int money = 1000;
public GameObject upgradeCanvas;
public Button buttonUpgrade;
void ChangeMoney(int change = 0)
{
money += change;
moneyText.text = "¥" + money;
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (EventSystem.current.IsPointerOverGameObject() == false)
{
//开发炮台的建造
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.gameObject.GetComponent<MapCube>();//得到点击的mapCube
if (selectedTurretData != null && mapCube.turrerGo == null)
{
//可以创建
if (money > selectedTurretData.cost)
{
ChangeMoney(-selectedTurretData.cost);
mapCube.BuildTurret(selectedTurretData.turretPrefab);
}
else
{
//TODO 提示钱不够
moneyAnimator.SetTrigger("Flicker");
}
}
else if (mapCube.turrerGo != null)
{
//TODO 升级处理
}
}
}
}
}
public void OnLaserSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = laserTurretData;
}
}
public void OnMissileSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = missileTurretData;
}
}
public void OnStandardSelected(bool isOn)
{
if (isOn)
{
selectedTurretData = standardTurretData;
}
}
private void ShowUpgradeUI(Vector3 pos, bool isDisableUpgrade = false)
{
upgradeCanvas.SetActive(true);
upgradeCanvas.transform.position = pos;
buttonUpgrade.interactable = !isDisableUpgrade;
}
private void HideUpgradeUI()
{
upgradeCanvas.SetActive(false);
}
public void OnUpgradeButtonDown()
{
//TODO
}
public void OnDestroyButtonDown()
{
//TODO
}
}
按住Alt键,拖动UI,中心固定拖动。
增大字体,调整范围显示,缩小Scale。使得字体显示更清楚。
Button Transition:Animation,动画渐变。
Auto Generate Animation。自动生成4个动画。
Animation下的四种状态。Normal、Highlighted、Pressed、Disabled。
Button下Interactable 取消打勾就是Disabled状态。【最顶级不可升级,拆 都可以】
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour{ //Use this for initialization void Start(){ } //Update is called once per frame void Update(){ }
血条Slider,不需要交互,取消勾选 Interactable。
Canvas---Render Mode---世界空间World Space。
血条不要Slider的Handle,删除。
【血条Slider制作:①Fill的Rect Transform的Left、Top、Pos Z、Right 和 Bottom都为0。②Fill Area的Rect Transform的Left,Right、Top、Bottom、Pos Z都为0。】(我的想法)
这样显示的血条不会多出一点空白没有填充。也不会没血了显示一点点。
把世界坐标的UI拖到物体上,显示差距太大,需要调节Canvas的Scale。
using UnityEngine;
using UnityEngine.UI;
public class Enemy : MonoBehaviour
{
public float speed = 10.0f;
public int hp = 150;
private int totalHp;
public GameObject explosionEffect;
private Slider hpSlider;
private Transform[] positions;
private int index = 0;
void Start()
{
positions = Waypoints.positions;
totalHp = hp;
hpSlider = GetComponentInChildren<Slider>();
}
void Update()
{
Move();
}
private void Move()
{
if (index > positions.Length - 1) return;
transform.Translate((positions[index].position - transform.position).normalized * speed * Time.deltaTime);
if (Vector3.Distance(positions[index].position, transform.position) < 0.2f)
{
index++;
}
if (index > positions.Length - 1)
{
ReachDestination();
}
}
private void ReachDestination()
{
GameObject.Destroy(this.gameObject);
}
private void OnDestroy()
{
EnemySpawner.CountEnemyAlive--;
}
public void TakeDamage(int damage)
{
if (hp <= 0) return;//如果当前敌人hp小于0,死了不作处理
hp -= damage;
hpSlider.value = (float)hp / totalHp;
if (hp <= 0)
{
Die();
}
}
private void Die()
{
GameObject effect = GameObject.Instantiate(explosionEffect, transform.position, transform.rotation);
Destroy(effect, 1.5f);
Destroy(this.gameObject);
}
}