Merge pull request #22 from Degulleo/DEG-21-던전-로직-구현

Deg 21 던전 로직 구현
This commit is contained in:
Sehyeon 2025-04-24 17:50:44 +09:00 committed by GitHub
commit ec9754fd38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 705 additions and 2911 deletions

View File

@ -47,6 +47,11 @@ public class WeaponController : MonoBehaviour, IObservable<GameObject>
} }
_playerController = GetComponent<PlayerController>(); _playerController = GetComponent<PlayerController>();
if (_playerController == null)
{
_playerController = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>();
}
_previousPositions = new Vector3[_triggerZones.Length]; _previousPositions = new Vector3[_triggerZones.Length];
_hitColliders = new HashSet<Collider>(); _hitColliders = new HashSet<Collider>();
} }
@ -96,6 +101,17 @@ public class WeaponController : MonoBehaviour, IObservable<GameObject>
if (!_hitColliders.Contains(hit.collider)) if (!_hitColliders.Contains(hit.collider))
{ {
_hitColliders.Add(hit.collider); _hitColliders.Add(hit.collider);
Debug.Log("hit.collider.name: " + hit.collider.name);
if (hit.collider.gameObject.CompareTag("Enemy"))
{
var enemyController = hit.transform.GetComponent<EnemyController>();
if (enemyController != null)
{
enemyController.TakeDamage(AttackPower * _playerController.attackPower);
}
}
Notify(hit.collider.gameObject); Notify(hit.collider.gameObject);
} }
} }

105
Assets/KSH/DungeonLogic.cs Normal file
View File

@ -0,0 +1,105 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DungeonLogic : MonoBehaviour
{
[NonSerialized] public bool isCompleted = false; // 던전 클리어 여부
[NonSerialized] public bool isFailed = false; // 던전 실패 여부
private PlayerController _player;
private EnemyController _enemy;
// 던전 결과 이벤트
public event Action OnDungeonSuccess;
public event Action OnDungeonFailure;
private void Start()
{
// tag를 통해 할당 / 추후 플레이어와 에너미 태그 추가 필요
_player = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerController>();
_enemy = GameObject.FindGameObjectWithTag("Enemy").GetComponent<EnemyController>();
// 죽음 이벤트 구독
if (_player != null)
{
_player.OnDeath += OnPlayerDeath;
}
if (_enemy != null)
{
_enemy.OnDeath += OnEnemyDeath;
}
}
// 플레이어 사망 처리
private void OnPlayerDeath(CharacterBase player)
{
Debug.Log("player name:" + player.characterName);
if (!isFailed) // 중복 실행 방지
{
FailDungeon();
}
}
// 적 사망 처리
private void OnEnemyDeath(CharacterBase enemy)
{
Debug.Log("enemy name:" + enemy.characterName);
if (!isCompleted) // 중복 실행 방지
{
CompleteDungeon();
}
}
// 던전 성공 처리
public void CompleteDungeon()
{
if (!isCompleted && !isFailed)
{
Debug.Log("던전 공략 성공~!");
isCompleted = true;
OnDungeonSuccess?.Invoke();
// 성공 UI 표시 ?? 강화 표기
// TODO: 강화 시스템으로 넘어가고 일상 맵으로 이동
}
}
// 던전 실패 처리
public void FailDungeon()
{
if (!isCompleted && !isFailed)
{
Debug.Log("던전 공략 실패~!");
isFailed = true;
OnDungeonFailure?.Invoke();
// 죽음 애니메이션 + 실패 UI 표시 ?
// GameManager.Instance.ChangeToHomeScene();
StartCoroutine(DelayedSceneChange()); // 테스트를 위해 3초 대기 후 전환
}
}
private IEnumerator DelayedSceneChange()
{
yield return new WaitForSeconds(3f);
GameManager.Instance.ChangeToHomeScene();
}
// 게임 오브젝트 제거 시 이벤트 구독 해제
private void OnDestroy()
{
if (_player != null)
{
_player.OnDeath -= OnPlayerDeath;
}
if (_enemy != null)
{
_enemy.OnDeath -= OnEnemyDeath;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ecf4896d6eb9a514e8f83175d8a33a22
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/KSH/DungeonTestScene.unity (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 4563b107911b0e54cbdf659694a6f17a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 57342d13612d4a240981df8a13a16c12
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 10550dbcfa71e3e4cb0e91a0bb7a19f0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 112000000
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/Scenes/Housing/Lightmap-0_comp_dir.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,127 @@
fileFormatVersion: 2
guid: e30dc677714519945b30e7215332fd38
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 1
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 3
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 12
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,127 @@
fileFormatVersion: 2
guid: 2ff23c25ba734b9468d6f3bb8a24be15
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 1
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 3
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 6
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/Scenes/Housing/Lightmap-0_comp_shadowmask.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,127 @@
fileFormatVersion: 2
guid: 66363697428821b4eaa87bdcb2da8ff1
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 1
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 3
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 11
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@ -0,0 +1,127 @@
fileFormatVersion: 2
guid: 643882fa4c2925347bd364c2285322af
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 1
seamlessCubemap: 1
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 2
aniso: 0
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 2
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 100
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -16,6 +16,8 @@ public abstract class CharacterBase : MonoBehaviour
[Header("상태 이상")] [Header("상태 이상")]
public List<StatusEffect> statusEffects = new List<StatusEffect>(); public List<StatusEffect> statusEffects = new List<StatusEffect>();
public event System.Action<CharacterBase> OnDeath; // 사망 이벤트
protected virtual void Start() protected virtual void Start()
{ {
@ -38,6 +40,7 @@ public abstract class CharacterBase : MonoBehaviour
{ {
Debug.Log($"{characterName}이 사망했습니다."); Debug.Log($"{characterName}이 사망했습니다.");
// TODO: 사망 처리 // TODO: 사망 처리
OnDeath?.Invoke(this);
} }
// 상태이상 추가 메서드 // 상태이상 추가 메서드

View File

@ -86,6 +86,12 @@ public abstract class AoeControllerBase : MonoBehaviour
{ {
Debug.Log($"{hit.name}에게 {_data.damage} 데미지 적용"); Debug.Log($"{hit.name}에게 {_data.damage} 데미지 적용");
// TODO: 실제 데미지 처리 로직 호출 // TODO: 실제 데미지 처리 로직 호출
// 임시 데이미 처리 로직
PlayerController playerController = hit.transform.GetComponent<PlayerController>();
if (playerController != null)
{
playerController.TakeDamage(_data.damage);
}
} }
} }
} }

View File

@ -20,6 +20,12 @@ public class HorizontalAoeController : AoeControllerBase
Debug.Log($"{hit.name}이(가) 횡적 슬래시 데미지 범위에 있습니다."); Debug.Log($"{hit.name}이(가) 횡적 슬래시 데미지 범위에 있습니다.");
Debug.Log($"{hit.name}에게 {_data.damage} 데미지 적용"); Debug.Log($"{hit.name}에게 {_data.damage} 데미지 적용");
// TODO: 실제 데미지 처리 로직 호출 // TODO: 실제 데미지 처리 로직 호출
// 임시 데이미 처리 로직
PlayerController playerController = hit.transform.GetComponent<PlayerController>();
if (playerController != null)
{
playerController.TakeDamage(_data.damage);
}
} }
} }
} }

View File

@ -36,6 +36,12 @@ public class VerticalAoeController : AoeControllerBase
if (!hit.CompareTag("Player")) continue; if (!hit.CompareTag("Player")) continue;
Debug.Log($"{hit.name} 사각형 범위에 있어 데미지 적용"); Debug.Log($"{hit.name} 사각형 범위에 있어 데미지 적용");
// TODO: 데미지 로직 // TODO: 데미지 로직
// 임시 데이미 처리 로직
PlayerController playerController = hit.transform.GetComponent<PlayerController>();
if (playerController != null)
{
playerController.TakeDamage(_data.damage);
}
} }
} }

View File

@ -88,7 +88,7 @@ public abstract class EnemyController : CharacterBase
{ {
base.Die(); base.Die();
// TODO : 사망 후 동작 // TODO : 사망 후 동작
SetState(EnemyState.Dead);
} }
#region #region

View File

@ -62,7 +62,7 @@ public partial class GameManager : Singleton<GameManager>
SceneManager.LoadScene("Game"); // 던전 Scene SceneManager.LoadScene("Game"); // 던전 Scene
} }
public void ChangeToMainScene() public void ChangeToHomeScene()
{ {
SceneManager.LoadScene("Housing"); // Home Scene SceneManager.LoadScene("Housing"); // Home Scene
} }

View File

@ -8,4 +8,7 @@ EditorBuildSettings:
- enabled: 1 - enabled: 1
path: Assets/Scenes/Main.unity path: Assets/Scenes/Main.unity
guid: 99c9720ab356a0642a771bea13969a05 guid: 99c9720ab356a0642a771bea13969a05
- enabled: 1
path: Assets/Scenes/Housing.unity
guid: 02daaec42d605494180038d387d4a776
m_configObjects: {} m_configObjects: {}

View File

@ -5,6 +5,7 @@ TagManager:
serializedVersion: 2 serializedVersion: 2
tags: tags:
- FxTemporaire - FxTemporaire
- Enemy
layers: layers:
- Default - Default
- TransparentFX - TransparentFX
@ -16,7 +17,7 @@ TagManager:
- -
- -
- -
- - Enemy
- -
- -
- -