+ 기본적인 배에서 포쏘는 로직 완료 우클릭 - 발사 모드 온/오프 좌클릭 Hold - 발사 게이지 충전 좌클릭 중단 - 발사 + 대포 발사시 카메라 흔들림 효과 추가 + 대포 재장선시 UI 추가 + 대포 재장전시 공격하면 사운드 및 UI 흔들림 효과 추가 + 카메라 고정으로 변경
This commit is contained in:
parent
22de879e35
commit
b95f9de49e
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,9 @@ namespace BlueWaterProject
|
||||
[SelectionBase]
|
||||
public class ShipPlayer : Player
|
||||
{
|
||||
[Title("초기화 방식")]
|
||||
[SerializeField] private bool autoInit = true;
|
||||
|
||||
[Title("쉽의 기본 설정")]
|
||||
[Tooltip("최대 스피드")] public float maxSpeed = 10f;
|
||||
[Tooltip("가속 수치")] public float acceleration = 2f;
|
||||
@ -35,10 +38,12 @@ namespace BlueWaterProject
|
||||
|
||||
[SerializeField] private LayerMask waterLayer;
|
||||
|
||||
[Button("셋팅 초기화")]
|
||||
private void Init()
|
||||
{
|
||||
rb = GetComponent<Rigidbody>();
|
||||
playerInput = GetComponent<PlayerInput>();
|
||||
cannon = transform.Find("Cannon").GetComponent<Cannon>();
|
||||
|
||||
directionIndicator = transform.Find("DirectionIndicator").gameObject;
|
||||
directionIndicator.SetActive(false);
|
||||
@ -51,7 +56,11 @@ namespace BlueWaterProject
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
Init();
|
||||
|
||||
if (autoInit)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnEnable()
|
||||
@ -187,10 +196,17 @@ namespace BlueWaterProject
|
||||
|
||||
private void ChargeCannon()
|
||||
{
|
||||
if (!isFireMode || isReloading) return;
|
||||
if (!isFireMode) return;
|
||||
|
||||
chargingCannon = true;
|
||||
chargingGauge = 0f;
|
||||
if (isReloading)
|
||||
{
|
||||
StartCoroutine(UiManager.Inst.OceanUi.ProcessBar.ShakeSliderCoroutine());
|
||||
}
|
||||
else
|
||||
{
|
||||
chargingCannon = true;
|
||||
chargingGauge = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
private void FireCannon()
|
||||
@ -223,14 +239,19 @@ namespace BlueWaterProject
|
||||
private IEnumerator CannonCoolDown(float waitTime)
|
||||
{
|
||||
var time = 0f;
|
||||
UiManager.Inst.OceanUi.ProcessBar.SetSliderValue(0f);
|
||||
UiManager.Inst.OceanUi.ProcessBar.SetActiveReloadSlider(true);
|
||||
|
||||
while (time <= waitTime)
|
||||
{
|
||||
time += Time.deltaTime;
|
||||
var sliderValue = time > 0 ? time / waitTime : 0f;
|
||||
UiManager.Inst.OceanUi.ProcessBar.SetSliderValue(sliderValue);
|
||||
yield return null;
|
||||
}
|
||||
|
||||
isReloading = false;
|
||||
UiManager.Inst.OceanUi.ProcessBar.SetActiveReloadSlider(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -8,16 +8,24 @@ namespace BlueWaterProject
|
||||
{
|
||||
public class OceanCamera : MonoBehaviour
|
||||
{
|
||||
[Title("초기화 방식")]
|
||||
[SerializeField] private bool autoInit = true;
|
||||
|
||||
[field: Title("카메라")]
|
||||
[field: SerializeField] public CinemachineVirtualCamera BaseShipCam { get; private set; }
|
||||
|
||||
private List<CinemachineVirtualCamera> cineCamList;
|
||||
|
||||
private GameObject cineCams;
|
||||
|
||||
private const int CINE_CAM_NUM = 1;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (autoInit)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
CameraManager.Inst.OceanCamera = this;
|
||||
CameraManager.Inst.MainCam = Camera.main;
|
||||
}
|
||||
|
@ -1,7 +1,9 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
@ -12,12 +14,21 @@ namespace BlueWaterProject
|
||||
[field: SerializeField] public GameObject Obj { get; set; }
|
||||
[field: SerializeField] public Image Fill { get; set; }
|
||||
[field: SerializeField] public Transform PreviousGaugeLine { get; set; }
|
||||
[field: SerializeField] public Slider ReloadSlider { get; set; }
|
||||
[field: SerializeField] public float ShakeDuration { get; set; } = 0.5f;
|
||||
[field: SerializeField] public float ShakePower { get; set; } = 10f;
|
||||
|
||||
private AudioSource reloadingAttackSound;
|
||||
private bool isShaking;
|
||||
|
||||
public ProcessBar(GameObject obj, Image fill, Transform previousGaugeLine)
|
||||
public ProcessBar(GameObject obj, Image fill, Transform previousGaugeLine, Slider reloadSlider)
|
||||
{
|
||||
Obj = obj;
|
||||
Fill = fill;
|
||||
PreviousGaugeLine = previousGaugeLine;
|
||||
ReloadSlider = reloadSlider;
|
||||
|
||||
reloadingAttackSound = ReloadSlider.GetComponent<AudioSource>();
|
||||
|
||||
SetFillAmount(0f);
|
||||
}
|
||||
@ -26,17 +37,55 @@ namespace BlueWaterProject
|
||||
public void SetPosition(Vector3 value) => Obj.transform.position = value;
|
||||
public void SetFillAmount(float value) => Fill.fillAmount = value;
|
||||
public void SetRotateZ(float value) => PreviousGaugeLine.rotation = Quaternion.Euler(0f, 0f, value);
|
||||
public void SetActiveReloadSlider(bool value) => ReloadSlider.gameObject.SetActive(value);
|
||||
public void SetSliderValue(float value) => ReloadSlider.value = value;
|
||||
public IEnumerator ShakeSliderCoroutine()
|
||||
{
|
||||
if (isShaking) yield break;
|
||||
|
||||
isShaking = true;
|
||||
reloadingAttackSound.Play();
|
||||
var time = 0f;
|
||||
var sliderOriginalPos = ReloadSlider.transform.localPosition;
|
||||
|
||||
while (time < ShakeDuration)
|
||||
{
|
||||
if (!ReloadSlider.gameObject.activeSelf)
|
||||
{
|
||||
ReloadSlider.transform.localPosition = sliderOriginalPos;
|
||||
isShaking = false;
|
||||
yield break;
|
||||
}
|
||||
|
||||
time += Time.deltaTime;
|
||||
var shakeAmount = Random.Range(-1f, 1f) * ShakePower;
|
||||
ReloadSlider.transform.localPosition = new Vector3(sliderOriginalPos.x + shakeAmount, sliderOriginalPos.y, sliderOriginalPos.z);
|
||||
yield return null;
|
||||
}
|
||||
ReloadSlider.transform.localPosition = sliderOriginalPos;
|
||||
isShaking = false;
|
||||
}
|
||||
}
|
||||
|
||||
public class OceanUi : MonoBehaviour
|
||||
{
|
||||
[Title("초기화 방식")]
|
||||
[SerializeField] private bool autoInit = true;
|
||||
|
||||
[field: Title("UI")]
|
||||
[field: SerializeField] public ProcessBar ProcessBar { get; set; }
|
||||
[field: SerializeField] public Image CannonFill { get; set; }
|
||||
|
||||
[SerializeField] private Vector3 processBarOffset = Vector3.zero;
|
||||
|
||||
private Canvas canvas;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (autoInit)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
UiManager.Inst.OceanUi = this;
|
||||
ProcessBar.SetActive(false);
|
||||
}
|
||||
@ -46,7 +95,8 @@ namespace BlueWaterProject
|
||||
if (ProcessBar.Obj.activeSelf)
|
||||
{
|
||||
var mousePos = Input.mousePosition;
|
||||
ProcessBar.SetPosition(mousePos);
|
||||
var result = mousePos + processBarOffset;
|
||||
ProcessBar.SetPosition(result);
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,7 +113,9 @@ namespace BlueWaterProject
|
||||
var processBar = canvas.transform.Find("ProcessBar").gameObject;
|
||||
var fill = processBar.transform.Find("Fill").GetComponent<Image>();
|
||||
var previousGaugeLine = processBar.transform.Find("PreviousGaugeLine").transform;
|
||||
ProcessBar = new ProcessBar(processBar, fill, previousGaugeLine);
|
||||
var reloadSlider = processBar.transform.Find("ReloadSlider").GetComponent<Slider>();
|
||||
ProcessBar = new ProcessBar(processBar, fill, previousGaugeLine, reloadSlider);
|
||||
ProcessBar.SetActiveReloadSlider(false);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
|
||||
@ -6,10 +7,25 @@ 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;
|
||||
|
||||
public float speed = 2000f;
|
||||
[Title("캐논 발사 카메라 효과")]
|
||||
[SerializeField] private float cameraShakePower = 0.5f;
|
||||
[SerializeField] private float cameraShakeDuration = 0.5f;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (autoInit)
|
||||
{
|
||||
Init();
|
||||
}
|
||||
}
|
||||
|
||||
[Button("셋팅 초기화")]
|
||||
private void Init()
|
||||
@ -20,6 +36,7 @@ namespace BlueWaterProject
|
||||
|
||||
public void Fire(float chargingGauge)
|
||||
{
|
||||
VisualFeedbackManager.Inst.CameraShake(CameraManager.Inst.OceanCamera.BaseShipCam, cameraShakePower, cameraShakeDuration);
|
||||
var projectile = Instantiate(projectileObj, firePos.position, Quaternion.identity);
|
||||
projectile.GetComponent<Rigidbody>().AddForce(transform.forward * (chargingGauge * speed));
|
||||
}
|
||||
|
@ -24156,7 +24156,7 @@ AudioSource:
|
||||
OutputAudioMixerGroup: {fileID: 0}
|
||||
m_audioClip: {fileID: 8300000, guid: 79c3cb7a26813d146b07c293b0324039, type: 3}
|
||||
m_PlayOnAwake: 1
|
||||
m_Volume: 1
|
||||
m_Volume: 0.5
|
||||
m_Pitch: 1
|
||||
Loop: 0
|
||||
Mute: 0
|
||||
|
@ -9551,7 +9551,7 @@ AudioSource:
|
||||
OutputAudioMixerGroup: {fileID: 0}
|
||||
m_audioClip: {fileID: 8300000, guid: a76b32836dc7cc44aa9a52f0694ee199, type: 3}
|
||||
m_PlayOnAwake: 1
|
||||
m_Volume: 1
|
||||
m_Volume: 0.5
|
||||
m_Pitch: 1
|
||||
Loop: 0
|
||||
Mute: 0
|
||||
|
Loading…
Reference in New Issue
Block a user