using UnityEngine; using TowerDefense.Level; using Core.Utilities; namespace TowerDefense.UI.HUD { /// /// States the placement tile can be in /// public enum PlacementTileState { Filled, Empty } /// /// Simple class to illustrate tile placement locations /// 主要功能是在场景内能够表示可以放置Tower的位置 /// public class PlacementTile : MonoBehaviour { /// /// Material to use when this tile is empty /// public Material emptyMaterial; /// /// Material to use when this tile is filled /// public Material filledMaterial; /// /// The renderer whose material we're changing /// public Renderer tileRenderer; /// /// 等待购买的材质 /// public Material waitBuyMat; /// /// 已开放的材质. /// public Material openMat; /// /// 塔位已被破坏的材质 /// public Material destroyedMat; /// /// 可以放置的塔位 /// public Renderer canPlaceRenderer; /// /// 可以放置的 /// public Material canPlaceMat; public Material canNotPlaceMat; /// /// 放置在当前位置 /// public Material selectMat; //public ParticleSystem myPS;//可以升级的特效 public ParticleSystem myOpenPS;//购买后的特效 public ParticleSystem myPutPS;//交换塔位置后的特效 public GameObject myDragSelectPS;//推拽时候移动到当前塔的特效 /// /// 所在的格子坐标 /// public IntVector2 GridPosition { get; set; } /// /// Update the state of this placement tile /// public void SetState(PlacementTileState newState) { switch (newState) { case PlacementTileState.Filled: if (tileRenderer != null && filledMaterial != null) { tileRenderer.sharedMaterial = filledMaterial; } break; case PlacementTileState.Empty: if (tileRenderer != null && emptyMaterial != null) { tileRenderer.sharedMaterial = emptyMaterial; } break; } } // public void SetParticleSystem(bool isOn) // { // if (isOn) // { // if (myPS.gameObject.activeSelf != isOn) myPS.gameObject.SetActive(isOn); // myPS.Play(); // } // else // { // myPS.Stop(); // if (myPS.gameObject.activeSelf != isOn) myPS.gameObject.SetActive(isOn); // } // } // /// // /// 设置是否可以放置 // /// // /// // public void CheckCanPlace(bool canPlace) // { // if (canPlaceRenderer) // { // if (canPlaceRenderer.enabled != canPlace) // canPlaceRenderer.enabled = canPlace; // if (canPlace) // { // SetSelect(false); // } // else if (towerVSRenderer.enabled) // { // towerVSRenderer.enabled = false; // } // } // } // /// // /// 设置当前材质 // /// // /// // /// // public void SetSelect(bool isSelect) // { // if (isSelect) // { // if (canPlaceRenderer.material != selectMat) // { // canPlaceRenderer.material = selectMat; // } // //激活绿色的底 // } // else // { // if (canPlaceRenderer.material != canPlaceMat) // { // canPlaceRenderer.material = canPlaceMat; // } // if (towerVSRenderer.enabled) // towerVSRenderer.enabled = false; // } // } /// /// 是否放置塔 /// /// /// public void SetRender(bool isOn, string towerName) { if (canPlaceRenderer.enabled != isOn) { canPlaceRenderer.enabled = isOn; } if (myDragSelectPS.activeSelf != isOn) { myDragSelectPS.SetActive(isOn); } // if (isOn) // { // myDragSelectPS.Play(); // } // else // { // myDragSelectPS.Stop(); // } if (isOn && towerName != "") { SetTowerVirtualshadow(towerName); EndlessWaveLineManager.instance.SetWaveLineShow(GridPosition.x, true); } else if (!isOn && towerVSRenderer.enabled) { towerVSRenderer.enabled = false; EndlessWaveLineManager.instance.SetWaveLineShow(GridPosition.x, false); } } public void SetWarning(bool isOn) { canPlaceRenderer.material = isOn ? canNotPlaceMat : canPlaceMat; } /// /// 塔的虚影 /// public Renderer towerVSRenderer; /// /// 塔的虚影 /// public Material towerVSMat; public Texture fire, wood, water; private Vector3 fireScale = new Vector3(1f, 1f, 1f); private Vector3 woodScale = new Vector3(0.8f, 1.12f, 1f); private Vector3 waterScale = new Vector3(1.55f, 1.35f, 1f); private Vector3 fireOffectp = new Vector3(-0.05f, 0f, 0.15f); private Vector3 woodOffectp = new Vector3(0.0f, 0f, 0.3f); private Vector3 waterOffectp = new Vector3(0.0f, 0f, 0.47f); public void SetTowerVirtualshadow(string towerName) { if (towerName.StartsWith("GrowUpTower")) { if (!towerVSRenderer.enabled) towerVSRenderer.enabled = true; //火元素 towerVSMat.SetTexture(shaderPropertyName, fire); towerVSRenderer.transform.localScale = fireScale; towerVSRenderer.transform.localPosition = fireOffectp; } else if (towerName.StartsWith("BlinkTower")) { //木元素 if (!towerVSRenderer.enabled) towerVSRenderer.enabled = true; towerVSMat.SetTexture(shaderPropertyName, wood); towerVSRenderer.transform.localScale = woodScale; towerVSRenderer.transform.localPosition = woodOffectp; } else if (towerName.StartsWith("CopyCatTower")) { //水元素 if (!towerVSRenderer.enabled) towerVSRenderer.enabled = true; towerVSMat.SetTexture(shaderPropertyName, water); towerVSRenderer.transform.localScale = waterScale; towerVSRenderer.transform.localPosition = waterOffectp; } } string shaderPropertyName; /// /// Start is called on the frame when a script is enabled just before /// any of the Update methods is called the first time. /// void Start() { // shaderPropertyName = ShaderUtil.GetPropertyName(towerVSMat.shader, 0); shaderPropertyName = "_MainTex"; //Debug.Log("获取到了Shader的名字" + shaderPropertyName); towerVSRenderer.enabled = false; } /// /// 根据传入的参数来设置当前Grid对应的显示信息 /// WORK START: 从这个函数开始,替换相关的显示效果 /// /// public void SetTileType(PlacementGridType newtype) { switch (newtype) { case PlacementGridType.EGridWaitBuy: if (tileRenderer != null && waitBuyMat != null) tileRenderer.sharedMaterial = waitBuyMat; break; case PlacementGridType.EGridOpen: //Debug.Log("开了塔" + EndlessLevelManager.instanceExists); if (EndlessLevelManager.instanceExists) { tileRenderer.enabled = false; } else { if (tileRenderer != null && openMat != null) tileRenderer.sharedMaterial = openMat; } if (canPlaceRenderer.material == canNotPlaceMat) { SetWarning(false); } break; case PlacementGridType.EGridDestroyed: if (tileRenderer != null && destroyedMat != null) tileRenderer.sharedMaterial = destroyedMat; break; } } public void BuyPs() { myOpenPS?.Play(); AudioSourceManager.Ins.Play(AudioEnum.OpenTowerPlace); EndlessRandomTower.instance.CheckMoney(); } public void PutPs() { myPutPS?.Play(); } } }