コード例 #1
0
    /// <summary>
    /// 根据类型,生成一组怪物
    /// </summary>
    /// <param name="type"></param>
    private void SpawnBotGroup(BotGroup.Type type)
    {
        float   speed = spawnNextSpeed;
        Vector3 spawnPos;

        spawnPos    = character.transform.position;
        spawnPos.z += spawnPosOffect;
        switch (spawnGroupTypeCurrent)
        {
        case BotGroup.Type.Slow:
        {
            speed = 1.0f;
        }
        break;

        case BotGroup.Type.Normal:
        {
            speed = spawnNextSpeed;
        }
        break;
        }

        BotGroup botGroup = GameObject.Instantiate <BotGroup>(botGroupPrefab);
        //怪物组生成的Y轴位置处于自身碰撞盒范围的一半
        var extents = botGroup.GetComponent <Collider>().bounds.extents;

        spawnPos.y = extents.y / 2;
        botGroup.transform.position = spawnPos;
        //怪物组生成内部怪物
        botGroup.SpawnBot(spawnBotNum);
        botGroup.runSpeed = speed;
    }
コード例 #2
0
    public void UpdateNextGroupType()
    {
        //还有要生成的正常怪物时,先生成正常怪物
        if (spawnNormalCount > 0)
        {
            float rate;

            //用于计算10个以内的怪物加速
            rate = (float)botGroupCount / 10.0f;
            rate = Mathf.Clamp01(rate);

            //砍杀的怪物越多,下一批怪物的速度也越快,
            //通过rate,来在最大和最小速度间插值,使得下一波的速度,与当前击杀怪物数量成正比
            spawnNextSpeed = Mathf.Lerp(spawnNextSpeedMin, spawnNextSpeedMax, rate);

            //砍杀的怪物越多,下一批怪物的来的也会越快,
            //通过rate,来在最大和最小位置偏移中插值,使得下一波怪物到来的偏移位置,与当前击杀怪物数量成反比
            spawnLineNextOffect = Mathf.Lerp(spawnLineNextOffectMax, spawnLineNextOffectMin, rate);

            spawnNormalCount--;

            if (spawnNormalCount <= 0)
            {
                //当普通型怪物都生成完后,随机一种增强型怪物
                spawnGroupTypeNext = (BotGroup.Type)Random.Range(1, 1);
                spawnIncreaseCount = 1;
            }

            return;
        }
    }
コード例 #3
0
    public void GameLoop()
    {
        //准备生成一波怪物组
        if (!canSpawnNewGroup)
        {
            canSpawnNewGroup = true;

            if (canSpawnNewGroup)
            {
                // 通过玩家的当前位置计算玩家触发生成怪物组的触发位置

                if (spawnGroupTypeNext == BotGroup.Type.Normal)
                {
                    spawnLine = character.transform.position.z + spawnLineNextOffect;
                }
                else if (spawnGroupTypeNext == BotGroup.Type.Slow)
                {
                    spawnLine = character.transform.position.z + 50.0f;
                }
            }
        }

        ////////////////////////////////////////////////////////////////
        // 当玩家没有到达触发位置时,不生成任何怪物组
        if (character.transform.position.z <= spawnLine)
        {
            return;
        }

        //实际开始生成怪物组
        spawnGroupTypeCurrent = spawnGroupTypeNext;
        SpawnBotGroup(spawnGroupTypeCurrent);

        // 更新下次出现分组时的怪物数量
        spawnBotNum++;
        spawnBotNum = Mathf.Min(spawnBotNum, spawnBotNumMax);

        botGroupCount++;
        canSpawnNewGroup = false;

        //刷新下波怪物组的类型
        UpdateNextGroupType();
    }