public override void Act(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; darkling.isAttacking = false; darkling.isChasing = false; }
void ChargeAtTarget(DarklingAirEnemy darkling, Vector3 target) { //charge into destination darkling.MoveToward(target, darkling.movementSpeed * 3); //if encounter player, hit it if (darkling.target && darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeAttack)) { //get Hittable component Hittable h; if ( (h = darkling.target.GetComponent <Hittable>()) && darkling.isAllowedToAttack) { //attack target Debug.Log("Darkling: hit"); darkling.StartMeleeAttackAnimation(); h.Hit(darkling.attackDamage, darkling.attackType); darkling.isAllowedToAttack = false; } } //when reach destination, ready for next attack if (darkling.isCloseEnoughToTarget(darkling.destination, 5)) { darkling.hasDoneAttacking = true; darkling.isAttacking = false; } }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; bool targetDetected = Scan(darkling); return(targetDetected); }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; bool hasFoundDestination = !darkling.destinationPending; return(hasFoundDestination); }
private void Attack(DarklingAirEnemy darkling) { //set destination to charge right in if (!darkling.isAttacking) { darkling.isAttacking = true; darkling.isAllowedToAttack = true; darkling.hasDoneAttacking = false; //set destination for darkling to charge right in //careful with null ref if (darkling.target != null) { darkling.transform.LookAt(darkling.target); //make the destination further back, so it feels like darkling cannot stop == darkling.destination = darkling.target.position + darkling.transform.forward.normalized * darkling.distanceRunAfterAttack; } else { darkling.destination = darkling.transform.position; } } ChargeAtTarget(darkling, darkling.destination); }
public override void Act(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; darkling.isChasing = false; darkling.isAllowedToTeleport = false; }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; bool isTargetInZone = detectTarget(darkling); return(isTargetInZone); }
/* * Handle moving and teleport */ private void Wander(DarklingAirEnemy darkling) { //teleport if (darkling.isAllowedToTeleport) { //reset time for next teleport darkling.flyTimeElapsed = 0; darkling.isAllowedToTeleport = false; //teleport darkling.StartTeleAnimationStart(); darkling.isTeleporting = true; darkling.teleTimeElapsed = 0; return; } //because animation is slow compared with CPU if (darkling.isTeleporting && darkling.CheckIfTeleCountDownElapsed(darkling.timeBeforeAppear)) { //darkling.darklingModel.SetActive(false); //darkling.darklingModel.SetActive(true); darkling.transform.position = darkling.destination; darkling.StartTeleAnimationStop(); darkling.isTeleporting = false; GameObject g = Instantiate(darkling.teleParticles, darkling.transform.position, Quaternion.identity); Destroy(g, 3); } //if darkling is in disappear mode, don't make it move if (darkling.isTeleporting) { return; } //if too low, increase height //if (darkling.GetFlyHeightFromGround() < darkling.flyHeight) //{ // darkling.transform.position = darkling.transform.position + Vector3.up * darkling.movementSpeed * Time.deltaTime; // darkling.destination = //} //else move toward destination darkling.MoveToward(darkling.destination, darkling.movementSpeed); //count down time for next teleport //ex: fly 4 seconds, then Teleport if (darkling.CheckIfFlyCountDownElapsed(darkling.timeBetweenTele)) { darkling.isAllowedToTeleport = true; } }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; if (darkling.isCloseEnoughToTarget(darkling.startTransform.position, 1)) { return(true); } return(false); }
private void GoBack(DarklingAirEnemy darkling) { darkling.MoveToward(darkling.startTransform.position, darkling.movementSpeed); //if close enough, snap darkling to target if (darkling.isCloseEnoughToTarget(darkling.startTransform.position, 3)) { darkling.transform.position = darkling.startTransform.position; darkling.transform.rotation = darkling.startTransform.rotation; } }
private bool detectTarget(DarklingAirEnemy darkling) { if (darkling.target == null) { return(false); } bool isTargetInZone = darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeZone); return(isTargetInZone); }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; bool attackAgain = false; if (darkling.target != null && darkling.hasDoneAttacking) { attackAgain = true; } return(attackAgain); }
private bool Scan(DarklingAirEnemy darkling) { if (darkling.target == null) { return(false); } //see if target is alive StatsController stats; if (stats = darkling.target.GetComponent <StatsController>()) { if (stats.GetHealth() <= 0) { return(false); } } return(true); }
private void ScanDestination(DarklingAirEnemy darkling) { //set darkling state to scanning destination if (!darkling.destinationPending) { darkling.destinationPending = true; } //pick a new destination for darkling if (!darkling.nextDestinationDirectionPick) { Quaternion randomDirection = Quaternion.Euler(0, Random.Range(0, 360), 0); darkling.transform.rotation = randomDirection; darkling.nextDestinationDirectionPick = true; } //see if that destination is safe RaycastHit hit; //use later //if there is sth in the way, rotate a bit Debug.DrawRay(darkling.eyes.position, darkling.eyes.forward.normalized * darkling.distanceFlyMin, Color.green); if (Physics.Raycast(darkling.eyes.position, darkling.eyes.forward, darkling.distanceFlyMin)) { darkling.transform.Rotate(0, darkling.turningSpeed * Time.deltaTime, 0); } //if found a destination else { Vector3 nextDestination = darkling.transform.position + darkling.transform.forward * darkling.distanceFlyMin; darkling.destination = nextDestination; darkling.destinationPending = false; darkling.nextDestinationDirectionPick = false; } }
public override void Act(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; ScanDestination(darkling); }
void Chase(DarklingAirEnemy darkling) { //if this is first time enter attack-mode if (!darkling.isChasing) { darkling.isChasing = true; darkling.flyTimeElapsed = 0; //reset time to target darkling.teleTimeElapsed = 0; darkling.isAllowedToTeleport = false; darkling.isTeleporting = false; } //careful with null refence if (darkling.target == null) { return; } //because animation is slow compared with CPU if (darkling.isTeleporting && darkling.CheckIfTeleCountDownElapsed(darkling.timeBeforeAppear)) { darkling.transform.position = darkling.destination; darkling.StartTeleAnimationStop(); darkling.isTeleporting = false; darkling.isAllowedToTeleport = false; GameObject g = Instantiate(darkling.teleParticles, darkling.transform.position, Quaternion.identity); Destroy(g, 3); } //if darkling is in teleport mode, don't move or count time if (darkling.isTeleporting) { return; } //if darkling has fly long enough, allow it to teleport if (darkling.CheckIfFlyCountDownElapsed(darkling.timeBetweenTele)) { darkling.isAllowedToTeleport = true; } //if not close enough, narrow down distance if (!darkling.isCloseEnoughToTarget(darkling.target.position, darkling.distanceMeleeAttack)) { //move toward target darkling.MoveToward(darkling.target.position, darkling.movementSpeed * 2); //make it fly faster //give target some seconds to run before teleport if (darkling.isAllowedToTeleport) { //basically fly to front of target darkling.transform.LookAt(darkling.target); Vector3 newPos = darkling.target.position + (-1) * darkling.transform.forward.normalized * darkling.distanceMeleeAttack * 2; //use this way so that target have sometime is run //before darkling pop up darkling.StartTeleAnimationStart(); darkling.destination = newPos; darkling.isTeleporting = true; darkling.teleTimeElapsed = 0; //reset fly countdown darkling.flyTimeElapsed = 0; } return; } }
public override bool Decide(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; return(darkling.isNearDestination(darkling.destination)); }
public override void Act(EnemyStateController controller) { DarklingAirEnemy darkling = (DarklingAirEnemy)controller.enemy; Attack(darkling); }