示例#1
0
        private void CalculateWalkableTiles()
        {
            var player   = PlayerActor.Instance;
            var distance = player.stats.currentStats.speed;
//            var pos = GridUtil.GridToWorld(player.GridPosition);


            // var VBuffer = new List<Vector3>();


            var walkableTiles = Astar.Area(player.GridPosition, distance);


            var vol = GenerationLib.makeVolume(
                new float[3][] {
                new float[] { -distance - 1, distance + 1, 1f },
                new float[] { 0, 1, 1f },
                new float[] { -distance - 1, distance + 1, 1f }
            }, (x, y, z) => {
                if ((int)y < 0.5f)
                {
                    return(0);
                }
                return(walkableTiles.Contains(new NVector2((int)x + player.GridPosition.x, (int)z + player.GridPosition.y)) ? 1 : 0);
            });

            List <int>     iBuffer;
            List <Vector2> uvs;
            List <Vector3> vBuffer;

            SurfaceNets.GenerateSurfaceMesh(vol, 0.5f, out vBuffer, out iBuffer, out uvs);

            var delta = ((distance + 1) - (-distance - 1)) / 2.0f + 0.5f;

            vBuffer = vBuffer.Select(v => new Vector3(v.x - delta, 0.0f, v.z - delta)).ToList();

            this.walkableTiles = new HashSet <NVector2>(walkableTiles);

            mesh.Clear();
            mesh.SetVertices(vBuffer);
            mesh.SetIndices(iBuffer.ToArray(), MeshTopology.Quads, 0);
            mesh.uv = uvs.ToArray();

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
        }
示例#2
0
        /*void OnDrawGizmos() {
         *  Gizmos.color = new Color(1, 0.45f, 0.25f, 0.5f);
         *
         *  if(visibleArea == null) return;
         *
         *  var awareness = enemyActor.stats.currentStats.awareness;
         *  var pos = enemyActor.GridPosition;
         *  var forward = new NVector2(this.transform.forward.To2DXZ());
         *  var right = new NVector2(forward.y, -forward.x);
         *
         *  for (int x = 0; x < (awareness*2)+1; ++x) {
         *      for (int y = 0; y < awareness+1; ++y) {
         *          if(! visibleArea[x, y]) continue;
         *
         *          var wpos = GridUtil.GridToWorld((pos + forward*y + right*(x-awareness-1)));
         *
         *          Gizmos.DrawCube(wpos, Vector3.one * 0.25f);
         *      }
         *  }
         *  /*
         *  for (int x = -visibleArea.GetLength(0) / 2; x < visibleArea.GetLength(0) / 2; ++x) {
         *      for (int y = -visibleArea.GetLength(1) / 2; y < visibleArea.GetLength(1) / 2; ++y) {
         *          if(visibleArea[x + visibleArea.GetLength(0) / 2, y + visibleArea.GetLength(1) / 2])
         *
         *
         *              Gizmos.DrawCube(this.transform.position - new Vector3(x, 0, y), Vector3.one * 0.25f);
         *      }
         *  }
         #1#
         * }*/

        public void RecalculateVisibleArea(bool step)
        {
            if (!step)
            {
                return;
            }

            var awareness = enemyActor.stats.currentStats.awareness;


            visibleArea = VisibleArea.CalculateVisibleArea(
                enemyActor.GridPosition,
                awareness,
                new NVector2(this.transform.forward.To2DXZ()),
                viewAngle: enemyActor.stats.viewAngle
                );

            var vol = GenerationLib.makeVolume(
                new float[3][] {
                new float[] { -awareness, awareness + 1, 1f },
                new float[] { 0, 1, 1f },
                new float[] { 0, awareness + 1, 1f }
            }, (x, y, z) => {
                if ((int)y < 0.5f)
                {
                    return(0);
                }

                if ((awareness + x) < 0 || (awareness + x) >= visibleArea.GetLength(0))
                {
                    return(0);
                }
                if ((z) < 0 || (z) >= visibleArea.GetLength(1))
                {
                    return(0);
                }
                return(visibleArea[awareness + (int)x, (int)z] ? 1 : 0);
            });


            // copied from PlayerActionSelector:
            // potential refactor to an own method

            List <int>     iBuffer;
            List <Vector2> uvs;
            List <Vector3> vBuffer;

            SurfaceNets.GenerateSurfaceMesh(vol, 0.5f, out vBuffer, out iBuffer, out uvs);

            //      var delta = 0f;//(awareness - awareness)/2.0f +0.5f;

//            var gridpos = enemyActor.GridPosition;
//            var forward = new NVector2(this.transform.forward.To2DXZ());
//            var right = new NVector2(forward.y, -forward.x);

            vBuffer = vBuffer.Select(v => this.transform.forward * (v.z - 0.5f) + this.transform.right * (v.x - awareness - 0.5f)).ToList();

            // this.walkableTiles = new HashSet<NVector2>(walkableTiles);

            mesh.Clear();
            mesh.SetVertices(vBuffer);
            mesh.SetIndices(iBuffer.ToArray(), MeshTopology.Quads, 0);
            mesh.uv = uvs.ToArray();

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();
        }