protected override void Start() { base.Start(); _playerCam = CameraManager.Instance.PlayerCamera; _aimPoint = _playerCam.AimPoint; }
// 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; } }
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); }