Пример #1
0
        protected override void Start()
        {
            base.Start();

            _playerCam = CameraManager.Instance.PlayerCamera;
            _aimPoint  = _playerCam.AimPoint;
        }
Пример #2
0
        // Other Behaviors
        public void Roar(int intensity)
        {
            _animator.SetTrigger(RoarId);

            PlayerCamera playerCamera = CameraManager.Instance.PlayerCamera;

            switch (intensity)
            {
            case 1:
                playerCamera.ShakeCameraRoarMinor();
                return;

            case 2:
                playerCamera.ShakeCameraRoarMedium();
                return;

            case 3:
                playerCamera.ShakeCameraRoarMajor();
                return;

            default:
                return;
            }
        }
Пример #3
0
        private void Explode()
        {
            _exploding = true;

            // VFX
            if (_grenadeCard.explosionVFX != null)
            {
                GameObject explosion = Instantiate(_grenadeCard.explosionVFX);
                explosion.transform.position = transform.position;
            }

            // Camera Shake
            PlayerCharacter player       = GameManager.Instance.Player;
            PlayerCamera    playerCamera = CameraManager.Instance.PlayerCamera;

            if (playerCamera != null && player != null)
            {
                if (Vector3.Distance(transform.position, player.transform.position) < _grenadeCard.explosionRadius)
                {
                    playerCamera.ShakeCameraExplosionMajor();
                }

                else
                {
                    playerCamera.ShakeCameraExplosionMedium();
                }
            }

            // Search and Damage characters or grenades
            HashSet <ITakeHit> hitSet = new HashSet <ITakeHit>();
            Dictionary <ITakeHit, List <Transform> > transformListDic = new Dictionary <ITakeHit, List <Transform> >();
            Dictionary <ITakeHit, List <Vector3> >   normalListDic    = new Dictionary <ITakeHit, List <Vector3> >();

            RaycastHit[] raycastHits = Physics.SphereCastAll(new Ray(transform.position, transform.up), _grenadeCard.explosionRadius, 0.1f, RaycastLayers.ExplosionLayer);

            foreach (RaycastHit hit in raycastHits)
            {
                // Exclude itself
                if (hit.transform == transform)
                {
                    continue;
                }

                // Check if there's a wall (or any environmetal object blocking the blast)
                if (Physics.Raycast(new Ray(transform.position, hit.transform.position), hit.distance * 1.01f, RaycastLayers.EnvironmentLayer))
                {
                    continue;
                }

                Rigidbody hitRB     = hit.rigidbody;
                ITakeHit  hitTarget = hit.transform.root.GetComponent <ITakeHit>();

                if (hitRB != null)
                {
                    Vector3 relVec         = (hit.transform.position - transform.position);
                    float   forceMagnitude = Mathf.Clamp(_grenadeCard.explosionRadius / Vector3.Magnitude(relVec), 0.01f, 5f) * _grenadeCard.explosionForce;

                    hitRB.AddForceAtPosition(relVec.normalized * forceMagnitude, hit.point, ForceMode.Impulse);
                }

                if (hitTarget != null)
                {
                    if (hitSet.Contains(hitTarget))
                    {
                        transformListDic[hitTarget].Add(hit.transform);
                        normalListDic[hitTarget].Add(hit.normal);
                    }

                    else
                    {
                        hitSet.Add(hitTarget);
                        transformListDic[hitTarget] = new List <Transform> {
                            hit.transform
                        };
                        normalListDic[hitTarget] = new List <Vector3> {
                            hit.normal
                        };
                    }
                }
            }

            foreach (ITakeHit hitTarget in hitSet)
            {
                Transform[] transformArray = transformListDic[hitTarget].ToArray();
                Vector3[]   normalArray    = normalListDic[hitTarget].ToArray();

                if (transformArray.Length != normalArray.Length)
                {
                    continue;
                }

                else
                {
                    hitTarget.OnHit(transformArray, normalArray, _grenadeCard.damage, _grenadeCard.concussion, true);
                }
            }

            Destroy(gameObject);
        }