+ 부스터 사용시 집중선(SpeedLines) 기능 추가 + 부스터 사용시 카메라 흔들림 효과 기능 추가 + 부스터 사용시 포스트프로세싱(Vignette) 기능 추가 + 부스터 소진시 내부적인 추가 부스터 시간 추가 + 추가 부스터까지 소진시 부스터 쿨타임 적용 ㄴ 기존의 이동속도보다 2배 느려지는 기능 추가 + ShipPlayer(배) 모델링 변경 ㄴ Hand_Painted_Boats(에셋 이름) + 배 변경에 따른 대포(Cannon) 변경 및 로직 수정 ㄴ 대포의 발사 각도 변경 ㄴ 대포의 스피드 변경 + 배의 움직임 로직 변경 ㄴ 일정한 속도로 회전 ㄴ Rigidbody Freeze Rotation + 중형 물고기 모델링 추가 ㄴ HammerHeadShark(망치머리상어) 추가 ㄴ Stingray(가오리) 추가 + Layer(PostProcessing) 추가 + VisualFeedbackManager에 포스트 프로세싱 기능 관련 추가
137 lines
4.8 KiB
C#
137 lines
4.8 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; }
|
|
|
|
[field: SerializeField] public GameObject SpeedLines { 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;
|
|
|
|
SpeedLines = canvas.transform.Find("SpeedLines").gameObject;
|
|
SpeedLines.SetActive(false);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
public void SetActiveSpeedLine(bool value) => SpeedLines.SetActive(value);
|
|
}
|
|
} |