Compare commits

..
12 Commits
44 changed files with 1417 additions and 11283 deletions
+11
View File
@@ -15,7 +15,18 @@ async def lifespan(app: FastAPI):
yield
print("서버 종료")
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI(title="로그라이크 AI 백엔드", version="1.0", lifespan=lifespan)
# 같은 네트워크 상의 모든 외부 기기(PC, 폰 등) 브라우저 접속 허용
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 라우터 등록
app.include_router(game_router)
+3 -3
View File
@@ -15,12 +15,12 @@ from backend.services import game_service
router = APIRouter(prefix="/api/game", tags=["Game"])
@router.post("/death", response_model=AncestorDeathResponse)
def record_death(req: AncestorDeathCreate, db: Session = Depends(get_db)):
def record_death(req: AncestorDeathCreate, background_tasks: BackgroundTasks, db: Session = Depends(get_db)):
death_history = game_service.create_death_history(db=db, death_data=req)
# 다음 세대 대사 즉시 생성 및 캐싱 보장 (동기식 호출)
# 다음 세대 대사 백그라운드 사전 생성 (비동기 백그라운드 태스크 구동)
next_gen = death_history.generation + 1
game_service.pregenerate_npc_dialogue(db=db, next_generation=next_gen)
background_tasks.add_task(game_service.pregenerate_npc_dialogue, next_gen)
return death_history
+8 -4
View File
@@ -36,10 +36,12 @@ def create_death_history(db: Session, death_data: AncestorDeathCreate):
db.refresh(db_death)
return db_death
# 3. 문지기 NPC 조언 대사 사전 생성 (동기식 생성 및 캐싱 보장)
def pregenerate_npc_dialogue(db: Session, next_generation: int):
# 3. 문지기 NPC 조언 대사 사전 생성 (동기 백그라운드 구동)
def pregenerate_npc_dialogue(next_generation: int):
# 비동기로 돌기 때문에 직접 세션을 생성해서 처리합니다.
db = SessionLocal()
try:
print(f"[Pregen] {next_generation}대손용 문지기 대사 동기 생성 시작...")
print(f"[Pregen] {next_generation}대손용 문지기 대사 백그라운드 생성 시작...")
# 1. AI 조언 대사 생성
dialogue_text = generate_npc_dialogue(db=db, current_generation=next_generation)
@@ -60,7 +62,9 @@ def pregenerate_npc_dialogue(db: Session, next_generation: int):
print(f"[Pregen] {next_generation}대손용 대사 캐싱 완료: {dialogue_text}")
except Exception as e:
db.rollback()
print(f"[Pregen ERROR] 대사 생성 실패: {e}")
print(f"[Pregen ERROR] 대사 백그라운드 생성 실패: {e}")
finally:
db.close()
# 2. 문지기 NPC 조언 대사 생성
def generate_npc_dialogue(db: Session, current_generation: int) -> str:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -11,6 +11,7 @@ GameObject:
- component: {fileID: 4780385515529899730}
- component: {fileID: 4780385515529899731}
- component: {fileID: 4780385515529899732}
- component: {fileID: -5153057064418233697}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
@@ -25,14 +26,13 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4780385515529899733}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 4780385513684838919}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!20 &4780385515529899731
Camera:
@@ -48,9 +48,17 @@ Camera:
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_Iso: 200
m_ShutterSpeed: 0.005
m_Aperture: 16
m_FocusDistance: 10
m_FocalLength: 50
m_BladeCount: 5
m_Curvature: {x: 2, y: 11}
m_BarrelClipping: 0.25
m_Anamorphism: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
@@ -85,78 +93,47 @@ AudioListener:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4780385515529899733}
m_Enabled: 1
--- !u!1001 &1187705533696614597
PrefabInstance:
--- !u!114 &-5153057064418233697
MonoBehaviour:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 4780385515529899730}
m_Modifications:
- target: {fileID: 5921323870032956093, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_Name
value: Particle System
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_RootOrder
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalPosition.y
value: -5.49
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalPosition.z
value: 3.27
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalRotation.w
value: 0.7071068
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalRotation.x
value: -0.7071068
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: -90
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: fe5dc813431ee4d48806ea25cda69967, type: 3}
--- !u!4 &4780385513684838919 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5921323870032956098, guid: fe5dc813431ee4d48806ea25cda69967,
type: 3}
m_PrefabInstance: {fileID: 1187705533696614597}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4780385515529899733}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData
m_RenderShadows: 1
m_RequiresDepthTextureOption: 2
m_RequiresOpaqueTextureOption: 2
m_CameraType: 0
m_Cameras: []
m_RendererIndex: -1
m_VolumeLayerMask:
serializedVersion: 2
m_Bits: 1
m_VolumeTrigger: {fileID: 0}
m_VolumeFrameworkUpdateModeOption: 2
m_RenderPostProcessing: 0
m_Antialiasing: 0
m_AntialiasingQuality: 2
m_StopNaN: 0
m_Dithering: 0
m_ClearDepth: 1
m_AllowXRRendering: 1
m_AllowHDROutput: 1
m_UseScreenCoordOverride: 0
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
m_RequiresDepthTexture: 0
m_RequiresColorTexture: 0
m_TaaSettings:
m_Quality: 3
m_FrameInfluence: 0.1
m_JitterScale: 1
m_MipBias: 0
m_VarianceClampScale: 0.9
m_ContrastAdaptiveSharpening: 0
m_Version: 2
@@ -25,6 +25,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
m_LightmapFlags: 4
@@ -35,6 +36,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -56,7 +59,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 341b226fa20286643a16a3fe05a3286b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
@@ -97,7 +100,7 @@ Material:
- _SmoothnessSource: 0
- _SpecSource: 0
- _SpecularHighlights: 1
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _XRMotionVectorsPass: 1
+153
View File
@@ -59541,6 +59541,158 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
--- !u!1 &2016794386
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2016794389}
- component: {fileID: 2016794388}
- component: {fileID: 2016794387}
m_Layer: 0
m_Name: SoundManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &2016794387
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2016794386}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 99e32a34df5b44d91a7f5280093cd383, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::SoundManager
lobbyBgmClip: {fileID: 8300000, guid: 39f24fa81a3ca4c43bed61b4ff4a7228, type: 3}
battleBgmClip: {fileID: 8300000, guid: 4559935c00ef8e94b846e2e03e39f0d0, type: 3}
buttonClickClip: {fileID: 8300000, guid: a9aa2b3b2a44a784bba46038b467f994, type: 3}
attackSwingClip: {fileID: 8300000, guid: 04b0b69230019a140ad1818f9970a743, type: 3}
punchHitClip: {fileID: 8300000, guid: 64cf1790cb30f874590e1c96c4141691, type: 3}
enemyDeathClip: {fileID: 8300000, guid: 360b32a49bc83034e90cd96afdf65777, type: 3}
playerDeathClip: {fileID: 8300000, guid: 291608b8d286e2a4580ff36324455ce2, type: 3}
transitionClip: {fileID: 8300000, guid: 64795b87003c2324fa0814fbc336066c, type: 3}
typingClip: {fileID: 8300000, guid: a4559fb7c4092fb479860fa337317ac3, type: 3}
typingPoolSize: 5
--- !u!82 &2016794388
AudioSource:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2016794386}
m_Enabled: 1
serializedVersion: 4
OutputAudioMixerGroup: {fileID: 0}
m_audioClip: {fileID: 0}
m_Resource: {fileID: 0}
m_PlayOnAwake: 1
m_Volume: 1
m_Pitch: 1
Loop: 0
Mute: 0
Spatialize: 0
SpatializePostEffects: 0
Priority: 128
DopplerLevel: 1
MinDistance: 1
MaxDistance: 500
Pan2D: 0
rolloffMode: 0
BypassEffects: 0
BypassListenerEffects: 0
BypassReverbZones: 0
rolloffCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
panLevelCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
spreadCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
reverbZoneMixCustomCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
--- !u!4 &2016794389
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2016794386}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 12.87144, y: -10.40692, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &2053466365
PrefabInstance:
m_ObjectHideFlags: 0
@@ -59816,3 +59968,4 @@ SceneRoots:
- {fileID: 1411466694}
- {fileID: 1673720196}
- {fileID: 1094628445}
- {fileID: 2016794389}
+575 -11
View File
@@ -5220,8 +5220,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_AnchoredPosition: {x: 28.6567, y: 0}
m_SizeDelta: {x: 57.3135, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &133454282
MonoBehaviour:
@@ -5290,8 +5290,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 14
m_fontSizeBase: 14
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -5450,6 +5450,17 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!114 &320546034 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 911507061901746167, guid: 6c5f439021e347c4f87cc1c7168e955b, type: 3}
m_PrefabInstance: {fileID: 1482696888}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
--- !u!1 &335091082 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 103380811750077614, guid: dc4d03e9834464d82a1dec0da2b8162f, type: 3}
@@ -5536,6 +5547,154 @@ MonoBehaviour:
maxHp: 5
nameText: {fileID: 0}
hpImage: {fileID: 0}
--- !u!1 &366661995
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 366661996}
- component: {fileID: 366661998}
- component: {fileID: 366661997}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &366661996
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 366661995}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1853696807}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &366661997
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 366661995}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text:
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: ed494d8deb7a7455f8affd65d9a92eef, type: 2}
m_sharedMaterial: {fileID: -5035255238556258946, guid: ed494d8deb7a7455f8affd65d9a92eef, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 24
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &366661998
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 366661995}
m_CullTransparentMesh: 1
--- !u!114 &366789606 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 5614311512920842161, guid: 995fb1b7b1d40f54f9494dfbb7dedfe2, type: 3}
m_PrefabInstance: {fileID: 963424159}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
--- !u!1 &403148640
GameObject:
m_ObjectHideFlags: 0
@@ -6378,6 +6537,128 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 706593201}
m_CullTransparentMesh: 1
--- !u!1001 &792134314
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_Pivot.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_Pivot.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchorMax.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchorMax.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchorMin.x
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchorMin.y
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_SizeDelta.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_SizeDelta.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalScale.x
value: 5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalScale.y
value: 5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalScale.z
value: 5
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalPosition.z
value: 20.6
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalRotation.w
value: 0.9999619
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalRotation.y
value: 0.008726557
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchoredPosition.x
value: 98.6
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_AnchoredPosition.y
value: -12.4
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 1
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 5375047960093657315, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_ConstrainProportionsScale
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8717663361120014766, guid: 64359be8b124840d0bb4846426882691, type: 3}
propertyPath: m_Name
value: Enemy
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 7979812900128732585, guid: 64359be8b124840d0bb4846426882691, type: 3}
insertIndex: -1
addedObject: {fileID: 957116746}
- targetCorrespondingSourceObject: {fileID: 7979812900128732585, guid: 64359be8b124840d0bb4846426882691, type: 3}
insertIndex: -1
addedObject: {fileID: 957116745}
- targetCorrespondingSourceObject: {fileID: 7979812900128732585, guid: 64359be8b124840d0bb4846426882691, type: 3}
insertIndex: -1
addedObject: {fileID: 957116747}
m_SourcePrefab: {fileID: 100100000, guid: 64359be8b124840d0bb4846426882691, type: 3}
--- !u!224 &875108180 stripped
RectTransform:
m_CorrespondingSourceObject: {fileID: 3800788831750671515, guid: 390aaa741d870044191b55f300c047a5, type: 3}
@@ -7734,6 +8015,93 @@ Tilemap:
e31: 0
e32: 0
e33: 1
--- !u!1 &957116741 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 7979812900128732585, guid: 64359be8b124840d0bb4846426882691, type: 3}
m_PrefabInstance: {fileID: 792134314}
m_PrefabAsset: {fileID: 0}
--- !u!70 &957116745
CapsuleCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 957116741}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_ForceSendLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ForceReceiveLayers:
serializedVersion: 2
m_Bits: 4294967295
m_ContactCaptureLayers:
serializedVersion: 2
m_Bits: 4294967295
m_CallbackLayers:
serializedVersion: 2
m_Bits: 4294967295
m_IsTrigger: 0
m_UsedByEffector: 0
m_CompositeOperation: 0
m_CompositeOrder: 0
m_Offset: {x: 0, y: 0.4}
m_Size: {x: 0.5, y: 1}
m_Direction: 0
--- !u!50 &957116746
Rigidbody2D:
serializedVersion: 5
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 957116741}
m_BodyType: 0
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDamping: 0
m_AngularDamping: 0.05
m_GravityScale: 1
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 4
--- !u!114 &957116747
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 957116741}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0c1488b68fb3e4031a2f0e33d3b95cb5, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Enemy
enemyName: "\uACE0\uBE14\uB9B0 \uC655"
hp: 30
maxHp: 30
attackPower: 2
nameText: {fileID: 1184594223}
hpImage: {fileID: 320546034}
--- !u!1001 &963424159
PrefabInstance:
m_ObjectHideFlags: 0
@@ -7835,6 +8203,55 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 995fb1b7b1d40f54f9494dfbb7dedfe2, type: 3}
--- !u!1 &966922000
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 966922002}
- component: {fileID: 966922001}
m_Layer: 0
m_Name: BattleManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &966922001
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 966922000}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33720e9c809ea4966a8848c5535d3f20, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::BattleManager
player: {fileID: 1840371595}
enemy: {fileID: 957116747}
skillInputField: {fileID: 1568869830}
attackButton: {fileID: 1853696804}
skillResultText: {fileID: 366789606}
--- !u!4 &966922002
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 966922000}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 107.055, y: -6.55568, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &976809381
GameObject:
m_ObjectHideFlags: 0
@@ -7998,8 +8415,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 20
m_fontSizeBase: 20
m_fontSize: 36
m_fontSizeBase: 36
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -8263,6 +8680,7 @@ RectTransform:
- {fileID: 1925548785}
- {fileID: 706593202}
- {fileID: 1568869829}
- {fileID: 1853696807}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -8275,6 +8693,17 @@ RectTransform:
m_CorrespondingSourceObject: {fileID: 3800788831750671515, guid: 390aaa741d870044191b55f300c047a5, type: 3}
m_PrefabInstance: {fileID: 1102442793}
m_PrefabAsset: {fileID: 0}
--- !u!114 &1184594223 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 7888741024357894282, guid: 390aaa741d870044191b55f300c047a5, type: 3}
m_PrefabInstance: {fileID: 1102442793}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
--- !u!1 &1339631191
GameObject:
m_ObjectHideFlags: 0
@@ -18198,6 +18627,18 @@ PrefabInstance:
propertyPath: m_Name
value: hp bar background
objectReference: {fileID: 0}
- target: {fileID: 8538378379228196241, guid: 6c5f439021e347c4f87cc1c7168e955b, type: 3}
propertyPath: m_Pivot.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8538378379228196241, guid: 6c5f439021e347c4f87cc1c7168e955b, type: 3}
propertyPath: m_AnchoredPosition.x
value: -235.55505
objectReference: {fileID: 0}
- target: {fileID: 8538378379228196241, guid: 6c5f439021e347c4f87cc1c7168e955b, type: 3}
propertyPath: m_AnchoredPosition.y
value: 1.5000185
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@@ -18322,7 +18763,7 @@ RectTransform:
m_GameObject: {fileID: 1568869828}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_LocalScale: {x: 1.309052, y: 1.309052, z: 1.309052}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1475548641}
@@ -18330,8 +18771,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -425.2119, y: -259}
m_SizeDelta: {x: 451.5754, y: 35.4596}
m_AnchoredPosition: {x: -237.20886, y: -269.31345}
m_SizeDelta: {x: 637.6506, y: 49.6889}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1568869830
MonoBehaviour:
@@ -34080,9 +34521,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 9ba0864ae82c04db9a0ab083a089a388, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Player
speed: 10
speed: 5
hp: 5
maxHp: 0
maxHp: 5
nameText: {fileID: 1944988752}
hpImage: {fileID: 144455365}
--- !u!70 &1840371596
@@ -34240,6 +34681,127 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
--- !u!1 &1853696803
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1853696807}
- component: {fileID: 1853696806}
- component: {fileID: 1853696805}
- component: {fileID: 1853696804}
m_Layer: 5
m_Name: Button
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1853696804
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1853696803}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1853696805}
m_OnClick:
m_PersistentCalls:
m_Calls: []
--- !u!114 &1853696805
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1853696803}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 176924562, guid: 069a00c4a21d8654bbe27600f3ba7103, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1853696806
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1853696803}
m_CullTransparentMesh: 1
--- !u!224 &1853696807
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1853696803}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 366661996}
m_Father: {fileID: 1183798055}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 227.16577, y: -270.35367}
m_SizeDelta: {x: 78.3315, y: 60.7073}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1001 &1868975694
PrefabInstance:
m_ObjectHideFlags: 0
@@ -34650,3 +35212,5 @@ SceneRoots:
- {fileID: 1183798055}
- {fileID: 976809384}
- {fileID: 529100493}
- {fileID: 792134314}
- {fileID: 966922002}
File diff suppressed because it is too large Load Diff
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 80221b1715d134845ad8d6ecd262fe16
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
File diff suppressed because it is too large Load Diff
-7
View File
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 21b75e2a5915a42e9971c7e3fce6fd8f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,182 @@
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class BattleManager : MonoBehaviour
{
[Header("전투 대상 오브젝트 연결")]
public Player player; // 플레이어 캐릭터
public Enemy enemy; // 적(Enemy) 캐릭터
[Header("UI 연결 (선택 사항)")]
public TMPro.TMP_InputField skillInputField; // Canvas에 배치한 텍스트 입력창
public UnityEngine.UI.Button attackButton; // Canvas에 배치한 공격 버튼
public TMPro.TextMeshProUGUI skillResultText; // 스킬 연성 결과 및 설명 출력용 텍스트 UI 추가 ⭐
private string debugInputText = "불화살을 힘차게 쏜다!"; // OnGUI 디버그용 입력 기본값
private string statusText = "스킬을 입력하여 전투를 시작하세요.";
private bool isAttacking = false;
private void Start()
{
// 씬 내의 Player와 Enemy를 지정 안 했을 경우 자동으로 검색하여 매칭합니다.
if (player == null) player = FindObjectOfType<Player>();
if (enemy == null) enemy = FindObjectOfType<Enemy>();
// Canvas 버튼 클릭 이벤트 바인딩
if (attackButton != null)
{
attackButton.onClick.AddListener(OnAttackButtonClick);
}
}
// Canvas UI의 공격 버튼을 클릭했을 때 호출되는 함수
public void OnAttackButtonClick()
{
if (isAttacking) return;
// 버튼 클릭음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayButtonClick();
}
string prompt = "";
if (skillInputField != null)
{
prompt = skillInputField.text;
}
if (string.IsNullOrEmpty(prompt))
{
statusText = "스킬 묘사 텍스트를 입력해 주세요!";
return;
}
StartCoroutine(AttackFlowCoroutine(prompt));
}
// AI 스킬 연성 및 턴제 상호작용(플레이어 공격 -> 피격 -> 적 반격)을 관리하는 코루틴
private IEnumerator AttackFlowCoroutine(string skillPrompt)
{
isAttacking = true;
statusText = "AI가 스킬을 연성하는 중입니다...";
Debug.Log($"[Battle] 스킬 프롬프트 전송 시도: \"{skillPrompt}\"");
// 1. FastAPI 서버의 generate-skill API 호출 (플레이어 레벨 파라미터에는 Generation 세대값 전달)
string url = "http://192.168.1.7:8000/api/game/generate-skill";
int playerLevel = (player != null) ? player.Generation : 1;
SkillCreateRequest requestData = new SkillCreateRequest
{
prompt = skillPrompt,
player_level = playerLevel
};
string jsonPayload = JsonUtility.ToJson(requestData);
using (UnityWebRequest request = new UnityWebRequest(url, "POST"))
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonPayload);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError($"[Battle] 스킬 연성 실패: {request.error}");
statusText = "스킬 연성 실패 (서버 에러)";
isAttacking = false;
yield break;
}
// 스킬 데이터 파싱
string responseText = request.downloadHandler.text;
SkillCreateResponse response = JsonUtility.FromJson<SkillCreateResponse>(responseText);
statusText = $"[연성 완료] 스킬: {response.name} | 피해: {response.damage}";
Debug.Log($"[Battle] 스킬 연성 성공: {response.name} (대미지: {response.damage}) - {response.description}");
// AI가 연성한 최종 스킬 정보를 화면상 텍스트 UI에 실시간 갱신 출력합니다.
if (skillResultText != null)
{
skillResultText.text = $"스킬 연성 성공: {response.name} (대미지: {response.damage})\n- {response.description}";
}
// 2. 플레이어 공격 애니메이션 및 적 타격 처리
if (player != null && player.hp > 0)
{
// 플레이어 휘두르기 공격음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayAttackSwing();
}
Animator pAnim = player.GetComponentInChildren<Animator>();
if (pAnim != null)
{
pAnim.SetTrigger("2_Attack"); // 공격 모션 가동
}
}
yield return new WaitForSeconds(0.6f); // 공격 모션 타이밍 대기
if (enemy != null)
{
enemy.TakeDamage(response.damage); // 적에게 AI로 생성된 데미지 적용
}
// 3. 적이 쓰러졌는지 확인
if (enemy != null && enemy.hp <= 0)
{
statusText = $"[승리] 적 {enemy.enemyName}을(를) 처치했습니다!";
isAttacking = false;
yield break;
}
// 4. 적의 생존 시 반격 턴 개시 (1.5초 후 적이 플레이어를 공격)
yield return new WaitForSeconds(1.5f);
if (enemy != null && enemy.hp > 0 && player != null && player.hp > 0)
{
statusText = $"적 {enemy.enemyName}의 반격 차례!";
enemy.Attack(player); // 적의 플레이어 타격 실행
}
yield return new WaitForSeconds(1.2f); // 피격 연출 대기
if (player != null && player.hp <= 0)
{
statusText = "[패배] 플레이어가 전사했습니다. 씬이 초기화됩니다.";
}
else
{
statusText = "전투 대기 중... 스킬을 입력하고 공격 버튼을 누르세요.";
}
isAttacking = false;
}
}
}
// ----------------------------------------------------
// JSON 연동용 API 페이로드 스키마 정의 클래스
// ----------------------------------------------------
[System.Serializable]
public class SkillCreateRequest
{
public string prompt;
public int player_level;
}
[System.Serializable]
public class SkillCreateResponse
{
public string name;
public int damage;
public float speed;
public string description;
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 33720e9c809ea4966a8848c5535d3f20
+115
View File
@@ -0,0 +1,115 @@
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Enemy : MonoBehaviour
{
[Header("적 스탯 설정")]
public string enemyName = "고블린 왕";
public int hp = 30;
public int maxHp = 30;
public int attackPower = 2; // 플레이어를 공격할 때의 기본 데미지 수치
[Header("UI 연결")]
public TextMeshProUGUI nameText; // 적 이름 표시 TMP
public Image hpImage; // 적 체력바 이미지
private Animator animator;
private void Start()
{
maxHp = hp;
// 자식 오브젝트의 애니메이터(SPUM 리소스 구조)를 획득합니다.
animator = GetComponentInChildren<Animator>();
// 적 캐릭터의 기본 방향을 플레이어를 바라보도록 좌측(스케일 양수)으로 정렬합니다.
Vector3 initialScale = transform.localScale;
initialScale.x = Mathf.Abs(initialScale.x);
transform.localScale = initialScale;
// 시작 시 적 이름을 UI 텍스트에 연동합니다.
if (nameText != null)
{
nameText.text = enemyName;
}
}
private void Update()
{
// 안전 조치: maxHp가 비정상(0 이하)이거나 현재 체력이 초과된 경우 자동 동기화
if (maxHp <= 0 || hp > maxHp)
{
maxHp = hp;
}
// 플레이어와 동일하게 Simple/Filled 이미지 방식 모두 가로가 정상 감축되도록 이중 연동합니다.
if (hpImage != null && maxHp > 0)
{
float fillRatio = Mathf.Clamp01((float)hp / maxHp);
hpImage.fillAmount = fillRatio;
hpImage.rectTransform.localScale = new Vector3(fillRatio, 1f, 1f);
}
}
// 플레이어의 공격을 받아 데미지를 입는 메서드
public void TakeDamage(int damage)
{
if (hp <= 0) return; // 이미 죽은 경우 무시
hp -= damage;
if (hp < 0) hp = 0;
Debug.Log($"[Enemy] 적 {enemyName}이(가) {damage} 피해를 입었습니다. 현재 체력: {hp}/{maxHp}");
if (animator != null)
{
if (hp <= 0)
{
// 1. 적 전사 사망 효과음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayEnemyDeath();
}
// SPUM 리소스 기준 사망(4_Death) 트리거 작동
animator.SetTrigger("4_Death");
Debug.Log($"[Enemy] 적 {enemyName}이(가) 사망하였습니다.");
}
else
{
// 2. 적 피격 효과음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayPunchHit();
}
// SPUM 리소스 기준 피격(3_Damaged) 트리거 작동
animator.SetTrigger("3_Damaged");
}
}
}
// 플레이어를 반격 공격하는 메서드
public void Attack(Player player)
{
if (hp <= 0 || player == null) return;
Debug.Log($"[Enemy] 적 {enemyName}이(가) 플레이어를 공격합니다! (데미지: {attackPower})");
// 3. 적 공격 휘두르기 효과음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayAttackSwing();
}
if (animator != null)
{
// SPUM 리소스 기준 공격(2_Attack) 트리거 작동
animator.SetTrigger("2_Attack");
}
// 플레이어 체력 차감 전송
player.TakeDamage(attackPower, enemyName);
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0c1488b68fb3e4031a2f0e33d3b95cb5
@@ -39,4 +39,14 @@ public class GameManager : MonoBehaviour
Debug.Log($"[GameManager] 캐릭터 정보 보존 세이브 완료: {playerName} ({playerGeneration}대) | HP: {playerHp}/{playerMaxHp}");
}
}
// 플레이어 보존 세션을 리셋하는 메서드 (사망 시 호출)
public void ClearPlayerData()
{
playerName = "";
playerGeneration = 1;
playerHp = 5;
playerMaxHp = 5;
Debug.Log("[GameManager] 보존된 이전 플레이어 스탯 데이터를 비웠습니다. (신규 세대 생성 준비 완료)");
}
}
@@ -69,7 +69,7 @@ public class NPCDialogueManager : MonoBehaviour
}
// FastAPI의 NPC 대화 조회 엔드포인트 URL 구성
string url = $"http://127.0.0.1:8000/api/game/npc-dialogue?current_generation={currentGeneration}";
string url = $"http://192.168.1.7:8000/api/game/npc-dialogue?current_generation={currentGeneration}";
Debug.Log($"[Dialogue] NPC 대사 조회 요청 전송: {url}");
using (UnityWebRequest request = UnityWebRequest.Get(url))
@@ -127,6 +127,12 @@ public class NPCDialogueManager : MonoBehaviour
{
dialogueText.text = lastDialogueText;
}
// 공백 문자가 아닌 경우에만 츤데레 훈수 타자기 효과음 재생
if (letter != ' ' && SoundManager.Instance != null)
{
SoundManager.Instance.PlayTyping();
}
// 쉼표(,)나 마침표(.) 등 문장이 끊기는 지점에서는 살짝 더 더듬는 효과(딜레이 추가) 제공
if (letter == ',' || letter == '.')
@@ -141,34 +147,5 @@ public class NPCDialogueManager : MonoBehaviour
typingCoroutine = null;
}
// 디버그용 임시 OnGUI 버튼
private void OnGUI()
{
GUI.backgroundColor = Color.yellow;
if (GUI.Button(new Rect(Screen.width - 240, 10, 220, 50), "Debug: Get NPC Dialogue"))
{
Player player = FindObjectOfType<Player>();
if (player != null)
{
RequestNPCDialogue(player.Generation);
}
else
{
RequestNPCDialogue(1);
}
}
if (dialoguePanel != null && dialoguePanel.activeSelf)
{
GUI.color = Color.white;
GUI.Box(new Rect(Screen.width - 450, 70, 430, 120), "늙은 문지기 '발두르'의 조언 (Debug)");
GUIStyle dialogueStyle = new GUIStyle(GUI.skin.label);
dialogueStyle.wordWrap = true;
dialogueStyle.fontSize = 14;
GUI.Label(new Rect(Screen.width - 440, 95, 410, 90), lastDialogueText, dialogueStyle);
}
}
}
+40 -55
View File
@@ -138,7 +138,15 @@ public class Player : MonoBehaviour
return;
}
InputContoller.UpdateInput(ref _inputs);
// 배틀 스테이지 씬에서는 이동 입력을 무시하여 움직이지 못하게 차단합니다 (채팅 공격 전용)
if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "battleStage")
{
_inputs.PlayerMove = Vector2.zero;
}
else
{
InputContoller.UpdateInput(ref _inputs);
}
// 좌우 방향 전환 (Flip)
if (_inputs.PlayerMove.x < 0f && isFacingRight)
@@ -175,7 +183,8 @@ public class Player : MonoBehaviour
{
if (rb == null) return;
if (hp <= 0)
// 사망 상태이거나 배틀 스테이지 씬일 경우 움직임 강제 정지
if (hp <= 0 || UnityEngine.SceneManagement.SceneManager.GetActiveScene().name == "battleStage")
{
rb.linearVelocity = new Vector2(0f, rb.linearVelocity.y);
return;
@@ -206,72 +215,35 @@ public class Player : MonoBehaviour
{
if (hp <= 0)
{
// 1. 플레이어 전사 사운드 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayPlayerDeath();
}
animator.SetTrigger("4_Death");
Debug.Log($"플레이어가 {attackerName}에 의해 사망했습니다.");
StartCoroutine(SendDeathReport(attackerName));
}
else
{
// 2. 플레이어 피격 사운드 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayPunchHit();
}
animator.SetTrigger("3_Damaged");
}
}
}
// 인스펙터 우클릭 메뉴에서 데미지를 테스트할 수 있는 기능 추가
[ContextMenu("Debug/Take 5 Damage")]
public void DebugTake5Damage()
{
TakeDamage(5, "인스펙터 디버그 공격");
}
[ContextMenu("Debug/Restore HP")]
public void DebugRestoreHP()
{
hp = maxHp;
if (animator != null)
{
animator.Rebind();
animator.Update(0f);
}
Debug.Log($"플레이어 체력이 {hp}로 회복되었습니다.");
// 체력 복구 시 다음 캐릭터 이름 및 세대 정보 갱신
StartCoroutine(GetNextGenerationFromServer());
}
// 임시 디버그용 화면 버튼 (게임 실행 시 화면 좌측 상단에 뜸)
private void OnGUI()
{
GUI.backgroundColor = Color.red;
if (GUI.Button(new Rect(10, 10, 180, 50), "Debug: Take 5 Damage (Trap)"))
{
TakeDamage(5, "테스트 함정");
}
GUI.backgroundColor = Color.blue;
// 기존 겹쳐있던 위치(10, 10)를 피해 y 좌표를 130으로 내렸습니다.
if (GUI.Button(new Rect(10, 130, 180, 50), "Debug: Take 3 Damage (Monster)"))
{
TakeDamage(3, "테스트 몬스터");
}
GUI.backgroundColor = Color.green;
if (GUI.Button(new Rect(10, 70, 180, 50), "Debug: Restore HP"))
{
DebugRestoreHP();
}
// 캐릭터 정보 UI 노출
GUI.color = Color.white;
GUI.skin.label.fontSize = 16;
GUI.Label(new Rect(10, 200, 400, 30), $"이름: {characterName}");
GUI.Label(new Rect(10, 230, 400, 30), $"세대: {generation}대손");
}
// 백엔드로부터 다음 세대 번호를 받아와 랜덤 이름과 매핑하는 코루틴
private System.Collections.IEnumerator GetNextGenerationFromServer()
{
string url = "http://127.0.0.1:8000/api/game/generation/next";
string url = "http://192.168.1.7:8000/api/game/generation/next";
using (UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.Get(url))
{
@@ -314,7 +286,7 @@ public class Player : MonoBehaviour
// 백엔드로 완성된 사망 기록을 전송하는 코루틴
private System.Collections.IEnumerator SendDeathReport(string cause)
{
string url = "http://127.0.0.1:8000/api/game/death";
string url = "http://192.168.1.7:8000/api/game/death";
AncestorDeathCreate requestData = new AncestorDeathCreate
{
@@ -343,9 +315,22 @@ public class Player : MonoBehaviour
else
{
Debug.Log("사망 기록 전송 성공: " + request.downloadHandler.text);
// 사망 전송 성공 즉시 다음 세대 정보 받아와 자동 갱신
StartCoroutine(GetNextGenerationFromServer());
}
// 1. 싱글톤 GameManager의 이전 캐릭터 정보 데이터 초기화 (신규 세대 생성 유도)
if (GameManager.Instance != null)
{
GameManager.Instance.ClearPlayerData();
}
// 2. 플레이어 사망 연출(2초 누워있기) 대기 후 로비 씬으로 씬 전환 실행
yield return new WaitForSeconds(2.0f);
Debug.Log("[Death Report] 로비 씬(Lobby)으로 되돌아갑니다.");
// 사망 연출이 종료되었으므로 플레이어 게임 오브젝트를 씬에서 완전히 파괴합니다.
Destroy(gameObject);
UnityEngine.SceneManagement.SceneManager.LoadScene("Lobby");
}
}
}
+161
View File
@@ -0,0 +1,161 @@
using UnityEngine;
using UnityEngine.SceneManagement;
[RequireComponent(typeof(AudioSource))]
public class SoundManager : MonoBehaviour
{
// 전역 어디서나 효과음과 BGM을 호출할 수 있는 싱글톤 인스턴스
public static SoundManager Instance { get; private set; }
[Header("BGM 배경음악 오디오 클립 등록")]
public AudioClip lobbyBgmClip; // 로비 씬 배경음악
public AudioClip battleBgmClip; // 배틀 스테이지 배경음악
[Header("효과음 오디오 클립 등록 슬롯")]
public AudioClip buttonClickClip; // 버튼 클릭음
public AudioClip attackSwingClip; // 플레이어/적 공격 휘두르기 소리
public AudioClip punchHitClip; // 피격 타격음
public AudioClip enemyDeathClip; // 적 사망음
public AudioClip playerDeathClip; // 플레이어 사망음
public AudioClip transitionClip; // 성벽 통과 씬 전환음
public AudioClip typingClip; // 대화창 글자 타이핑음
[Header("타자기 효과음 풀링 설정")]
[SerializeField] private int typingPoolSize = 5;
private AudioSource[] typingAudioPool;
private int nextPoolIndex = 0;
private AudioSource globalSFXSource; // 효과음 전용 소스
private AudioSource bgmAudioSource; // BGM 전용 루프 소스
private void Awake()
{
// 싱글톤 보장
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// 1. 효과음 전용 오디오 소스 설정
globalSFXSource = GetComponent<AudioSource>();
if (globalSFXSource == null)
{
globalSFXSource = gameObject.AddComponent<AudioSource>();
}
// 2. BGM 전용 독립 오디오 소스 생성 및 셋팅 (루프 기능 및 독립 볼륨)
bgmAudioSource = gameObject.AddComponent<AudioSource>();
bgmAudioSource.playOnAwake = false;
bgmAudioSource.loop = true;
// 3. 효과음 풀링 초기화
InitializeTypingPool();
}
private void OnEnable()
{
// 유니티 씬 로드 완료 이벤트를 리스닝합니다. (씬 전환 시 BGM 자동 매핑용)
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnDisable()
{
// 이벤트 해제
SceneManager.sceneLoaded -= OnSceneLoaded;
}
// 씬이 완벽하게 로드되었을 때 실행되는 콜백 함수
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
PlayBgmForScene(scene.name);
}
// 씬 이름 기반 배경음악 교체 메서드
public void PlayBgmForScene(string sceneName)
{
AudioClip targetBgm = null;
// 씬 이름과 매치되는 배경음악 선별
if (sceneName == "Lobby")
{
targetBgm = lobbyBgmClip;
}
else if (sceneName == "battleStage")
{
targetBgm = battleBgmClip;
}
if (bgmAudioSource == null) return;
// 현재 이미 똑같은 배경음악이 돌고 있다면 끊김 없이 연주 유지
if (bgmAudioSource.clip == targetBgm && bgmAudioSource.isPlaying) return;
// 이전 배경음악 정지 및 새 음악 매핑 후 루프 재생
bgmAudioSource.Stop();
bgmAudioSource.clip = targetBgm;
if (targetBgm != null)
{
bgmAudioSource.volume = 0.45f; // 효과음에 비해 잔잔하도록 볼륨 기본 설정
bgmAudioSource.Play();
Debug.Log($"[SoundManager] '{sceneName}' 씬 진입 감지 -> BGM 자동 재생: {targetBgm.name}");
}
else
{
Debug.LogWarning($"[SoundManager] '{sceneName}' 씬에 등록된 BGM 오디오 클립이 없습니다.");
}
}
private void InitializeTypingPool()
{
typingAudioPool = new AudioSource[typingPoolSize];
for (int i = 0; i < typingPoolSize; i++)
{
GameObject child = new GameObject($"TypingAudioChannel_{i}");
child.transform.SetParent(this.transform);
AudioSource source = child.AddComponent<AudioSource>();
source.playOnAwake = false;
source.loop = false;
typingAudioPool[i] = source;
}
}
// 기본 단발성 효과음 재생
public void PlayOneShot(AudioClip clip, float volume = 1f)
{
if (clip != null && globalSFXSource != null)
{
globalSFXSource.PlayOneShot(clip, volume);
}
}
// 효과음 바인딩 메서드들
public void PlayButtonClick() => PlayOneShot(buttonClickClip, 0.7f);
public void PlayAttackSwing() => PlayOneShot(attackSwingClip, 0.85f);
public void PlayPunchHit() => PlayOneShot(punchHitClip, 0.95f);
public void PlayEnemyDeath() => PlayOneShot(enemyDeathClip, 1.0f);
public void PlayPlayerDeath() => PlayOneShot(playerDeathClip, 1.0f);
public void PlayTransition() => PlayOneShot(transitionClip, 0.9f);
// 타자기 효과음
public void PlayTyping()
{
if (typingClip == null || typingAudioPool == null || typingAudioPool.Length == 0) return;
AudioSource channel = typingAudioPool[nextPoolIndex];
nextPoolIndex = (nextPoolIndex + 1) % typingPoolSize;
if (channel != null)
{
channel.clip = typingClip;
channel.volume = 0.22f;
channel.pitch = Random.Range(0.85f, 1.15f);
channel.Play();
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 99e32a34df5b44d91a7f5280093cd383
@@ -36,6 +36,12 @@ public class WallTransition : MonoBehaviour
Debug.LogWarning("[Transition] 씬에 GameManager 싱글톤 오브젝트가 존재하지 않아 플레이어 정보 임시 세이브를 스킵합니다.");
}
// 성벽 통과/씬 전환 효과음 재생
if (SoundManager.Instance != null)
{
SoundManager.Instance.PlayTransition();
}
// 2. 유니티 씬 매니저를 통해 목표 씬(battleStage)을 즉시 로드합니다.
Debug.Log($"[Transition] {targetSceneName} 씬으로 화면을 전환합니다.");
SceneManager.LoadScene(targetSceneName);
@@ -53,7 +53,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
@@ -123,7 +123,7 @@ Material:
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 0.712}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 0.712}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
- _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1}
- _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1}
@@ -63,8 +63,8 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Texture: {fileID: 2800000, guid: 1cdc5b506b1a4a33a53c30669ced1f51, type: 3}
m_Scale: {x: 20, y: 20}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
@@ -80,8 +80,8 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Texture: {fileID: 2800000, guid: 85ac55597b97403c82fc6601a93cf241, type: 3}
m_Scale: {x: 5, y: 5}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
@@ -165,7 +165,7 @@ Material:
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 0.8784314}
- _BorderColor: {r: 0, g: 0, b: 0, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 0.8784314}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 0}
- _EmissionColorUI: {r: 1, g: 1, b: 1, a: 1}
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
@@ -52,7 +52,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 602cb87b6a29443b8636370ea0751574, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -25,6 +26,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -50,7 +53,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28933816116536082, guid: 8a89fa14b10d46a99122fd4f73fca9a2, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -129,7 +132,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -25,6 +25,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -37,6 +38,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -62,7 +65,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28933816116536082, guid: 8a89fa14b10d46a99122fd4f73fca9a2, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -141,7 +144,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -25,6 +25,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -38,6 +39,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -63,7 +66,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: -0.15}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28933816116536082, guid: 8a89fa14b10d46a99122fd4f73fca9a2, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -142,7 +145,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
@@ -23,6 +24,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -48,7 +51,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28933816116536082}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -127,7 +130,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -25,6 +26,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -50,7 +53,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946, guid: 125cb55b44b24c4393181402bc6200e6, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskTex:
@@ -134,7 +137,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -25,6 +25,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -38,6 +39,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -63,7 +66,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946, guid: 125cb55b44b24c4393181402bc6200e6, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskTex:
@@ -147,7 +150,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -24,6 +25,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -49,7 +52,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946, guid: 125cb55b44b24c4393181402bc6200e6, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskTex:
@@ -133,7 +136,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -25,6 +26,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -50,7 +53,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946, guid: 125cb55b44b24c4393181402bc6200e6, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskTex:
@@ -136,7 +139,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,18 +12,21 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
- GLOW_ON
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_DoubleSidedGI: 1
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -49,7 +52,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946, guid: 125cb55b44b24c4393181402bc6200e6, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -130,7 +133,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 1
- _TextureHeight: 1024
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
@@ -23,6 +24,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -48,7 +51,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28584486757587946}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -127,7 +130,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
@@ -23,6 +24,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -48,7 +51,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28981121099961358}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -127,7 +130,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
@@ -25,6 +26,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -50,7 +53,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28204114720316640, guid: 5302535af1044152a457ed104f1f4b91, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -129,7 +132,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -25,18 +25,21 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords:
- UNDERLAY_ON
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_DoubleSidedGI: 1
m_CustomRenderQueue: 3000
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -62,7 +65,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28204114720316640, guid: 5302535af1044152a457ed104f1f4b91, type: 2}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -143,7 +146,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -12,6 +12,7 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: []
@@ -23,6 +24,8 @@ Material:
RenderType: Transparent
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -48,7 +51,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 28204114720316640}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OutlineTex:
@@ -127,7 +130,7 @@ Material:
- _SpecSource: 0
- _SpecularHighlights: 1
- _SpecularPower: 2
- _SrcBlend: 5
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Stencil: 0
- _StencilComp: 8
@@ -897,7 +897,7 @@ PlayerSettings:
hmiLoadingImage: {fileID: 0}
platformRequiresReadableAssets: 0
virtualTexturingSupportEnabled: 0
insecureHttpOption: 0
insecureHttpOption: 2
androidVulkanDenyFilterList: []
androidVulkanAllowFilterList: []
androidVulkanDeviceFilterListAsset: {fileID: 0}