public override void Think(TankThinker tank) { float stateTimeout = tank.Remember <float>("stateTimeout"); stateTimeout -= Time.deltaTime; tank.Remember("stateTimeout", stateTimeout); var state = tank.Remember <States>("state"); var move = tank.GetComponent <TankMovement>(); if (state == States.Moving) { move.Steer(tank.Remember <float>("moveForwardBack"), tank.Remember <float>("moveLeftRight")); } else { move.Steer(0, 0); } if (stateTimeout < 0) { switch (state) { case States.Idle: { tank.Remember("state", States.Moving); tank.Remember("stateTimeout", Random.Range(moveTime.minValue, moveTime.maxValue)); tank.Remember("moveForwardBack", Random.Range(-1f, 1f)); tank.Remember("moveLeftRight", Random.Range(-1f, 1f)); break; } case States.Moving: { tank.Remember("state", States.Firing); tank.Remember("stateTimeout", Random.Range(fireTime.minValue, fireTime.maxValue)); var tankFire = tank.GetComponent <TankShooting>(); tankFire.BeginChargingShot(); break; } case States.Firing: { var tankFire = tank.GetComponent <TankShooting>(); tankFire.FireChargedShot(); tank.Remember("state", States.Idle); tank.Remember("stateTimeout", Random.Range(idleTime.minValue, idleTime.maxValue)); break; } } } }
public override void Think(TankThinker tank) { var movement = tank.GetComponent <TankMovement>(); movement.Steer(Input.GetAxis(m_MovementAxisName), Input.GetAxis(m_TurnAxisName)); var shooting = tank.GetComponent <TankShooting>(); if (Input.GetButton(m_FireButton)) { shooting.BeginChargingShot(); } else { shooting.FireChargedShot(); } }
public override void Think(TankThinker tank) { var movement = tank.GetComponent <TankMovement>(); movement.Steer(Input.GetAxis(m_MovementAxisName), Input.GetAxis(m_TurnAxisName)); var shooting = tank.GetComponent <TankShooting>(); if (Input.GetButton(m_FireButton)) { shooting.BeginChargingShot(); } else { shooting.FireChargedShot(); } //Setup player vs enemy awareness. if (PlayerControlledTankMovement == null) { PlayerControlledTankMovement = tank.GetComponent <TankMovement>(); } if (PlayerControlledTankHealth == null) { PlayerControlledTankHealth = tank.GetComponent <TankHealth>(); } if (TankRigidBody == null || TankRigidBody.GetHashCode() == 0) { Instance = this; //Saving a reference to the Rigid Body of this Tank, so that we can later check against it. //Used for damage-related tasks. TankRigidBody = tank.GetComponent <Rigidbody>(); //L.D("TankRigidBody created for PlayerControlledTank with Hash: " + GetHashCode()); } }
public override void Think(TankThinker tank) { var shooting = tank.GetComponent <TankShooting>(); var cooldown = shooting.m_ShellStatsEnemy.ShotCooldown.CurrentValue + shooting.m_ShellStatsEnemy.CurrentShotCooldownBuff; //Cooldown is set from Shell Stats. timeBetweenShots.minValue = cooldown; timeBetweenShots.maxValue = cooldown + 1; GameObject target = tank.Remember <GameObject>("target"); var movement = tank.GetComponent <TankMovement>(); if (!target) { // Find the nearest tank that isn't me target = GameObject .FindGameObjectsWithTag("Player") .OrderBy(go => Vector3.Distance(go.transform.position, tank.transform.position)) .FirstOrDefault(go => go != tank.gameObject); tank.Remember <GameObject>("target"); } if (!target) { // No targets left - drive in a victory circle movement.Steer(0.5f, 1f); return; } // aim at the target Vector3 desiredForward = (target.transform.position - tank.transform.position).normalized; if (Vector3.Angle(desiredForward, tank.transform.forward) > aimAngleThreshold) { bool clockwise = Vector3.Cross(desiredForward, tank.transform.forward).y > 0; movement.Steer(0f, clockwise ? -1 : 1); } // Chasing tank advances slowly towards player. else { //But only close enough to kill. var distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position); if (distanceToTarget > 20) { movement.Steer(0.01f * (enemyTankStats.Speed.CurrentValue + enemyTankStats.CurrentSpeedBuff), 0f); } else if (distanceToTarget < 15) { movement.Steer(-0.01f * (enemyTankStats.Speed.CurrentValue + enemyTankStats.CurrentSpeedBuff), 0f); } //Reached target. Freeze! else { movement.Steer(0, 0); } } // Fire at the target if (!shooting.IsCharging) { if (Time.time > tank.Remember <float>("nextShotAllowedAfter")) { float distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position); float timeToCharge = distanceToTarget * Random.Range(chargeTimePerDistance.minValue, chargeTimePerDistance.maxValue); tank.Remember("fireAt", Time.time + timeToCharge); shooting.BeginChargingShot(); } } else { float fireAt = tank.Remember <float>("fireAt"); if (Time.time > fireAt) { shooting.FireChargedShot(); tank.Remember("nextShotAllowedAfter", Time.time + Random.Range(timeBetweenShots.minValue, timeBetweenShots.maxValue)); } } }
public override void Think(TankThinker tank) { GameObject target = tank.Remember <GameObject>("target"); var movement = tank.GetComponent <TankMovement>(); if (!target) { // Find the nearest tank that isn't me target = GameObject .FindGameObjectsWithTag("Player") .OrderBy(go => Vector3.Distance(go.transform.position, tank.transform.position)) .FirstOrDefault(go => go != tank.gameObject); tank.Remember <GameObject>("target"); } if (!target) { // No targets left - drive in a victory circles movement.Steer(0.5f, 1f); return; } // aim at the target Vector3 desiredForward = (target.transform.position - tank.transform.position).normalized; if (Vector3.Angle(desiredForward, tank.transform.forward) > aimAngleThreshold) { bool clockwise = Vector3.Cross(desiredForward, tank.transform.forward).y > 0; movement.Steer(0f, clockwise ? -1 : 1); } else { // Stop movement.Steer(0f, 0f); } // Fire at the target var shooting = tank.GetComponent <TankShooting>(); if (!shooting.IsCharging) { if (Time.time > tank.Remember <float>("nextShotAllowedAfter")) { float distanceToTarget = Vector3.Distance(target.transform.position, tank.transform.position); float timeToCharge = distanceToTarget * Random.Range(chargeTimePerDistance.minValue, chargeTimePerDistance.maxValue); tank.Remember("fireAt", Time.time + timeToCharge); shooting.BeginChargingShot(); } } else { float fireAt = tank.Remember <float>("fireAt"); if (Time.time > fireAt) { shooting.FireChargedShot(); tank.Remember("nextShotAllowedAfter", Time.time + Random.Range(timeBetweenShots.minValue, timeBetweenShots.maxValue)); } } }