コード例 #1
0
    GameObject TrySpawnPrefab(GameObject prefab, List <BoxCollider> spawnAreas, List <GameObject> prevSpawned)
    {
        var obj   = Instantiate(prefab);
        int tries = 50;

        do
        {
            var box = spawnAreas[Random.Range(0, spawnAreas.Count)];
            obj.transform.position  = BoxPointSelector.GetRandPointWithinBox(box, spawnSpacing);
            obj.transform.position += Vector3.down * obj.transform.position.y;
        }while(CheckOverlapping(obj, prevSpawned) && --tries > 0);

        obj.transform.Rotate(Vector3.up, Random.Range(0.0f, 360.0f));

        return(obj);
    }
コード例 #2
0
    protected override void Update()
    {
        base.Update();

        switch (phase)
        {
        case 0:
        {
            var diff = player.transform.position - transform.position;
            diff.y = 0.0f;
            Move(diff);
            if (diff.sqrMagnitude < Mathf.Pow(fireballDist, 2))
            {
                StopMoving();
                phase = 1;
                animCtrl.SetBool("spin", true);
            }
        }
        break;

        case 1:
            if (fireballDuration.Update(Time.deltaTime))
            {
                phase = 2;
                // animCtrl.SetBool( "spin",false );
                // animCtrl.SetBool( "walk",true );
                fireballDuration.Reset();
            }
            else
            {
                if (fireballRefire.Update(Time.deltaTime))
                {
                    fireballRefire.Reset();

                    float randY = BoxPointSelector.GetRandPointWithinBox(boxColl).y;
                    var   pos   = transform.position;
                    pos.y = randY;

                    pos.x += Random.Range(-1.0f, 1.0f);
                    pos.z += Random.Range(-1.0f, 1.0f);

                    // float ang = Random.Range( 0.0f,360.0f );
                    // var dir = new Vector3( Mathf.Cos( ang ),Mathf.Sin( ang ),0.0f ) * fireballSpeed;
                    var targetPos = player.transform.position + new Vector3(
                        Random.Range(-1.0f, 1.0f) * fireballSpread.x,
                        Random.Range(-1.0f, 1.0f) * fireballSpread.y,
                        Random.Range(-1.0f, 1.0f) * fireballSpread.z);
                    var dir = targetPos - pos;

                    FireProjectile(fireballPrefab, pos, dir.normalized * fireballSpeed);
                }
            }
            break;

        case 2:
            if (spawnDuration.Update(Time.deltaTime))
            {
                prevMinion.ActivateSelf();

                spawnDuration.Reset();
                phase = 3;

                animCtrl.SetBool("spin", false);
                animCtrl.SetBool("walk", true);

                targetSpot = player.transform.position;
            }
            else
            {
                if (spawnRefire.Update(Time.deltaTime))
                {
                    spawnRefire.Reset();
                    var minion = Instantiate(minionPrefab);
                    minion.transform.position = transform.position + Vector3.up * 1.0f;
                    var jumpDir = new Vector3(
                        Random.Range(-1.0f, 1.0f), 0.0f, Random.Range(-1.0f, 1.0f))
                                  .normalized *minionSpawnHorizontal;
                    jumpDir.y = minionSpawnJump * minionSpawnJump;
                    minion.GetComponent <Rigidbody>().AddForce(jumpDir, ForceMode.Impulse);

                    // Activate last minion when we spawn new one so they dont all follow while flying.
                    prevMinion?.ActivateSelf();
                    prevMinion = minion.GetComponent <EnemyBase>();
                    prevMinion.DisableDrops();
                }
            }
            break;

        case 3:
            if (trackingDuration.Update(Time.deltaTime))
            {
                trackingDuration.Reset();
                phase = 0;
            }
            else
            {
                if (trackRetarget.Update(Time.deltaTime))
                {
                    trackRetarget.Reset();
                    targetSpot = player.transform.position;
                }

                Move(targetSpot - transform.position);
            }
            break;
        }
    }
コード例 #3
0
    public void PopulateRoom(List <GameObject> decoPrefabs, float decoSpawnChance,
                             List <GameObject> enemyPrefabs, bool spawnChest = false)
    {
        if (chestPrefab == null)
        {
            chestPrefab = ResLoader.Load("Prefabs/Dungeon/TreasureChest");
        }

        var possibleSpawnAreas = new List <Transform>();

        Transform spawnAreas = transform.Find("SpawnAreas");

        for (int i = 0; i < spawnAreas.childCount; ++i)
        {
            bool canSpawn = false;

            if (!ignoreWalls)
            {
                foreach (int decoWall in decoConns[i])
                {
                    foreach (int openWall in doorMap[exitDir][exitChoice])
                    {
                        if (decoWall == openWall)
                        {
                            canSpawn = true;
                        }
                    }
                }
            }

            if (canSpawn || ignoreWalls)
            {
                possibleSpawnAreas.Add(spawnAreas.GetChild(i));
            }
        }

        // foreach( var area in possibleSpawnAreas )
        for (int i = 0; i < possibleSpawnAreas.Count; ++i)
        {
            var area = possibleSpawnAreas[i];

            var boxes     = area.GetComponentsInChildren <BoxCollider>();
            var chosenBox = boxes[Random.Range(0, boxes.Length - 1)];
            var spawnLoc  = BoxPointSelector.GetRandPointWithinBox(
                chosenBox, 1.6f);

            GameObject spawnedObj = null;

            if (Random.Range(0.0f, 1.0f) < decoSpawnChance ||
                (i >= possibleSpawnAreas.Count - 1 && spawnChest))
            {
                if (spawnChest)
                {
                    spawnedObj = Instantiate(chestPrefab);
                }
                else
                {
                    spawnedObj = Instantiate(decoPrefabs[Random.Range(0, decoPrefabs.Count)]);
                }

                spawnLoc.y = area.position.y;
            }
            else
            {
                spawnedObj = Instantiate(enemyPrefabs[Random.Range(0, enemyPrefabs.Count)]);
            }
            spawnedObj.transform.position = spawnLoc;
            spawnedObj.transform.Rotate(Vector3.up, Random.Range(0.0f, 360.0f));
        }

        int nChildren = spawnAreas.childCount;

        for (int i = 0; i < nChildren; ++i)
        {
            var boxes = spawnAreas.GetChild(i).GetComponentsInChildren <BoxCollider>();
            foreach (var box in boxes)
            {
                Destroy(box);
            }
        }
    }