/// <summary> /// Delete the specified revealer. /// </summary> static public void RemoveRevealer(IFOWRevealer rev) { if (rev != null) { lock (mRemoved) mRemoved.Add(rev); } }
public override void Dispose() { Messenger.RemoveListener <int>(MessageName.MN_CHARACTOR_BORN, AddCharactor); for (int i = 0; i < m_revealers.Count; i++) { IFOWRevealer revealer = m_revealers[i]; if (revealer != null) { revealer.Release(); } } m_revealers.Clear(); for (int i = 0; i < m_renders.Count; i++) { FOWRender render = m_renders[i]; if (render != null) { render.enabled = false; UnityEngine.Object.Destroy(render.gameObject); } } m_renders.Clear(); m_mapFOWRender = null; FOWSystem.instance.DestroySelf(); }
/// <summary> /// Create a new fog revealer. /// </summary> static public void AddRevealer(IFOWRevealer rev) { if (rev != null) { lock (mAdded) mAdded.Add(rev); } }
public override void Dispose() { for (int i = 0; i < m_revealers.Count; i++) { IFOWRevealer revealer = m_revealers[i]; if (revealer != null) { revealer.Release(); } } m_revealers.Clear(); for (int i = 0; i < m_renders.Count; i++) { FOWRender render = m_renders[i]; if (render != null) { render.enabled = false; UnityEngine.Object.Destroy(render.gameObject); } } m_renders.Clear(); m_mapFOWRender = null; FOWSystem.instance.DestroySelf(); }
public void DelRevealer(IFOWRevealer revealer) { if (_fowRevealers.Contains(revealer)) { ReleaseRevealer(revealer); } }
protected void UpdateRevealers(int deltaMS) { for (int i = m_revealers.Count - 1; i >= 0; i--) { IFOWRevealer revealer = m_revealers[i]; revealer.Update(deltaMS); if (!revealer.IsValid()) { m_revealers.RemoveAt(i); FOWSystem.RemoveRevealer(revealer); revealer.Release(); } } }
/// <summary> /// The fastest form of visibility updates -- radius-based, no line of sights checks. /// 最快的可见性更新形-基于半径,不进行视线检查。 /// 向buffer1的r填充可见性 /// </summary> void RevealUsingRadius(IFOWRevealer r, float worldToTex) { // Position relative to the fog of war //相对于战争迷雾的位置 Vector3 pos = (r.GetPosition() - mOrigin) * worldToTex; //纹理上的坐标 float radius = r.GetRadius() * worldToTex - radiusOffset; //纹理上的半径 // Coordinates we'll be dealing with //我们将要处理的坐标 //RoundToInt返回四舍五入到最接近的整数的f int xmin = Mathf.RoundToInt(pos.x - radius); int ymin = Mathf.RoundToInt(pos.z - radius); int xmax = Mathf.RoundToInt(pos.x + radius); int ymax = Mathf.RoundToInt(pos.z + radius); int cx = Mathf.RoundToInt(pos.x); int cy = Mathf.RoundToInt(pos.z); cx = Mathf.Clamp(cx, 0, textureSize - 1); cy = Mathf.Clamp(cy, 0, textureSize - 1); int radiusSqr = Mathf.RoundToInt(radius * radius); for (int y = ymin; y < ymax; ++y) { if (y > -1 && y < textureSize) { int yw = y * textureSize; for (int x = xmin; x < xmax; ++x) { if (x > -1 && x < textureSize) { int xd = x - cx; int yd = y - cy; int dist = xd * xd + yd * yd; // Reveal this pixel if (dist < radiusSqr) { mBuffer1[x + yw].r = 255; } } } } } }
/// <summary> /// Update the fog of war's visibility. /// </summary> void UpdateBuffer() { // Add all items scheduled to be added if (mAdded.size > 0) { lock (mAdded) { while (mAdded.size > 0) { int index = mAdded.size - 1; mRevealers.Add(mAdded.buffer[index]); mAdded.RemoveAt(index); } } } // Remove all items scheduled for removal if (mRemoved.size > 0) { lock (mRemoved) { while (mRemoved.size > 0) { int index = mRemoved.size - 1; mRevealers.Remove(mRemoved.buffer[index]); mRemoved.RemoveAt(index); } } } // Use the texture blend time, thus estimating the time this update will finish // Doing so helps avoid visible changes in blending caused by the blended result being X milliseconds behind. //使用纹理混合时间,从而估计此更新将完成的时间 //这样做有助于避免由于混合结果落后X毫秒而导致混合中的可见变化。 float factor = (textureBlendTime > 0f) ? Mathf.Clamp01(mBlendFactor + mElapsed / textureBlendTime) : 1f; //// Clear the buffer's red channel (channel used for current visibility -- it's updated right after) ////清除缓冲区的红色通道(用于当前可见性的通道-此通道将在之后立即更新) for (int i = 0, imax = mBuffer0.Length; i < imax; ++i) { mBuffer0[i] = Color32.Lerp(mBuffer0[i], mBuffer1[i], factor); mBuffer1[i].r = 0; } // For conversion from world coordinates to texture coordinates //用于从世界坐标转换为纹理坐标 float worldToTex = (float)textureSize / worldSize; // Update the visibility buffer, one revealer at a time //更新可见性缓冲区,一次显示一个 for (int i = 0; i < mRevealers.size; ++i) { IFOWRevealer rev = mRevealers[i]; if (rev.IsValid()) { RevealUsingRadius(rev, worldToTex); } } // Blur the final visibility data for (int i = 0; i < blurIterations; ++i) { BlurVisibility(); } // Reveal the map based on what's currently visible RevealMap(); // Merge two buffer to one MergeBuffer(); }
private void ReleaseRevealer(IFOWRevealer revealer) { FOWSystem.RemoveRevealer(revealer); revealer.Release(); }
/// <summary> /// Update the fog of war's visibility. /// </summary> void UpdateBuffer() { // Add all items scheduled to be added if (mAdded.Count > 0) { lock (mAdded) { while (mAdded.Count > 0) { int index = mAdded.Count - 1; mRevealers.Add(mAdded[index]); mAdded.RemoveAt(index); } } } // Remove all items scheduled for removal if (mRemoved.Count > 0) { lock (mRemoved) { while (mRemoved.Count > 0) { int index = mRemoved.Count - 1; mRevealers.Remove(mRemoved[index]); mRemoved.RemoveAt(index); } } } // Use the texture blend time, thus estimating the time this update will finish // Doing so helps avoid visible changes in blending caused by the blended result being X milliseconds behind. float factor = (textureBlendTime > 0f) ? Mathf.Clamp01(mBlendFactor + mElapsed / textureBlendTime) : 1f; // Clear the buffer's red channel (channel used for current visibility -- it's updated right after) for (int i = 0, imax = mBuffer0.Length; i < imax; ++i) { mBuffer0[i] = Color32.Lerp(mBuffer0[i], mBuffer1[i], factor); mBuffer1[i].r = 0; } // For conversion from world coordinates to texture coordinates float worldToTex = (float)textureSize / worldSize; // Update the visibility buffer, one revealer at a time for (int i = 0; i < mRevealers.Count; ++i) { IFOWRevealer rev = mRevealers[i]; if (rev.IsValid()) { RevealUsingRadius(rev, worldToTex); } } // Blur the final visibility data for (int i = 0; i < blurIterations; ++i) { BlurVisibility(); } // Reveal the map based on what's currently visible RevealMap(); // Merge two buffer to one MergeBuffer(); }