예제 #1
0
    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);
    }
예제 #2
0
    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;
                }
            }
        }
    }
예제 #3
0
    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);
    }
예제 #4
0
파일: Shockwave.cs 프로젝트: nizap/IGD2021
    // 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);
        }
    }
예제 #5
0
 override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
 {
     animator.SetBool(playSpecialHash, false);
     if (!minifigController)
     {
         minifigController = animator.transform.parent.GetComponent <RBCharacterController>();
     }
 }
예제 #6
0
 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;
 }