/* * 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; } }
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; } }