// 直线射线在地图上的终点
    Vector3 GetLineEnd(Vector3 start, Vector3 direction)
    {
        float distance = 100;

        direction.Normalize();
        RaycastHit2D[] lineTest = Physics2D.RaycastAll(start, direction, distance);
        foreach (var hit in lineTest)
        {
            // if(hit.collider == null) continue;
            if (hit.collider.gameObject.CompareTag("Obstacle"))
            {
                ObstacleBase obstacle = hit.collider.gameObject.GetComponent <ObstacleBase>();
                if (obstacle.Type == ObstacleBase.ObstacleType.Glass)
                {
                    continue;
                }
                else
                {
                    return(hit.point);
                }
            }
        }

        return(start + direction * 3);
    }
Пример #2
0
 private void CreateObstacles()
 {
     for (int i = 0; i < obstaclesData.MaxObstaclePerPlatform; i++)
     {
         ObstacleBase obstacle = obstaclesData.ObstacleFactory.GetInstance();
         obstacle.transform.SetParent(holder);
         obstaclePool.SetInstance(obstacle);
     }
 }
Пример #3
0
 void OnObstacleEnd(ObstacleBase obstacle)
 {
     m_obstacles.Remove(obstacle);
     obstacle.DestroyAfterFrames(8);
     if (m_obstacles.Count == 0)
     {
         OnStageComplete();
     }
 }
Пример #4
0
    public void AddObstacle(ObstacleBase newObstacle)
    {
        if (newObstacle == null)
        {
            Debug.LogError("Please feed default obstacle for spawning action");
            return;
        }

        GameObject go = Instantiate(newObstacle, m_ObstacleContainer).gameObject;
    }
Пример #5
0
 public override void Enable()
 {
     for (int i = 0; i < Random.Range(obstaclesData.MinObstaclePerPlatform, obstaclesData.MaxObstaclePerPlatform); i++)
     {
         ObstacleBase currObstacle = obstaclePool.GetInctance();
         currObstacle.transform.localPosition = new Vector3(LanePos[Random.Range(0, LanePos.Count)].x, currObstacle.transform.position.y, Random.Range(-4, 5));
         currObstacle.gameObject.SetActive(true);
         activeObstacleHolder.Add(currObstacle);
     }
 }
Пример #6
0
    private void OnCollisionEnter2D(Collision2D collision)
    {
        // if collided object is an obstacle
        ObstacleBase obstacle = collision.transform.GetComponent <ObstacleBase>();

        if (obstacle != null)
        {
            obstacle.Interact(collision.relativeVelocity.magnitude);
        }
    }
Пример #7
0
    IEnumerator CreatObstacle(GameVector2[] _roleGrid)
    {
        dic_preObstacles = new Dictionary <string, GameObject> ();
        GameObject[] preObstacle = Resources.LoadAll <GameObject> ("BattleScene/Obstacle");
        foreach (var item in preObstacle)
        {
            dic_preObstacles [item.name] = item;
        }
        yield return(new WaitForEndOfFrame());

        bool[,] mapGrid = new bool[BattleData.mapRow, BattleData.mapColumn];

        foreach (var item in _roleGrid)
        {
            mapGrid [item.x, item.y] = true;
        }

        int _creatNum = 0;

        for (int i = 0; i < BattleData.mapRow; i++)
        {
            for (int j = 0; j < BattleData.mapColumn; j++)
            {
                if (mapGrid [i, j])
                {
                    continue;
                }
                else
                {
                    obstacleID++;
                    GameObject _base = Instantiate(dic_preObstacles["ObstacleBase"], obstacleParent);

                    string _modleStr = "ObsModel";
                    Instantiate(dic_preObstacles[_modleStr], _base.transform);

                    GameVector2  _pos      = BattleData.Instance.GetMapGridCenterPosition(i, j);
                    ObstacleBase _obstacle = _base.GetComponent <ObstacleBase> ();
                    _obstacle.InitData(obstacleID, _pos, 1);
                    dic_obstacles [obstacleID] = _obstacle;
                }

                _creatNum++;
                if (_creatNum % 3 == 0)
                {
                    yield return(new WaitForEndOfFrame());
                }
            }
        }

        initFinish = true;
    }
Пример #8
0
    public void Logic_Destory()
    {
        if (list_brokenObs.Count > 0)
        {
            for (int i = 0; i < list_brokenObs.Count; i++)
            {
                ObstacleBase _obs = list_brokenObs [0];
                dic_obstacles.Remove(_obs.objShape.ObjUid.objectID);
                _obs.DestorySelf();
            }

            list_brokenObs.Clear();
        }
    }
Пример #9
0
    private void OnGUI()
    {
        m_LevelTemplate = EditorGUILayout.ObjectField("Level Template", m_LevelTemplate, typeof(Level), true) as Level;

        if (GUILayout.Button("Setup Level"))
        {
            SetupLevel();
        }

        GUILayout.Space(10);

        m_ObstacleTemplate = EditorGUILayout.ObjectField("Obstacle Template", m_ObstacleTemplate, typeof(ObstacleBase), true) as ObstacleBase;
        if (GUILayout.Button("Create Obstacle"))
        {
            AddObstacle();
        }

        GUILayout.Space(10);

        if (GUILayout.Button("Create EntranceExit Pair"))
        {
            AddEntranceExitPointPair();
        }
    }
Пример #10
0
    private void UpdateNoSpawnZone()
    {
        // highlight blocks in no-spawn zone
        if (enemyPrefab != null)
        {
            EnemyBase enemyBase = enemyPrefab.GetComponentInChildren <EnemyBase>();
            float     bs        = level.blockSize;
            float     hs        = level.blockSize / 2;
            float     targetY   = hs + 0.2f;

            // find blocks inside the no spawn zone and add its corners to the list
            List <Vector3> noSpawnBlocks = new List <Vector3>(); // TODO maybe replace with set
            for (int i = 0; i < level.world.GetLength(0); i++)
            {
                for (int u = 0; u < level.world.GetLength(1); u++)
                {
                    Transform block = level.world[i, u].transform;
                    if (InNoSpawnZone(enemyBase, block.position))
                    {
                        noSpawnBlocks.Add(block.position);
                    }
                }
            }

            // filter for blocks that are in the middle and add corners
            List <Vector3> noSpawnCorners = new List <Vector3>();
            Vector3        minLevel       = level.world[0, 0].transform.position;
            Vector3        maxLevel       = level.world[level.rows - 1, level.lines - 1].transform.position;

            for (int i = 0; i < noSpawnBlocks.Count; i++)
            {
                Vector3 pos = noSpawnBlocks[i];

                // get surrounding blocks
                bool leftInZone  = pos.x > minLevel.x && InNoSpawnZone(enemyBase, pos + new Vector3(-bs, 0, 0));
                bool rightInZone = pos.x < maxLevel.x && InNoSpawnZone(enemyBase, pos + new Vector3(+bs, 0, 0));
                bool upInZone    = pos.z < maxLevel.z && InNoSpawnZone(enemyBase, pos + new Vector3(0, 0, +bs));
                bool downInZone  = pos.z > minLevel.z && InNoSpawnZone(enemyBase, pos + new Vector3(0, 0, -bs));

                // exclude blocks in the middle
                if (leftInZone && rightInZone && upInZone && downInZone)
                {
                    continue;
                }

                // add outer corners
                if (!leftInZone)
                {
                    noSpawnCorners.Add(pos + new Vector3(-hs, -pos.y + targetY, +hs));
                    noSpawnCorners.Add(pos + new Vector3(-hs, -pos.y + targetY, -hs));
                }
                if (!rightInZone)
                {
                    noSpawnCorners.Add(pos + new Vector3(+hs, -pos.y + targetY, +hs));
                    noSpawnCorners.Add(pos + new Vector3(+hs, -pos.y + targetY, -hs));
                }
                if (!upInZone)
                {
                    noSpawnCorners.Add(pos + new Vector3(+hs, -pos.y + targetY, +hs));
                    noSpawnCorners.Add(pos + new Vector3(-hs, -pos.y + targetY, +hs));
                }
                if (!downInZone)
                {
                    noSpawnCorners.Add(pos + new Vector3(+hs, -pos.y + targetY, -hs));
                    noSpawnCorners.Add(pos + new Vector3(-hs, -pos.y + targetY, -hs));
                }
            }

            noSpawnCorners = noSpawnCorners.Distinct().ToList();

            // sort them to connect only adjacent corners
            List <Vector3> sorted = new List <Vector3>();
            sorted.Add(noSpawnCorners[0]);
            noSpawnCorners.RemoveAt(0);
            int initialCount = noSpawnCorners.Count;
            for (int i = 0; i < initialCount; i++)
            {
                Vector3 last = sorted.Last();

                Vector3 platformPos = platform.transform.position;
                // find adjacent corners
                Vector3?next = noSpawnCorners
                               .Where(v => (v - last).sqrMagnitude == bs * bs)
                               .OrderBy(v => (platformPos - v).sqrMagnitude)
                               .Select(v => new Vector3?(v))
                               .FirstOrDefault();

                if (!next.HasValue)
                {
                    // FIXME this should not happen
                    //Debug.Log("nope" + last);
                    continue;
                }
                if (!sorted.Exists(v => (next.Value - v).sqrMagnitude <= 0.1))
                {
                    sorted.Add(next.Value);
                }
                noSpawnCorners.Remove(next.Value);
            }

            // finish circle
            sorted.Add(sorted[0]);

            // pass corners to line renderer
            Vector3[] vertices = sorted.ToArray();
            var       lr       = noSpawnZone.GetComponent <LineRenderer>();
            lr.positionCount = vertices.Length;
            lr.SetPositions(vertices);
        }

        // highlight no spawn zone of obstacles
        if (obstaclePrefab != null)
        {
            ObstacleBase ob = obstaclePrefab.GetComponentInChildren <ObstacleBase>();
            for (int i = 0; i < level.numPassedRails + ob.minPlatformSpawnDist; i++)
            {
                level.rail[i].GetChild(1).GetComponent <Renderer>().sharedMaterial = obstacleNoSpawnZoneMaterial;
            }

            for (int i = level.numPassedRails + ob.minPlatformSpawnDist; i < level.rail.Count; i++)
            {
                level.rail[i].GetChild(1).GetComponent <Renderer>().sharedMaterial = defaultRailMaterial;
            }
        }
    }
Пример #11
0
    private void CreateObstacleOn(Transform rail)
    {
        // index of the rail that was clicked
        int clickedIndex = level.rail.FindIndex(t => t.position.x == rail.position.x && t.position.z == rail.position.z);

        // dont put obstacles behind or inside the platform
        if (clickedIndex <= level.numPassedRails)
        {
            SpawnError("Cannot place behind platform!");
            return;
        }

        // dont put obstacles on already existing obstacles
        if (placedObstacles.ContainsKey(clickedIndex))
        {
            GameObject obstacle = placedObstacles[clickedIndex];
            if (obstacle == null)
            {
                placedObstacles.Remove(clickedIndex); // stored obstacle has been destroyed
            }
            else
            {
                SpawnError("Cannot place on obstacle!");
                return;
            }
        }

        // get direction between rail blocks
        Vector3    currentPosition   = level.rail[clickedIndex].transform.position;
        Vector3    lastPosition      = level.rail[clickedIndex - 1].transform.position;
        Quaternion platformDirection = Quaternion.LookRotation(currentPosition - lastPosition);

        if (obstaclePrefab == null)
        {
            SpawnError("No obstacle selected");
            return;
        }

        // get obstacle base
        ObstacleBase obstacleBase = obstaclePrefab.GetComponent <ObstacleBase>();

        Debug.Assert(obstacleBase != null);

        // check if too close to platform
        if ((clickedIndex - level.numPassedRails) < obstacleBase.minPlatformSpawnDist)
        {
            SpawnError("Too close!");
            return;
        }

        // buy obstacle
        float cost = obstacleBase.placingCost;

        if (spawnResource.SafeChangeValue(-cost))
        {
            GameObject placed = Instantiate(obstaclePrefab, rail.position, platformDirection);
            placedObstacles.Add(clickedIndex, placed);
        }
        else
        {
            SpawnError("Not enough money!");
        }
    }