日誌2019-09-16 16:14
Unity的 RTS戰爭迷霧 建築特效作者:樂小呈
[SerializeField] Transform[] checkPoints; [SerializeField] float pointRadius; [SerializeField] Sprite showInFogSprite; //用來放Sprite [SerializeField] LayerMask fogLayer; [SerializeField] int hideLayer; int defaltLayer; |
Transform[] checkPoints = new Transform[0]; float pointRadius = 0.1f; LayerMask fogLayer; |
void CheckObjInFog() { if (checkPoints.Length == 0) { return; } bool hideWithFog = true; foreach (var point in checkPoints) { if (!Physics2D.OverlapCircle(point.position, pointRadius,fogLayer)) { hideWithFog = false; break; } } int currentLayer = (hideWithFog) ? hideLayer : defaultLayer; if (currentLayer != gameObject.layer) //檢查Layer是否有更動 { SetLayerRecursively(gameObject, currentLayer); //設置Layer if (currentLayer == hideLayer) //判斷生成靜態圖 { GenerateHideSprite(); //生成靜態圖 } } } |
void GenerateHideSprite() { if(showInFogSprite == null) { return; } //判斷要不要生成靜態圖 GameObject spriteInFog = new GameObject(); //生成GameObjcet spriteInFog.transform.position = transform.position; //設置位置 SpriteInFog hideSprite = spriteInFog.AddComponent<SpriteInFog>(); //附上SpriteInFog腳本 hideSprite.SetSpriteInFog(checkPoints, pointRadius, showInFogSprite, fogLayer); //設置靜態圖 } |
public void SetSpriteInFog(Transform[] points,float radius,Sprite showSprite,LayerMask layer) { checkPoints = new Transform[points.Length]; //設置checkPoints pointRadius = radius; //設置radiius SpriteRenderer renderer = gameObject.AddComponent<SpriteRenderer>(); renderer.sprite = showSprite; //設置顯示在霧中的圖 renderer.renderingLayerMask = 1; //RenderingLayer要比背景的高 fogLayer = layer; //設置Layer for (int i = 0; i < points.Length; i++) //生成checkPoints { GameObject point = new GameObject(); //生成GameObject point.transform.parent = transform; //設置父物件 point.transform.position = points[i].position; //設置位置 checkPoints[i] = point.transform; //加入陣列 } } |
void CheckObjInFog() { if (checkPoints.Length == 0) { return; } foreach (var point in checkPoints) { if (!Physics2D.OverlapCircle(point.position, pointRadius, fogLayer)) { Destroy(gameObject); break; } } } |