Exemple #1
0
        /// <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();
            }
        }
Exemple #2
0
        /// <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();
            }
        }