From 3190f10d7da922d283d0eabfebc43b5221d182d6 Mon Sep 17 00:00:00 2001 From: "DESKTOP-VVOCIJO\\PC" Date: Fri, 29 May 2026 12:25:32 +0900 Subject: [PATCH] =?UTF-8?q?2026-05-29=20=EB=A1=9C=EB=94=A9=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/01_Scenes/GameScene.unity | 4 +- Assets/01_Scenes/StartScene.unity | 3 ++ Assets/01_Scenes/StartScene.unity.meta | 7 ++++ Assets/02_Scripts/Core.meta | 8 ++++ Assets/02_Scripts/Core/Util.cs | 23 +++++++++++ Assets/02_Scripts/Core/Util.cs.meta | 2 + Assets/02_Scripts/Enemy/Enemy.cs | 40 +++++++++++-------- Assets/02_Scripts/Enemy/WaveManager.cs | 8 ++-- .../02_Scripts/Managers/SceneLoadManager.cs | 24 +++++++++-- Assets/02_Scripts/UI/GameStart.meta | 8 ++++ .../02_Scripts/UI/GameStart/GameStartMenu.cs | 16 ++++++++ .../UI/GameStart/GameStartMenu.cs.meta | 2 + .../ColorMan/Prefabs/BossMan.prefab | 4 +- Assets/13_Font.meta | 8 ++++ Assets/13_Font/MaruMinya SDF.asset | 3 ++ Assets/13_Font/MaruMinya SDF.asset.meta | 8 ++++ Assets/13_Font/MaruMinya.ttf | 3 ++ Assets/13_Font/MaruMinya.ttf.meta | 21 ++++++++++ .../LiberationSans SDF - Fallback.asset | 4 +- 19 files changed, 167 insertions(+), 29 deletions(-) create mode 100644 Assets/01_Scenes/StartScene.unity create mode 100644 Assets/01_Scenes/StartScene.unity.meta create mode 100644 Assets/02_Scripts/Core.meta create mode 100644 Assets/02_Scripts/Core/Util.cs create mode 100644 Assets/02_Scripts/Core/Util.cs.meta create mode 100644 Assets/02_Scripts/UI/GameStart.meta create mode 100644 Assets/02_Scripts/UI/GameStart/GameStartMenu.cs create mode 100644 Assets/02_Scripts/UI/GameStart/GameStartMenu.cs.meta create mode 100644 Assets/13_Font.meta create mode 100644 Assets/13_Font/MaruMinya SDF.asset create mode 100644 Assets/13_Font/MaruMinya SDF.asset.meta create mode 100644 Assets/13_Font/MaruMinya.ttf create mode 100644 Assets/13_Font/MaruMinya.ttf.meta diff --git a/Assets/01_Scenes/GameScene.unity b/Assets/01_Scenes/GameScene.unity index 4675e22..9a542fd 100644 --- a/Assets/01_Scenes/GameScene.unity +++ b/Assets/01_Scenes/GameScene.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:343da0935a6a2e633e043227f8edb8ae95de9f141d24666494832d6f563e155b -size 145591 +oid sha256:28049e66d99c50ec23d821d7ea3c23f30f4117b3b89083ae62b2e66beee8a8d6 +size 146900 diff --git a/Assets/01_Scenes/StartScene.unity b/Assets/01_Scenes/StartScene.unity new file mode 100644 index 0000000..0af790a --- /dev/null +++ b/Assets/01_Scenes/StartScene.unity @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a20a2bc9ba668d8b4ccc50dc2c5d19acc5e5a0fd987c485a90597cfa90f476be +size 60618 diff --git a/Assets/01_Scenes/StartScene.unity.meta b/Assets/01_Scenes/StartScene.unity.meta new file mode 100644 index 0000000..7c95ae1 --- /dev/null +++ b/Assets/01_Scenes/StartScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 574088315a171654bbc98babcf5060aa +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/Core.meta b/Assets/02_Scripts/Core.meta new file mode 100644 index 0000000..3c2cedf --- /dev/null +++ b/Assets/02_Scripts/Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4179e627078d1c649986e7fa997e344d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/Core/Util.cs b/Assets/02_Scripts/Core/Util.cs new file mode 100644 index 0000000..ea2f312 --- /dev/null +++ b/Assets/02_Scripts/Core/Util.cs @@ -0,0 +1,23 @@ +using System; +using System.Threading; +using UnityEngine; + +public static class Util +{ +/// 특정 시간(초) 후에 액션을 실행 + public static async Awaitable RunDelayed(float delay, Action action, CancellationToken token = default) + { + try + { + // 유니티 전용 비동기 대기 + await Awaitable.WaitForSecondsAsync(delay, token); + + // 함수 실행 + action?.Invoke(); + } + catch (OperationCanceledException) + { + // 취소되었을 때의 처리 (필요 시) + } + } +} diff --git a/Assets/02_Scripts/Core/Util.cs.meta b/Assets/02_Scripts/Core/Util.cs.meta new file mode 100644 index 0000000..d5932dc --- /dev/null +++ b/Assets/02_Scripts/Core/Util.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ff3976febb8799345a121b8ca2a28e3d \ No newline at end of file diff --git a/Assets/02_Scripts/Enemy/Enemy.cs b/Assets/02_Scripts/Enemy/Enemy.cs index f4d1dd8..69b24bf 100644 --- a/Assets/02_Scripts/Enemy/Enemy.cs +++ b/Assets/02_Scripts/Enemy/Enemy.cs @@ -28,6 +28,7 @@ public class Enemy : MonoBehaviour, IDamageable [SerializeField] private Color _hitFlashColor = Color.red; // 깜빡 색상 [SerializeField] private float _hitStunDuration = 0.25f; // ActionData 값이 없을 때 쓰는 기본 경직 시간 [SerializeField] private string _hitAnimationState = "HitDamage"; // 공격 데이터에 피격 애니가 없을 때 재생할 기본 State + [SerializeField] private bool _hasSuperArmor = false; // true면 경직/넉백 무시 (데미지·플래시는 받음). 보스 등 패턴 유지용 // ─── 넉백 / 벽 반사 파라미터 ───────────────────────────────────────── [Header("Hit Bounce")] @@ -92,7 +93,7 @@ public class Enemy : MonoBehaviour, IDamageable public bool IsGrabbable => _isGrabbable; public bool IsInvulnerable => _isInvulnerable; public bool IsInHitReaction => _hitStunTimer > 0f || _hitReactionTimer > 0f || _isHitPositionCorrecting || _flashTimer > 0f; - public bool CanUseAI => !IsDead && !_isGrabbed && !IsInHitReaction; + public bool CanUseAI => !IsDead && !_isGrabbed && (_hasSuperArmor || !IsInHitReaction); public event Action OnDamaged; @@ -287,29 +288,34 @@ public void TakeDamage(int amount, Vector2 hitVelocity = default, string hitReac // 무적이면 데미지/플래시/넉백 전부 무시. if (_isInvulnerable) return; - float appliedHitStunDuration = hitStunDuration >= 0f ? hitStunDuration : _hitStunDuration; - _hitStunTimer = Mathf.Max(_hitStunTimer, appliedHitStunDuration); OnDamaged?.Invoke(); _isGrabbed = false; - StartHitFlash(); - PlayHitAnimation(hitReactionAnimationState); + StartHitFlash(); // 피격 플래시는 슈퍼아머여도 유지 (타격감 피드백) - // 새 피격이 반응 속도를 전부 결정하므로, 이전 튕김/넉백 속도는 먼저 제거한다. - if (_rb != null) + // 슈퍼아머: 경직 타이머·피격 모션·넉백·위치 보정을 전부 생략 → 패턴이 안 끊긴다. + if (!_hasSuperArmor) { - _hitReactionTimer = 0f; - _rb.linearVelocity = Vector2.zero; - _lastVelocity = Vector2.zero; + float appliedHitStunDuration = hitStunDuration >= 0f ? hitStunDuration : _hitStunDuration; + _hitStunTimer = Mathf.Max(_hitStunTimer, appliedHitStunDuration); + PlayHitAnimation(hitReactionAnimationState); - BeginHitTargetPositionCorrection(hitTargetPosition, correctHitTargetY, hitPositionSolidMask, hitPositionCorrectionDuration); - - Vector2 nextVelocity = GetHitReactionVelocity(hitVelocity); - if (nextVelocity != Vector2.zero) + // 새 피격이 반응 속도를 전부 결정하므로, 이전 튕김/넉백 속도는 먼저 제거한다. + if (_rb != null) { - _rb.linearVelocity = nextVelocity; - _lastVelocity = nextVelocity; - _hitReactionTimer = _hitReactionDuration; + _hitReactionTimer = 0f; + _rb.linearVelocity = Vector2.zero; + _lastVelocity = Vector2.zero; + + BeginHitTargetPositionCorrection(hitTargetPosition, correctHitTargetY, hitPositionSolidMask, hitPositionCorrectionDuration); + + Vector2 nextVelocity = GetHitReactionVelocity(hitVelocity); + if (nextVelocity != Vector2.zero) + { + _rb.linearVelocity = nextVelocity; + _lastVelocity = nextVelocity; + _hitReactionTimer = _hitReactionDuration; + } } } diff --git a/Assets/02_Scripts/Enemy/WaveManager.cs b/Assets/02_Scripts/Enemy/WaveManager.cs index f136892..9d994ee 100644 --- a/Assets/02_Scripts/Enemy/WaveManager.cs +++ b/Assets/02_Scripts/Enemy/WaveManager.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Data; using System.Threading; using TMPro; -using UnityEditor.Playables; using UnityEngine; using UnityEngine.UI; @@ -74,7 +72,11 @@ public class WaveManager : MonoBehaviour private void Start() { OnAllWavesCleared += StageClearEvent; - if (_startOnAwake) StartWaves(); + + if (_startOnAwake) + { + _ = Util.RunDelayed(1f,StartWaves,destroyCancellationToken); + } } private void OnDestroy() diff --git a/Assets/02_Scripts/Managers/SceneLoadManager.cs b/Assets/02_Scripts/Managers/SceneLoadManager.cs index 901c985..e8b86f0 100644 --- a/Assets/02_Scripts/Managers/SceneLoadManager.cs +++ b/Assets/02_Scripts/Managers/SceneLoadManager.cs @@ -1,10 +1,19 @@ using System; +using TMPro; using UnityEngine; using UnityEngine.SceneManagement; +using UnityEngine.UI; public class SceneLoadManager : MonoBehaviour { public static SceneLoadManager Instance; + public GameObject LoadingScreen; + public Image LoadingBack; + public Image LoadingBar; + public TMP_Text LoadingText; + public TMP_Text LoadingDesc; + + private void Awake() { if (Instance == null) @@ -47,11 +56,17 @@ private void OnSceneLoaded(Scene scene, LoadSceneMode mode) public void SetSceneLoadingProgressValue(float value) { - + LoadingBar.fillAmount = value; + LoadingText.text = $"{(value * 100):F0}% 로딩중"; } - public void SetSceneLoadingProgressValue(float value,string loadingText) - { + public void ShowLoadingScreen() + { + LoadingScreen.SetActive(true); + } + public void HideLoadingScreen() + { + LoadingScreen.SetActive(false); } public void RequestSceneChange(string sceneName) @@ -66,6 +81,8 @@ private async Awaitable SceneChange(string sceneName) //로딩바 수치 0으로 설정 SetSceneLoadingProgressValue(0f); + ShowLoadingScreen(); + AsyncOperation op = SceneManager.LoadSceneAsync(sceneName); //자동 전환을 하고 싶지 않을 경우 해당값을 false로 두었다가 true로 바꾸면 그 때 전환됨 @@ -106,6 +123,7 @@ private async Awaitable SceneChange(string sceneName) await Awaitable.NextFrameAsync(this.destroyCancellationToken); } + HideLoadingScreen(); } catch (OperationCanceledException) { diff --git a/Assets/02_Scripts/UI/GameStart.meta b/Assets/02_Scripts/UI/GameStart.meta new file mode 100644 index 0000000..8d794b4 --- /dev/null +++ b/Assets/02_Scripts/UI/GameStart.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76518ea418ac2c042bd3f2fbacb6ef73 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs b/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs new file mode 100644 index 0000000..9b333e5 --- /dev/null +++ b/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs @@ -0,0 +1,16 @@ +using UnityEngine; + +public class GameStartMenu : MonoBehaviour +{ + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs.meta b/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs.meta new file mode 100644 index 0000000..fc997d5 --- /dev/null +++ b/Assets/02_Scripts/UI/GameStart/GameStartMenu.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 262ea0233379d764f8febbbbbf4a3572 \ No newline at end of file diff --git a/Assets/03_Character/ColorMan/Prefabs/BossMan.prefab b/Assets/03_Character/ColorMan/Prefabs/BossMan.prefab index d63f0bb..4a907fa 100644 --- a/Assets/03_Character/ColorMan/Prefabs/BossMan.prefab +++ b/Assets/03_Character/ColorMan/Prefabs/BossMan.prefab @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7a5e25b7d9c41474c9e3ed2f5dc9b79987a055ecb100f1728d65c3666504e9d8 -size 14830 +oid sha256:6dd9abbe53427c8ac176a09f4a39cba0fcf30917558c8d171c87ff0e080803de +size 15017 diff --git a/Assets/13_Font.meta b/Assets/13_Font.meta new file mode 100644 index 0000000..09ba417 --- /dev/null +++ b/Assets/13_Font.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ce61450de6a40b4f8b2bd1f7ed2e992 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13_Font/MaruMinya SDF.asset b/Assets/13_Font/MaruMinya SDF.asset new file mode 100644 index 0000000..2a6f1f9 --- /dev/null +++ b/Assets/13_Font/MaruMinya SDF.asset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ad460d91783ab3512d5407959cf245d5465b44350c6d845f8b52be74fbe90d8 +size 139815431 diff --git a/Assets/13_Font/MaruMinya SDF.asset.meta b/Assets/13_Font/MaruMinya SDF.asset.meta new file mode 100644 index 0000000..4ec46bd --- /dev/null +++ b/Assets/13_Font/MaruMinya SDF.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 410a6a4ee139d2248a64c0d89ed4bbfb +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/13_Font/MaruMinya.ttf b/Assets/13_Font/MaruMinya.ttf new file mode 100644 index 0000000..bfe66f8 --- /dev/null +++ b/Assets/13_Font/MaruMinya.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60b56992ac5a42781a09d463dfe95e13a42f1b2879bbdb404c124498905ec8ae +size 5563612 diff --git a/Assets/13_Font/MaruMinya.ttf.meta b/Assets/13_Font/MaruMinya.ttf.meta new file mode 100644 index 0000000..99336c5 --- /dev/null +++ b/Assets/13_Font/MaruMinya.ttf.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 73782f8bf1f391a4ea4d89f22c818efe +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - x12y12pxMaruMinyaHangul + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset index f491274..60d7447 100644 --- a/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset +++ b/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca0715a2b71198cb4d9887fa413507f2ec96dee494035eb8e917f557686ceba7 -size 17072 +oid sha256:ae51c05513b9403b5534f7d06d6e4ac8e2b4fc7531647bace8ea7e8d332b0810 +size 553740