+ 부스터 사용시 집중선(SpeedLines) 기능 추가 + 부스터 사용시 카메라 흔들림 효과 기능 추가 + 부스터 사용시 포스트프로세싱(Vignette) 기능 추가 + 부스터 소진시 내부적인 추가 부스터 시간 추가 + 추가 부스터까지 소진시 부스터 쿨타임 적용 ㄴ 기존의 이동속도보다 2배 느려지는 기능 추가 + ShipPlayer(배) 모델링 변경 ㄴ Hand_Painted_Boats(에셋 이름) + 배 변경에 따른 대포(Cannon) 변경 및 로직 수정 ㄴ 대포의 발사 각도 변경 ㄴ 대포의 스피드 변경 + 배의 움직임 로직 변경 ㄴ 일정한 속도로 회전 ㄴ Rigidbody Freeze Rotation + 중형 물고기 모델링 추가 ㄴ HammerHeadShark(망치머리상어) 추가 ㄴ Stingray(가오리) 추가 + Layer(PostProcessing) 추가 + VisualFeedbackManager에 포스트 프로세싱 기능 관련 추가
121 lines
3.4 KiB
C#
121 lines
3.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using Cinemachine;
|
|
using MoreMountains.Feedbacks;
|
|
using MoreMountains.FeedbacksForThirdParty;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.Universal;
|
|
using UnityEngine.SceneManagement;
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
namespace BlueWaterProject
|
|
{
|
|
public class VisualFeedbackManager : Singleton<VisualFeedbackManager>
|
|
{
|
|
private Vignette vignette;
|
|
|
|
private void OnEnable()
|
|
{
|
|
SceneManager.sceneLoaded += OnSceneLoaded;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
}
|
|
|
|
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
{
|
|
vignette = null;
|
|
|
|
vignette = GetEffect<Vignette>();
|
|
}
|
|
|
|
#region HitStop
|
|
|
|
/// <summary>
|
|
/// 히트스톱
|
|
/// </summary>
|
|
/// <param name="duration">시간</param>
|
|
public void TriggerHitStop(float duration)
|
|
{
|
|
StartCoroutine(HitStopCoroutine(duration));
|
|
}
|
|
|
|
private IEnumerator HitStopCoroutine(float duration)
|
|
{
|
|
var originalTimeScale = 1;
|
|
Time.timeScale = 0.05f;
|
|
yield return new WaitForSecondsRealtime(duration);
|
|
Time.timeScale = originalTimeScale;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CameraShake
|
|
|
|
public void CameraShake(CinemachineVirtualCamera virtualCamera, float power = 0.5f, float duration = 0.1f)
|
|
{
|
|
var mmfPlayer = virtualCamera.transform.gameObject.GetComponent<MMF_Player>();
|
|
var cinemachineImpulse = mmfPlayer.GetFeedbackOfType<MMF_CinemachineImpulse>();
|
|
var impulselistener = virtualCamera.transform.gameObject.GetComponent<CinemachineImpulseListener>();
|
|
|
|
cinemachineImpulse.Velocity = new Vector3(0.5f, 0.5f, 0.5f);
|
|
impulselistener.m_Gain = power;
|
|
|
|
cinemachineImpulse.m_ImpulseDefinition.m_TimeEnvelope.m_SustainTime = duration;
|
|
|
|
cinemachineImpulse.m_ImpulseDefinition.m_TimeEnvelope.m_DecayTime = 0.2f;
|
|
|
|
mmfPlayer.PlayFeedbacks();
|
|
}
|
|
|
|
#region PostProcessing
|
|
|
|
public void ToggleEffect<T>(bool value) where T : VolumeComponent
|
|
{
|
|
var effect = GetEffect<T>();
|
|
if (effect == null)
|
|
{
|
|
print(typeof(T) + "효과가 없습니다.");
|
|
return;
|
|
}
|
|
effect.active = value;
|
|
}
|
|
|
|
private T GetEffect<T>() where T : VolumeComponent
|
|
{
|
|
var postProcessVolume = FindAnyObjectByType<Volume>();
|
|
if (postProcessVolume == null)
|
|
{
|
|
print("Volume 컴포넌트를 가진 오브젝트가 없습니다.");
|
|
return null;
|
|
}
|
|
postProcessVolume.profile.TryGet(out T effect);
|
|
return effect;
|
|
}
|
|
|
|
public void SetVignetteIntensity(float intensity)
|
|
{
|
|
if (vignette == null)
|
|
{
|
|
vignette = GetEffect<Vignette>();
|
|
}
|
|
|
|
if (vignette != null)
|
|
{
|
|
vignette.intensity.value = intensity;
|
|
}
|
|
else
|
|
{
|
|
print("vignette is null.");
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
}
|