using Sirenix.OdinInspector; using Unity.Mathematics; using UnityEngine; using Random = UnityEngine.Random; // 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; [Range(0f, 0.5f)] [SerializeField] private float fireAngle = 0.2f; [SerializeField] private float speed = 75f; [SerializeField] private float height = 20f; [SerializeField] private Vector2 randomCatch = new(1, 4); [Title("캐논 발사 카메라 효과")] [SerializeField] private float cameraShakePower = 2f; [SerializeField] private float cameraShakeDuration = 0.3f; 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 addAngle = chargingGauge * fireAngle; var firePosRotation = firePos.rotation.eulerAngles; firePosRotation.x -= addAngle; var projectile = Instantiate(projectileObj, firePos.position, Quaternion.Euler(firePosRotation)); var particleWeapon = projectile.GetComponent(); particleWeapon.onHitAction.AddListener(HandleCannonHit); //projectile.GetComponent().AddForce(projectile.transform.forward * (chargingGauge * speed)); projectile.GetComponent().velocity = projectile.transform.forward * 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); } } } }