public Vector3 MoveLogic(EnemyController enemy, GameObject player) { if (LMHelper.IsInRange(enemy, player)) { enemy.SetAggroState(true); //aggroed if within aggro range float pm = enemy.GetPrevMvt().magnitude; Vector3 mvt; // If hitting a wall and moving slowly, take a detour sideways // (prevents behavior if out in the open or if it happens to graze a wall while moving rapidly) if (enemy.GetWallHit() && pm <= .05) { Vector3 direct = LMHelper.BaseMoveLogic(enemy, player); //first get direct approach mvt = Vector3.Cross(direct, new Vector3(0f, 1f, 0f)); //cross with vertical to get left perpendicular if (Time.time % 4 <= 0.02) { mvt *= -1; //flip direction every 5 seconds } mvt -= direct * (Random.value - 0.5f); //take random angle from straight perpendicular mvt.Normalize(); //re-normalize } else // otherwise chase as normal { mvt = LMHelper.BaseMoveLogic(enemy, player); } return mvt; } enemy.SetAggroState(false); return new Vector3(0f, 0f, 0f); }
public Vector3 MoveLogic(EnemyController enemy, GameObject player) { if (LMHelper.IsInRange(enemy, player)) { enemy.SetAggroState(true); //aggroed if within aggro range return LMHelper.BaseMoveLogic(enemy, player); } enemy.SetAggroState(false); return new Vector3 (0f, 0f, 0f); }
public Vector3 MoveLogic(EnemyController enemy, GameObject player) { float dist = LMHelper.GetDistance(enemy, player); Vector3 mvt = new Vector3(0f, 0f, 0f); enemy.SetStationary(true); // Aggro if in range if (dist <= enemy.GetAggroRadius()) { enemy.SetAggroState(true); } else { enemy.SetAggroState(false); } return mvt; }
public Vector3 MoveLogic(EnemyController enemy, GameObject player) { float dist = LMHelper.GetDistance(enemy, player); Vector3 mvt = new Vector3(0f, 0f, 0f); // If in aggro range, set aggro state to true if (dist <= enemy.GetAggroRadius()) { enemy.SetAggroState(true); //if not already strafing or reached strafe target, setup new one if (Strafing == false || distST < 5) { Strafing = true; //Raycast out in direction of player Vector3 dir = LMHelper.BaseMoveLogic(enemy, player); this.transform.forward = dir; RaycastHit hit; float tdist = 0; if (Physics.Raycast(this.transform.position, dir, out hit)) { tdist = hit.distance; } StrafeTarget = this.transform.position + dir * tdist; mvt = dir; } //else, continue along strafing path towards target else { mvt = (StrafeTarget - this.transform.position).normalized; } } else { enemy.SetAggroState(false); Strafing = false; } //Debug.Log(Strafing + "," + StrafeTarget + "," + mvt); return mvt; }
public Vector3 MoveLogic(EnemyController enemy, GameObject player) { float dist = LMHelper.GetDistance(enemy, player); float optrng = enemy.GetOptimalRange(); float delta = dist - optrng; //difference from optimal range Vector3 mvt = new Vector3(0f, 0f, 0f); // If out of range, move into range if (dist <= enemy.GetAggroRadius()) { enemy.SetAggroState(true); if (delta > 0) { mvt = LMHelper.BaseMoveLogic(enemy, player); mvt *= delta / (1.5f * optrng); } } else { enemy.SetAggroState(false); } return mvt; }