/// <summary> /// 在子线程计算视野 /// </summary> /// <param name="state">参数(视野数据)</param> private void CalculateFOV(object state) { if (state == null) { return; } var dt = (List <FOWFieldData>)state; lock (m_Lock) { for (int i = 0; i < dt.Count; i++) { if (dt[i] == null) { continue; } Vector3 worldPosition = dt[i].position; float radiusSq = dt[i].radiusSquare; int x = Mathf.FloorToInt((worldPosition.x - m_BeginPosition.x) / m_DeltaX); int z = Mathf.FloorToInt((worldPosition.z - m_BeginPosition.z) / m_DeltaZ); if (x < 0 || x >= m_TexWidth) { continue; } if (z < 0 || z >= m_TexHdight) { continue; } if (m_MapData[x, z] != 0) { continue; } m_Queue.Clear(); m_Arrives.Clear(); m_Queue.Enqueue(new FOWMapPos(x, z)); m_Arrives.Add(z * m_TexWidth + x); m_MaskTexture.SetAsVisible(x, z); while (m_Queue.Count > 0) { var root = m_Queue.Dequeue(); if (m_MapData[root.x, root.y] != 0) { RayCast(root, x, z, radiusSq); continue; } SetVisibleAtPosition(root.x - 1, root.y, x, z, radiusSq); SetVisibleAtPosition(root.x, root.y - 1, x, z, radiusSq); SetVisibleAtPosition(root.x + 1, root.y, x, z, radiusSq); SetVisibleAtPosition(root.x, root.y + 1, x, z, radiusSq); } } m_MaskTexture.MarkAsUpdated(); } }
/// <summary> /// 在子线程计算视野 /// </summary> /// <param name="state">参数(视野数据)</param> private void CalculateFOV(object state) { if (state == null) { return; } var dt = (List <FOWFieldData>)state; lock (m_Lock) { for (int i = 0; i < dt.Count; i++) { if (dt[i] == null) { continue; } m_CalculaterBase.Calculate(dt[i], this); } m_MaskTexture.MarkAsUpdated(); } }