OldBlueWater/BlueWater/Assets/02.Scripts/OceanUi.cs
NTG eece9d718f Closes #86 #90
+ Ocean씬 카메라 회전각도 변경
(0, 90, 0) -> (0, 0, 0)
x, z축 반전 현상 때문에 변경
+ 카메라 변경에 맞게 Ship, 섬도 회전
+ WASD 상하좌우 조작 방식으로 변경
+ Shift로 부스트 기능 추가
2023-12-19 21:46:06 +09:00

130 lines
4.6 KiB
C#

using System;
using System.Collections;
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
#region ProcessBar Class
[Serializable]
public class ProcessBar
{
[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, Slider reloadSlider)
{
Obj = obj;
Fill = fill;
PreviousGaugeLine = previousGaugeLine;
ReloadSlider = reloadSlider;
reloadingAttackSound = ReloadSlider.GetComponent<AudioSource>();
SetFillAmount(0f);
}
public void SetActive(bool value) => Obj.SetActive(value);
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 ShakeProcessBarCoroutine()
{
if (isShaking) yield break;
isShaking = true;
reloadingAttackSound.Play();
var time = 0f;
var processBarOriginalPos = Obj.transform.localPosition;
while (time < ShakeDuration)
{
if (!Obj.gameObject.activeSelf)
{
Obj.transform.localPosition = processBarOriginalPos;
isShaking = false;
yield break;
}
time += Time.deltaTime;
var shakeAmount = Random.Range(-1f, 1f) * ShakePower;
var processBarLocalPos = Obj.transform.localPosition;
Obj.transform.localPosition = new Vector3(processBarLocalPos.x + shakeAmount, processBarLocalPos.y, processBarLocalPos.z);
yield return null;
}
Obj.transform.localPosition = processBarOriginalPos;
isShaking = false;
}
}
#endregion
public class OceanUi : MonoBehaviour
{
[Title("초기화 방식")]
[SerializeField] private bool autoInit = true;
[field: Title("UI")]
[field: SerializeField] public ProcessBar ProcessBar { get; set; }
[SerializeField] private Vector3 processBarOffset = Vector3.zero;
[field: SerializeField] public Slider ShipBoostSlider { get; set; }
private Canvas canvas;
[Button("셋팅 초기화")]
private void Init()
{
canvas = GetComponent<Canvas>();
if (!canvas)
{
Debug.LogError("canvas is null error");
return;
}
var processBar = canvas.transform.Find("ProcessBar").gameObject;
var fill = processBar.transform.Find("Fill").GetComponent<Image>();
var previousGaugeLine = processBar.transform.Find("PreviousGaugeLine").transform;
var reloadSlider = canvas.transform.Find("ReloadSlider").GetComponent<Slider>();
ProcessBar = new ProcessBar(processBar, fill, previousGaugeLine, reloadSlider);
ProcessBar.SetActiveReloadSlider(false);
ShipBoostSlider = canvas.transform.Find("ShipBoostSlider").GetComponent<Slider>();
ShipBoostSlider.value = 0f;
}
private void Awake()
{
if (autoInit)
{
Init();
}
UiManager.Inst.OceanUi = this;
ProcessBar.SetActive(false);
}
private void Update()
{
if (ProcessBar.Obj.activeSelf)
{
var mousePos = Input.mousePosition;
var result = mousePos + processBarOffset;
ProcessBar.SetPosition(result);
}
}
}
}