public void Launch(Vec3 velocity) { ReceiveUpdates = true; state = BoidState.Launched; Physics.AddImpulse(velocity); OnLaunched(velocity); }
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; } }
void OnStoppedMoving() { if(Launcher.Instance != null) { postFire = null; ReceiveUpdates = false; state = BoidState.Dead; Launcher.Instance.PostFire(); } }
void OnStoppedMoving() { if (Launcher.Instance != null) { postFire = null; ReceiveUpdates = false; state = BoidState.Dead; Launcher.Instance.PostFire(); } }
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); } }
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(); }
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; }
// 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); }
// Use this for initialization void Start () { state = BoidState.Flying; renEnabled = true; noiseOffset = Random.Range(0f, 10f); roll = 0f; rollVelocity = 0f; callDelayTimeRemaining = 0f; flockedWithPlayerLastFrame = false; }
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); } }