EerieVillage/Assets/Scripts/Mechanics/MonsterRandomizer.cs

40 lines
1.7 KiB
C#
Raw Normal View History

using UnityEngine;
namespace Platformer.Mechanics
{
/// <summary>
fix(BT12-Dev): 몬스터 종류 random — 6 OverrideController·MonsterRandomizer PD: "몬스터 색을 랜덤으로 하라는 얘기가 아니라 몬스터 종류를 랜덤으로 하라고 했잖아" 자성: 직전 commit 6e774dc에서 PD 의도 오역 — 색 tint 영역. 종류(sprite) random 의도 정합 X. 근본 (MCP 자율 영역): - Enemy.prefab idleFrames 24 sprite (M001~M006 × 4 idle frame) 영역 영역 - Enemy.controller 4 Clip (EnemyIdle·EnemyRun·EnemyHurt·EnemyDeath) - 영역: 6 Idle Clip + 6 OverrideController·EnemyIdle만 override fix: 1. 6 AnimationClip 신규 — M001_Idle ~ M006_Idle.anim - 각 4 sprite keyframe·frameRate 12·loopTime=true - SetObjectReferenceCurve (m_Sprite property) 2. 6 AnimatorOverrideController 신규 — M001 ~ M006.overrideController - runtimeAnimatorController = Enemy.controller - EnemyIdle Clip → M00x_Idle Clip override - EnemyRun·EnemyHurt·EnemyDeath 영역 (영역 sprite·6종 영역 영역 영역) 3. MonsterRandomizer 영역 - overrideControllers[6] 영역 - Awake 영역 random select·animator.runtimeAnimatorController = overrideControllers[idx] - 색 tint 영역 폐기 4. Enemy.prefab MonsterRandomizer.overrideControllers 6 OverrideController 영역 5. Scene 영역 활성 Enemy 16개 SpriteRenderer.color = white (이전 tint 영역) 회귀 영역 X: - Animator (Idle·Run·Hurt·Death) 정합 유지·EnemyIdle만 override - One-Way Platform·Enemy 발판 IgnoreCollision·Player·Camera 영역 영역 X Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 16:37:54 +00:00
/// 몬스터 종류 랜덤 — 6 AnimatorOverrideController random select.
/// PD 지시 (2026-05-11): 몬스터 종류 랜덤 변경.
/// 6종 (M001~M006) Idle Clip override·Animator runtimeAnimatorController random.
/// </summary>
public class MonsterRandomizer : MonoBehaviour
{
fix(BT12-Dev): 몬스터 종류 random — 6 OverrideController·MonsterRandomizer PD: "몬스터 색을 랜덤으로 하라는 얘기가 아니라 몬스터 종류를 랜덤으로 하라고 했잖아" 자성: 직전 commit 6e774dc에서 PD 의도 오역 — 색 tint 영역. 종류(sprite) random 의도 정합 X. 근본 (MCP 자율 영역): - Enemy.prefab idleFrames 24 sprite (M001~M006 × 4 idle frame) 영역 영역 - Enemy.controller 4 Clip (EnemyIdle·EnemyRun·EnemyHurt·EnemyDeath) - 영역: 6 Idle Clip + 6 OverrideController·EnemyIdle만 override fix: 1. 6 AnimationClip 신규 — M001_Idle ~ M006_Idle.anim - 각 4 sprite keyframe·frameRate 12·loopTime=true - SetObjectReferenceCurve (m_Sprite property) 2. 6 AnimatorOverrideController 신규 — M001 ~ M006.overrideController - runtimeAnimatorController = Enemy.controller - EnemyIdle Clip → M00x_Idle Clip override - EnemyRun·EnemyHurt·EnemyDeath 영역 (영역 sprite·6종 영역 영역 영역) 3. MonsterRandomizer 영역 - overrideControllers[6] 영역 - Awake 영역 random select·animator.runtimeAnimatorController = overrideControllers[idx] - 색 tint 영역 폐기 4. Enemy.prefab MonsterRandomizer.overrideControllers 6 OverrideController 영역 5. Scene 영역 활성 Enemy 16개 SpriteRenderer.color = white (이전 tint 영역) 회귀 영역 X: - Animator (Idle·Run·Hurt·Death) 정합 유지·EnemyIdle만 override - One-Way Platform·Enemy 발판 IgnoreCollision·Player·Camera 영역 영역 X Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 16:37:54 +00:00
[Tooltip("이전 호환 — 24 sprite (6종 × 4 frame). Override Controller 신규 영역 후속 폐기 가능.")]
public Sprite[] idleFrames;
fix(BT12-Dev): 몬스터 종류 random — 6 OverrideController·MonsterRandomizer PD: "몬스터 색을 랜덤으로 하라는 얘기가 아니라 몬스터 종류를 랜덤으로 하라고 했잖아" 자성: 직전 commit 6e774dc에서 PD 의도 오역 — 색 tint 영역. 종류(sprite) random 의도 정합 X. 근본 (MCP 자율 영역): - Enemy.prefab idleFrames 24 sprite (M001~M006 × 4 idle frame) 영역 영역 - Enemy.controller 4 Clip (EnemyIdle·EnemyRun·EnemyHurt·EnemyDeath) - 영역: 6 Idle Clip + 6 OverrideController·EnemyIdle만 override fix: 1. 6 AnimationClip 신규 — M001_Idle ~ M006_Idle.anim - 각 4 sprite keyframe·frameRate 12·loopTime=true - SetObjectReferenceCurve (m_Sprite property) 2. 6 AnimatorOverrideController 신규 — M001 ~ M006.overrideController - runtimeAnimatorController = Enemy.controller - EnemyIdle Clip → M00x_Idle Clip override - EnemyRun·EnemyHurt·EnemyDeath 영역 (영역 sprite·6종 영역 영역 영역) 3. MonsterRandomizer 영역 - overrideControllers[6] 영역 - Awake 영역 random select·animator.runtimeAnimatorController = overrideControllers[idx] - 색 tint 영역 폐기 4. Enemy.prefab MonsterRandomizer.overrideControllers 6 OverrideController 영역 5. Scene 영역 활성 Enemy 16개 SpriteRenderer.color = white (이전 tint 영역) 회귀 영역 X: - Animator (Idle·Run·Hurt·Death) 정합 유지·EnemyIdle만 override - One-Way Platform·Enemy 발판 IgnoreCollision·Player·Camera 영역 영역 X Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 16:37:54 +00:00
[Tooltip("6 AnimatorOverrideController (M001~M006).")]
public AnimatorOverrideController[] overrideControllers;
feat(BT12-Dev): 박쥐 (M002) 날으는 몬스터 — IsFlying flag (PD 지시 2026-05-15) PD 보고: 1. "Enemy_M002_Bat 몬스터는 날으는 몬스터이기 때문에 y위치를 높이고 싶은데 자꾸 땅으로 내려오는 현상을 수정해줘." 2. "이 몬스터가 이동하지 못하는 이유를 체크해보고 수정해줘." 원인 진단: 1. KinematicObject.FixedUpdate L107 else 분기 (velocity.y>=0) gravityModifier 무시·무조건 Physics2D.gravity 적용 → 박쥐 gravityModifier=0 해도 천천히 떨어짐 2. EnemyController.UpdatePatrol cliffCheck Raycast 영역 공중 박쥐 발 밑 ground 없음 → 즉시 TriggerReverse → 1초 cooldown 후 다시 검출 → 무한 좌우 반전 → 이동 0 3. EnemyController.Update L361 fallThreshold 떨어짐 검출 → 강제 텔레포트 _startY 복귀 정정: 1. KinematicObject.FixedUpdate else 분기에도 gravityModifier 곱 gravityModifier=0 → 자연 중력 무효 (Player gravityModifier=1 영역 영향 X·기존 동작 보존) 2. EnemyController.IsFlying bool 신규 (Inspector) - Awake 영역 IsFlying=true → control.gravityModifier=0·velocity=0 - UpdatePatrol cliffCheck 영역 !IsFlying 분기 (cliff skip) - Update 떨어짐 텔레포트 영역 !IsFlying 분기 (skip) 3. MonsterRandomizer.flyingFlags bool[] 신규 (Inspector·동일 length) - Awake 영역 random idx · flyingFlags[idx]=true → EnemyController.IsFlying=true 자동 set 검증 (Play 모드): - IsFlying=true 강제 set + y +3 이동 - [t=0] pos.y=0.50 · gravMod=0 - [t=3s] pos.y=0.50 (유지·떨어짐 X) · velocity=(-3.50, 0) (x patrol 이동·y 0) PD 후속: Enemy.prefab Inspector MonsterRandomizer.flyingFlags 영역 박쥐 (M002) idx 영역 true 설정 필요. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:18:06 +00:00
// PD 지시 2026-05-15 — 날으는 몬스터 영역 (M002 박쥐 등)
// overrideControllers 영역 동일 length·true 영역 EnemyController.IsFlying=true 자동 set
[Tooltip("각 overrideController 영역 IsFlying flag (동일 length). 박쥐 등 공중 몬스터 영역 true.")]
public bool[] flyingFlags;
void Awake()
{
fix(BT12-Dev): 몬스터 종류 random — 6 OverrideController·MonsterRandomizer PD: "몬스터 색을 랜덤으로 하라는 얘기가 아니라 몬스터 종류를 랜덤으로 하라고 했잖아" 자성: 직전 commit 6e774dc에서 PD 의도 오역 — 색 tint 영역. 종류(sprite) random 의도 정합 X. 근본 (MCP 자율 영역): - Enemy.prefab idleFrames 24 sprite (M001~M006 × 4 idle frame) 영역 영역 - Enemy.controller 4 Clip (EnemyIdle·EnemyRun·EnemyHurt·EnemyDeath) - 영역: 6 Idle Clip + 6 OverrideController·EnemyIdle만 override fix: 1. 6 AnimationClip 신규 — M001_Idle ~ M006_Idle.anim - 각 4 sprite keyframe·frameRate 12·loopTime=true - SetObjectReferenceCurve (m_Sprite property) 2. 6 AnimatorOverrideController 신규 — M001 ~ M006.overrideController - runtimeAnimatorController = Enemy.controller - EnemyIdle Clip → M00x_Idle Clip override - EnemyRun·EnemyHurt·EnemyDeath 영역 (영역 sprite·6종 영역 영역 영역) 3. MonsterRandomizer 영역 - overrideControllers[6] 영역 - Awake 영역 random select·animator.runtimeAnimatorController = overrideControllers[idx] - 색 tint 영역 폐기 4. Enemy.prefab MonsterRandomizer.overrideControllers 6 OverrideController 영역 5. Scene 영역 활성 Enemy 16개 SpriteRenderer.color = white (이전 tint 영역) 회귀 영역 X: - Animator (Idle·Run·Hurt·Death) 정합 유지·EnemyIdle만 override - One-Way Platform·Enemy 발판 IgnoreCollision·Player·Camera 영역 영역 X Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 16:37:54 +00:00
if (overrideControllers == null || overrideControllers.Length == 0) return;
var anim = GetComponent<Animator>();
if (anim == null) return;
int idx = Random.Range(0, overrideControllers.Length);
anim.runtimeAnimatorController = overrideControllers[idx];
feat(BT12-Dev): 박쥐 (M002) 날으는 몬스터 — IsFlying flag (PD 지시 2026-05-15) PD 보고: 1. "Enemy_M002_Bat 몬스터는 날으는 몬스터이기 때문에 y위치를 높이고 싶은데 자꾸 땅으로 내려오는 현상을 수정해줘." 2. "이 몬스터가 이동하지 못하는 이유를 체크해보고 수정해줘." 원인 진단: 1. KinematicObject.FixedUpdate L107 else 분기 (velocity.y>=0) gravityModifier 무시·무조건 Physics2D.gravity 적용 → 박쥐 gravityModifier=0 해도 천천히 떨어짐 2. EnemyController.UpdatePatrol cliffCheck Raycast 영역 공중 박쥐 발 밑 ground 없음 → 즉시 TriggerReverse → 1초 cooldown 후 다시 검출 → 무한 좌우 반전 → 이동 0 3. EnemyController.Update L361 fallThreshold 떨어짐 검출 → 강제 텔레포트 _startY 복귀 정정: 1. KinematicObject.FixedUpdate else 분기에도 gravityModifier 곱 gravityModifier=0 → 자연 중력 무효 (Player gravityModifier=1 영역 영향 X·기존 동작 보존) 2. EnemyController.IsFlying bool 신규 (Inspector) - Awake 영역 IsFlying=true → control.gravityModifier=0·velocity=0 - UpdatePatrol cliffCheck 영역 !IsFlying 분기 (cliff skip) - Update 떨어짐 텔레포트 영역 !IsFlying 분기 (skip) 3. MonsterRandomizer.flyingFlags bool[] 신규 (Inspector·동일 length) - Awake 영역 random idx · flyingFlags[idx]=true → EnemyController.IsFlying=true 자동 set 검증 (Play 모드): - IsFlying=true 강제 set + y +3 이동 - [t=0] pos.y=0.50 · gravMod=0 - [t=3s] pos.y=0.50 (유지·떨어짐 X) · velocity=(-3.50, 0) (x patrol 이동·y 0) PD 후속: Enemy.prefab Inspector MonsterRandomizer.flyingFlags 영역 박쥐 (M002) idx 영역 true 설정 필요. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:18:06 +00:00
// PD 지시 2026-05-15 — 박쥐 선택 시 EnemyController.IsFlying=true 자동 set
if (flyingFlags != null && idx < flyingFlags.Length && flyingFlags[idx])
{
var ec = GetComponent<EnemyController>();
if (ec != null) ec.IsFlying = true;
}
}
}
}