// Use this for initialization
    void Start()
    {
        BoatSteerObstacleGenerator generator = new BoatSteerObstacleGenerator(fieldWidth, fieldLength, obstacleRadius, obstacleK);

        generator.GenerateObstacleField();
        foreach (Vector2 point in generator.GetPoints())
        {
            GameObject obstacle = Instantiate(staticObstacleTemplate);
            obstacle.transform.localPosition = new Vector3(point.x - fieldWidth / 2f, 0f, point.y + offset);
            obstacle.SetActive(true);
        }
    }
Example #2
0
    // Use this for initialization
    void Start()
    {
        // Apply boat settings to actual boat.
        float speed            = boat.speed;
        float maxLateralFactor = boat.maxLateralSpeedFactor;

        // Calculate obstacle field dimensions from boat settings

        float fieldMercyLength = fieldStartSeconds * speed;
        float fieldLength      = (fieldEndSeconds - fieldStartSeconds) * speed;
        float fieldWidth       = 2f * maxLateralFactor * speed * fieldEndSeconds;

        BoatSteerObstacleGenerator generator = new BoatSteerObstacleGenerator(fieldWidth, fieldLength, obstacleRadius, obstacleK);

        generator.GenerateObstacleField();

        int obstacleSpriteIndex = 0;

        uniqueSprites.Shuffle();
        int uniqueSpriteIndex = 0;

        obstacles = new List <GameObject>();

        foreach (Vector2 point in generator.GetPoints())
        {
            // Horizontally center the point
            Vector2 obstacleLocation = point;
            obstacleLocation.x -= fieldWidth / 2f;
            // Shift the point out far enough that it can't be hit for fieldStartSeconds
            obstacleLocation.y += fieldMercyLength;

            // Actually instantiate the obstacle
            GameObject     obstacle = Instantiate(staticObstacleTemplate);
            SpriteRenderer renderer = obstacle.GetComponent <SpriteRenderer>();
            if (uniqueSpriteIndex < uniqueSprites.Length && Random.value < uniqueProbability)
            {
                renderer.sprite = uniqueSprites[uniqueSpriteIndex];
                uniqueSpriteIndex++;
            }
            else
            {
                renderer.sprite     = obstacleSprites[obstacleSpriteIndex];
                obstacleSpriteIndex = (obstacleSpriteIndex + 1) % obstacleSprites.Length;
            }
            obstacle.transform.localPosition = new Vector3(obstacleLocation.x, 0f, obstacleLocation.y);
            obstacle.transform.localScale   *= obstacleScaleMult;
            obstacle.SetActive(true);
            obstacles.Add(obstacle);
        }

        // Find the closest obstacle to the center of the obstacle spread and put murasa in front of it,
        // ensuring she doesn't start with a clear path
        var minPos = new Vector3(
            obstacles.Min(a => a.transform.position.x),
            0f,
            obstacles.Min(a => a.transform.position.z));
        var maxPos = new Vector3(
            obstacles.Max(a => a.transform.position.x),
            0f,
            obstacles.Max(a => a.transform.position.z));
        var midPos             = minPos + ((maxPos - minPos) / 2f);
        var closestObstaclePos = obstacles
                                 .OrderBy(a => Mathf.Abs((a.transform.position - midPos).magnitude))
                                 .FirstOrDefault()
                                 .transform.position;

        boat.transform.position = new Vector3(closestObstaclePos.x, boat.transform.position.y, boat.transform.position.z);
    }