Beispiel #1
0
        public void Launch(Vec3 velocity)
        {
            ReceiveUpdates = true;
            state = BoidState.Launched;

            Physics.AddImpulse(velocity);
            OnLaunched(velocity);
        }
Beispiel #2
0
        public void Launch(Vec3 velocity)
        {
            ReceiveUpdates = true;
            state          = BoidState.Launched;

            Physics.AddImpulse(velocity);
            OnLaunched(velocity);
        }
Beispiel #3
0
    void FiniteStateMachine()
    {
        switch (boidState)
        {
        case BoidState.PURSUE:
            PursueLogic();
            break;

        case BoidState.SEEK:
            SeekLogic();
            break;

        case BoidState.ARRIVE:
            ArriveLogic();
            break;

        case BoidState.FLEE:
            FleeLogic();
            break;

        case BoidState.FLEEANDARRIVE:
            FleeAndArriveLogic();
            break;

        case BoidState.OFFSETPURSUE:
            OffsetPursueLogic();
            break;

        default:
            break;
        }

        switch (gunState)
        {
        case GunState.SHOOTING:
            if (targetingSystem.dogFight)
            {
                boidState = fight;
            }
            else
            {
                boidState = retreat;
            }
            break;

        case GunState.NOTSHOOTING:
            boidState = defending;
            break;

        default:
            //No Fire
            break;
        }
    }
Beispiel #4
0
        void OnStoppedMoving()
        {
            if(Launcher.Instance != null)
            {
                postFire = null;

                ReceiveUpdates = false;
                state = BoidState.Dead;

                Launcher.Instance.PostFire();
            }
        }
Beispiel #5
0
        void OnStoppedMoving()
        {
            if (Launcher.Instance != null)
            {
                postFire = null;

                ReceiveUpdates = false;
                state          = BoidState.Dead;

                Launcher.Instance.PostFire();
            }
        }
Beispiel #6
0
        public void Execute(Entity *entity, ref BoidState boidState)
        {
            if (!boidState.IsDied)
            {
                return;
            }
            if (!boidState.IsScored)
            {
                _gameStateService.CurScore++;
                var ptr = _context._entities.GetBoidObstacle(boidState.Killer);
                if (ptr != null && ptr->IsActive)
                {
                    ptr->Player.Score++;
                }

                boidState.IsScored = true;
            }
            if (boidState.SinkTimer < 0)
            {
                _context.PostCmdDestroyEntity(entity);
            }
        }
Beispiel #7
0
    void Start()
    {
        Unity.Mathematics.Random random = new Unity.Mathematics.Random(12345);

        RenderMesh enemyRenderMesh = new RenderMesh
        {
            mesh           = enemyMesh,
            material       = enemyMaterial,
            subMesh        = 0,
            castShadows    = ShadowCastingMode.Off,
            receiveShadows = false
        };

        RenderMesh defenderRenderMesh = new RenderMesh
        {
            mesh           = defenderMesh,
            material       = defenderMaterial,
            subMesh        = 0,
            castShadows    = ShadowCastingMode.Off,
            receiveShadows = false
        };

        RenderMesh asteroidRenderMesh = new RenderMesh
        {
            mesh           = asteroidMesh,
            material       = asteroidMaterial,
            subMesh        = 0,
            castShadows    = ShadowCastingMode.Off,
            receiveShadows = false
        };

        entityManager = World.Active.GetOrCreateManager <EntityManager>();

        seekTargetArchetype = entityManager.CreateArchetype(
            typeof(Translation),
            typeof(Rotation),
            typeof(Scale),
            typeof(RenderMesh),
            typeof(LocalToWorld),
            typeof(BoidState),
            typeof(Velocity)
            );

        asteroidArchetype = entityManager.CreateArchetype(
            typeof(Translation),
            typeof(Rotation),
            typeof(Scale),
            typeof(RenderMesh),
            typeof(LocalToWorld),
            typeof(RotationPoint),
            typeof(OrbitSpeed),
            typeof(OrbitRotation),
            typeof(OrbitRadius)
            );

        NativeArray <Entity> asteroidEntityArray = new NativeArray <Entity>(numberAsteroids, Allocator.Temp);

        entityManager.CreateEntity(asteroidArchetype, asteroidEntityArray);

        for (int i = 0; i < numberAsteroids; i++)
        {
            // Calculate a position around the planet
            // Use distance and angle
            float angle  = random.NextFloat(0.0f, 360.0f);
            float radius = random.NextFloat(400.0f, 400.0f + outerSpread);
            float height = random.NextFloat(-(asteroidBeltHeight / 2), asteroidBeltHeight / 2);

            float3 pos = new float3(Mathf.Cos(angle), 0, Mathf.Sin(angle)) * radius;
            pos.y = height;

            entityManager.SetComponentData(asteroidEntityArray[i], new Translation {
                Value = pos
            });
            entityManager.SetSharedComponentData <RenderMesh>(asteroidEntityArray[i], asteroidRenderMesh);
            entityManager.SetComponentData(asteroidEntityArray[i], new Rotation {
                Value = Quaternion.identity
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new Scale {
                Value = random.NextFloat(1.0f, 5.0f)
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new LocalToWorld {
                Value = float4x4.identity
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new RotationPoint {
                Value = new float3(0.0f, 0.0f, 0.0f)
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new OrbitSpeed {
                Value = 10.0f
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new OrbitRotation {
                Value = angle
            });
            entityManager.SetComponentData(asteroidEntityArray[i], new OrbitRadius {
                Value = radius
            });
        }


        NativeArray <Entity> enemyEntityArray = new NativeArray <Entity>(enemyRows * enemyCols, Allocator.Temp);

        entityManager.CreateEntity(seekTargetArchetype, enemyEntityArray);

        // Spawn enemies
        for (int cols = 0; cols < enemyCols; cols++)
        {
            for (int rows = 0; rows < enemyRows; rows++)
            {
                float heightOffset = random.NextFloat(-(enemyHeightRange / 2), enemyHeightRange / 2);

                float3 pos    = new float3(50 * cols, battleBaseHeight + heightOffset + 200, 1650.0f + rows * 30.0f);
                float3 target = new float3(50 * cols, battleBaseHeight + heightOffset, 1150.0f + rows * 30.0f);

                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], new Translation {
                    Value = pos
                });
                entityManager.SetSharedComponentData <RenderMesh>(enemyEntityArray[cols * enemyRows + rows], enemyRenderMesh);
                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], new Rotation {
                    Value = Quaternion.identity
                });
                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], new Scale {
                    Value = 1.0f
                });
                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], new LocalToWorld {
                    Value = float4x4.identity
                });
                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], new Velocity {
                    Value = new float3(0.0f, 0.0f, 0.0f)
                });

                BoidState boidState = new BoidState();
                boidState.state  = State.Arriving;
                boidState.target = target;

                entityManager.SetComponentData(enemyEntityArray[cols * enemyRows + rows], boidState);
            }
        }

        enemyEntityArray.Dispose();

        NativeArray <Entity> defenderEntityArray = new NativeArray <Entity>(defenderRows * defenderCols, Allocator.Temp);

        entityManager.CreateEntity(seekTargetArchetype, defenderEntityArray);

        // Spawn Defenders
        for (int cols = 0; cols < defenderCols; cols++)
        {
            for (int rows = 0; rows < defenderRows; rows++)
            {
                float heightOffset = random.NextFloat(-(defenderHeightRange / 2), defenderHeightRange / 2);

                float3 pos    = new float3(50 * cols, battleBaseHeight + heightOffset, 450.0f + rows * 30.0f);
                float3 target = new float3(50 * cols, battleBaseHeight + heightOffset, 850.0f + rows * 30.0f);

                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], new Translation {
                    Value = pos
                });
                entityManager.SetSharedComponentData <RenderMesh>(defenderEntityArray[cols * defenderRows + rows], defenderRenderMesh);
                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], new Rotation {
                    Value = Quaternion.identity
                });
                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], new Scale {
                    Value = 1.0f
                });
                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], new LocalToWorld {
                    Value = float4x4.identity
                });
                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], new Velocity {
                    Value = new float3(0.0f, 0.0f, 0.0f)
                });

                BoidState boidState = new BoidState();
                boidState.state  = State.Arriving;
                boidState.target = target;

                entityManager.SetComponentData(defenderEntityArray[cols * defenderRows + rows], boidState);
            }
        }

        defenderEntityArray.Dispose();
    }
Beispiel #8
0
    private IEnumerator LaunchRoutine(Vector3 direction) {
        state = BoidState.Launching;
        Vector3 launchVel = direction.normalized * maxSpeed;

        for (float timer = 0f; timer < launchTime; timer += Time.deltaTime) {
            velocity = launchVel;
            transform.position += velocity * Time.deltaTime;
            transform.LookAt(transform.position + velocity, Vector3.up);

            yield return null;
        }

        if (type == BoidType.Giant) {
            PlaySound();
        }

        state = BoidState.Flying;
    }
Beispiel #9
0
	// Update is called once per frame
	public void UpdatePosition (Vector3 playerPosition, Vector3 playerVelocity, bool parentEnabled) {
        callDelayTimeRemaining -= Time.deltaTime;

        Vector3 toPlayer = playerPosition - transform.position;
        float toPlayerDist = toPlayer.magnitude;

        // disable at set distance
        if (state == BoidState.Flying && toPlayerDist > maxDist) {
            state = BoidState.Disabled;

            // move within range of target
            if (target != null) {
                Vector3 toTarget = target.transform.position - transform.position;
                float distToTarget = toTarget.magnitude;
                if (distToTarget > maxDistFromTarget) {
                    transform.position = target.transform.position + (toTarget / distToTarget) * maxDistFromTarget * 0.5f;
                }
            }
        } else if (state == BoidState.Disabled && toPlayerDist <= maxDist) {
            state = BoidState.Flying;
        }

        if (state == BoidState.Flying) {
            FlyUpdate(playerPosition, playerVelocity);
        }

        EnableRenderers(state != BoidState.Disabled && parentEnabled);
	}
Beispiel #10
0
	// Use this for initialization
	void Start () {
        state = BoidState.Flying;
        renEnabled = true;

        noiseOffset = Random.Range(0f, 10f);

        roll = 0f;
        rollVelocity = 0f;

        callDelayTimeRemaining = 0f;

        flockedWithPlayerLastFrame = false;
	}
Beispiel #11
0
    public void Update(AI ai)
    {
        var goa = GameObject.FindGameObjectsWithTag (tagToSearch);

        foreach (var gameObject in goa.Where<GameObject>(gameObject => Vector3.Distance(gameObject.transform.position, ai.transform.position) <=searchRadius).Where(gameObject =>gameObject.GetComponent<AI>() && !boidGroup.Contains (gameObject.GetComponent<AI>()))) {
                        boidGroup.Add (gameObject.GetComponent<AI> ());
                }

        if (leader == null && boidGroup.Count > 0) {

            leader = boidGroup[Random.Range (0, boidGroup.Count)];
            foreach (var boid in boidGroup)
            {
                if(boid.boids.leader != leader && boid.boids.leader != null) leader = boid.boids.leader;
            }
        }
        if (leader == ai)
        {
            boidState = BoidState.Ignore;
            foreach (var boid in boidGroup.Where (boid => boid.boids.leader !=ai).Where (boid => boid.boids.leader == boid || boid.boids.leader == null))
                boid.boids.leader = ai;
            return;
        }

        foreach (var boid in boidGroup)
                        boid.boids.leader = leader;
        if (leader != null) {
            //ai.aStar = null;
            if(boidState == BoidState.Ignore)
                boidState = 0;
        }
        //else ai.astar = null;

        ai.Idle = leader.Idle;
        switch (boidState) {

            case BoidState.Alignment:
            ai.transform.rotation = Quaternion.Slerp(ai.transform.rotation, leader.transform.rotation, Time.deltaTime * ai.turnSpeed);
            ai.CurrentSpeed = leader.CurrentSpeed;

            if(Vector3.Distance(ai.transform.position, leader.transform.position) <= seperationRadius / 2)
            boidState = BoidState.Seperation;

            if(Vector3.Distance(ai.transform.position, leader.transform.position) >= seperationRadius)
                boidState = BoidState.Cohesion;

            break;

            case BoidState.Cohesion:
            ai.CurrentSpeed = ai.runSpeed;
            ai.transform.rotation = Quaternion.Slerp(ai.transform.rotation, Quaternion.LookRotation(leader.transform.position - leader.transform.forward * -1), Time.deltaTime * ai.turnSpeed);

            if(Vector3.Distance(ai.transform.position, leader.transform.position) <= seperationRadius - .5f)
                boidState = 0;
            break;

            case BoidState.Seperation:
            ai.CurrentSpeed = ai.runSpeed;
            ai.transform.rotation = Quaternion.Slerp(ai.transform.rotation, Quaternion.LookRotation(ai.transform.position - leader.transform.position), Time.deltaTime * ai.turnSpeed);

            if(Vector3.Distance(ai.transform.position, leader.transform.position) >= seperationRadius /2)
                boidState = 0;
            break;

            case BoidState.Ignore:
            break;
            }

        foreach (var boid in boidGroup)
        {
            if(Vector3.Distance (boid.transform.position, ai.transform.position) <= seperationRadius / 2)
                ai.rigidbody.AddForce((ai.transform.position - boid.transform.position)*ai.runSpeed * Time.deltaTime);
        }
    }