using Sirenix.OdinInspector; using UnityEngine; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class Cannon : MonoBehaviour { [Title("초기화 방식")] [SerializeField] private bool autoInit = true; [Title("캐논 변수")] [SerializeField] private GameObject projectileObj; [SerializeField] private Transform firePos; [SerializeField] private float speed = 2000f; [SerializeField] private float height = 50f; [SerializeField] private Vector2 randomCatch = new(1, 4); [Title("캐논 발사 카메라 효과")] [SerializeField] private float cameraShakePower = 0.5f; [SerializeField] private float cameraShakeDuration = 0.5f; private float cannonRadius; private LayerMask boidsLayer; private void Awake() { if (autoInit) { Init(); } } [Button("셋팅 초기화")] private void Init() { projectileObj = Utils.LoadFromFolder("Assets/05.Prefabs/Particles/GrenadeFire", "GrenadeFireOBJ", ".prefab"); firePos = transform.Find("FirePos"); cannonRadius = projectileObj.GetComponent()?.radius ?? projectileObj.GetComponent().colliderRadius; boidsLayer = LayerMask.GetMask("Boids"); } public void Fire(float chargingGauge) { VisualFeedbackManager.Inst.CameraShake(CameraManager.Inst.OceanCamera.BaseShipCam, cameraShakePower, cameraShakeDuration); var projectile = Instantiate(projectileObj, firePos.position, Quaternion.identity); var particleWeapon = projectile.GetComponent(); particleWeapon.onHitAction.AddListener(HandleCannonHit); projectile.GetComponent().AddForce(transform.forward * (chargingGauge * speed)); } private void HandleCannonHit(RaycastHit hit, float power) { if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Water")) { var start = hit.point; var direction = Vector3.down; var radius = cannonRadius; var maxDistance = height; if (Physics.SphereCast(start, radius, direction, out var hitInfo, maxDistance, boidsLayer, QueryTriggerInteraction.Collide)) { Debug.DrawRay(start, direction * height, Color.green, 3f); var hitBoids = hitInfo.collider.GetComponentInParent(); hitBoids.CatchBoid(Random.Range((int)randomCatch.x, (int)randomCatch.y)); } else { Debug.DrawRay(start, direction * height, Color.red, 3f); } } else { hit.transform.GetComponent()?.TakeDamage(power); } } } }