private RBCharacterController FindBestTarget() { RBCharacterController closest = null; RBCharacterController stunnedTarget = null; float minDistance = 100; Vector2 selfPos = GetFlatVector(transform.position); foreach (RBCharacterController player in _players) { if (player.gameObject.activeSelf) { Vector2 playerPos = GetFlatVector(player.transform.position); float distance = Vector2.Distance(playerPos, selfPos); if (distance < minDistance && distance < _manager.AI_PlayerDetectRadius) { minDistance = distance; closest = player; } if (player.isStunned && distance < _manager.AI_PlayerDetectRadius * _manager.AI_StunnedPreferationMultiplier) { stunnedTarget = player; } } } if (stunnedTarget != null) { return(stunnedTarget); } return(closest); }
private void Hunt() { RBCharacterController closest = FindBestTarget(); if (closest != null) { Vector2 selfPos = GetFlatVector(transform.position); Vector2 closestPos = GetFlatVector(closest.transform.position); float distance = Vector2.Distance(selfPos, closestPos); if (distance >= _manager.AI_KickDistance) { Vector3 dir3 = FindBestTarget().transform.position - transform.position; Vector2 dir2 = GetFlatVector(dir3, true); dir2.Normalize(); _controller._moveDirection += dir2; _controller._moveDirection.Normalize(); } else { if (Time.time > kickTimer + kickDelay) { _controller.TryKick(); kickTimer = Time.time; huntTime = Time.time + _manager.AI_HuntDelay; _currentState = State.Wandering; } } } }
private bool CheckForStateChange() { if (_controller.isStunned && _currentState != State.Stunned) { CancelMovement(); _currentState = State.Stunned; return(true); } if (transform.position.y < groundHeight - _manager.AI_SinkingTolerance && groundHeight != 100) { _currentState = State.Sinking; return(true); } if (IsMeteorAbove() && meteorStressLevel > _manager.AI_MeteorTolerance && _currentState != State.Dodging) { CancelMovement(); _currentState = State.Dodging; return(true); } RBCharacterController closest = FindBestTarget(); if (closest != null && _currentState != State.Hunting && Time.time > huntTime) { _currentState = State.Hunting; return(true); } return(false); }
// Update is called once per frame void Update() { _currRadius += _speed * _radius * Time.deltaTime; _sphere.transform.localScale = new Vector3(_currRadius, _currRadius, _currRadius) * 2; if (_currRadius <= _radius) { _currHits.Clear(); Collider[] hitColliders = Physics.OverlapSphere(transform.position, _currRadius); foreach (Collider hitCollider in hitColliders) { if (hitCollider.CompareTag("Player")) { _currHits.Add(hitCollider.name); if (!_alreadyHit.Contains(hitCollider.name)) { RBCharacterController controller = hitCollider.GetComponent <RBCharacterController>(); controller.GetStunned(); } } } _alreadyHit = new List <string>(_currHits); } else { Destroy(gameObject); } }
override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash) { animator.SetBool(playSpecialHash, false); if (!minifigController) { minifigController = animator.transform.parent.GetComponent <RBCharacterController>(); } }
private void Start() { _controller = transform.GetComponent <RBCharacterController>(); _manager = GameObject.FindObjectOfType <MiniGameManager>().GetComponent <MiniGameManager>(); _currentState = State.Idle; unstunSegment = _manager.AI_StunDuration / _controller._mashLimit; _players = FindPlayers(); currentWaypoint = Vector2.zero; dodgeDirection = Vector2.zero; }