초기 커밋: DS-전투시스템 종합분석 저장소
This commit is contained in:
2105
DS-기획_메뉴얼-전투_로직.md
Normal file
2105
DS-기획_메뉴얼-전투_로직.md
Normal file
File diff suppressed because it is too large
Load Diff
256
README.md
Normal file
256
README.md
Normal file
@ -0,0 +1,256 @@
|
||||
# DS-전투분석 저장소
|
||||
|
||||
던전 스토커즈(DungeonStalkers) 전투 시스템 종합 분석 저장소입니다.
|
||||
|
||||
## 프로젝트 개요
|
||||
|
||||
### 목적
|
||||
|
||||
본 프로젝트는 언리얼 엔진 5.5.4 기반의 던전 스토커즈 전투 시스템을 체계적으로 분석하고 문서화하여 다음 목표를 달성합니다:
|
||||
|
||||
- **밸런스 분석**: 10명 스토커의 전투 능력 비교 및 밸런스 검증
|
||||
- **시스템 문서화**: Gameplay Ability System 기반 전투 로직 상세 분석
|
||||
- **정기 모니터링**: 패치/업데이트 시 변경사항 추적 및 영향도 분석
|
||||
- **팀 공유**: 기획자, 프로그래머, QA가 공통으로 참고할 수 있는 기술 문서
|
||||
|
||||
### 분석 대상
|
||||
|
||||
- **10명의 스토커**: Hilda, Urud, Nave, Baran, Rio, Clad, Rene, Sinobu, Lian, Cazimord
|
||||
- **전투 시스템 요소**:
|
||||
- 기본 공격 타이밍 및 피해 배율
|
||||
- 스킬 시스템 (Gameplay Ability System)
|
||||
- 캔슬 메커니즘 (Activation Order Group + ANS_SkillCancel_C)
|
||||
- 애니메이션 노티파이 시스템
|
||||
- 캐릭터 스탯 및 속성
|
||||
|
||||
## 분석 방법론
|
||||
|
||||
### 1. 데이터 추출 (Unreal → JSON)
|
||||
|
||||
언리얼 에디터의 커스텀 익스포터를 사용하여 게임 에셋을 JSON 형식으로 변환합니다.
|
||||
|
||||
```
|
||||
Unreal Engine Assets → Custom Exporter → JSON Files
|
||||
```
|
||||
|
||||
**익스포트 대상**:
|
||||
- `DataTable` → DT_CharacterStat, DT_Skill, DT_CharacterAbility 등
|
||||
- `AnimMontage` → 모든 캐릭터 애니메이션 몽타주
|
||||
- `Blueprint` → GA_* (Gameplay Ability) 블루프린트
|
||||
- `CurveTable` → 각종 커브 데이터
|
||||
|
||||
**익스포트 방법**:
|
||||
1. 언리얼 에디터에서 Content Browser 열기
|
||||
2. 분석할 에셋 선택
|
||||
3. 우클릭 → `Export to JSON` (커스텀 익스포터)
|
||||
4. 출력 폴더에 JSON 파일 생성
|
||||
|
||||
### 2. LLM 기반 분석
|
||||
|
||||
생성된 JSON 파일을 Claude (LLM)에 입력하여 자동 분석합니다.
|
||||
|
||||
**분석 프로세스**:
|
||||
|
||||
```
|
||||
JSON Files → Claude Code → Analysis Document
|
||||
↓
|
||||
Python Scripts (보조 분석)
|
||||
```
|
||||
|
||||
**LLM의 역할**:
|
||||
- 대용량 JSON 데이터 파싱 및 패턴 인식
|
||||
- 스토커별 데이터 비교 분석
|
||||
- 전투 로직 추론 및 시스템 메커니즘 분석
|
||||
- Markdown 형식의 기술 문서 자동 생성
|
||||
|
||||
**장점**:
|
||||
- 수작업 대비 100배 이상 빠른 분석 속도
|
||||
- 일관된 형식의 문서 생성
|
||||
- 복잡한 크로스 레퍼런스 추적 자동화
|
||||
|
||||
### 3. 검증 및 문서화
|
||||
|
||||
분석 결과를 검토하고 최종 문서를 생성합니다.
|
||||
|
||||
## 폴더 구조
|
||||
|
||||
```
|
||||
DS-전투분석_저장소/
|
||||
├── README.md # 본 문서
|
||||
│
|
||||
├── 분석결과/ # 분석 결과물
|
||||
│ └── 20251023/ # 날짜별 분석
|
||||
│ └── DS-전투시스템_종합분석.md
|
||||
│
|
||||
├── 원본데이터/ # JSON 원본 데이터 (샘플)
|
||||
│ └── 20251023/
|
||||
│ ├── 샘플_DataTable.json
|
||||
│ ├── 샘플_AnimMontage.json
|
||||
│ └── 샘플_Blueprint.json
|
||||
│
|
||||
└── 분석도구/ # Python 분석 스크립트
|
||||
├── extract_skill_cancel_windows.py
|
||||
├── analyze_character_stats.py
|
||||
└── extract_activation_order_groups.py
|
||||
```
|
||||
|
||||
## 정기 분석 수행 가이드
|
||||
|
||||
새로운 분석을 수행하려면 다음 단계를 따르세요.
|
||||
|
||||
### Step 1: JSON 데이터 익스포트
|
||||
|
||||
**언리얼 에디터에서 수행**:
|
||||
|
||||
```
|
||||
1. Content Browser에서 다음 폴더들을 선택:
|
||||
- /Game/Blueprints/DataTable/
|
||||
- /Game/_Art/_Character/PC/*/AnimMontage/
|
||||
- /Game/Blueprints/Abilities/GA_Skill_*/
|
||||
|
||||
2. 우클릭 → Export to JSON
|
||||
|
||||
3. 출력 폴더 선택: DS-전투밸런스_분석자료/[오늘날짜]/
|
||||
예: DS-전투밸런스_분석자료/20251024_153000/
|
||||
|
||||
4. 익스포트 완료 확인:
|
||||
✓ DataTable.json
|
||||
✓ AnimMontage.json
|
||||
✓ Blueprint.json
|
||||
✓ CurveTable.json
|
||||
```
|
||||
|
||||
### Step 2: LLM 분석 실행
|
||||
|
||||
**Claude Code 사용**:
|
||||
|
||||
1. Claude Code CLI 실행
|
||||
2. 다음 프롬프트 입력:
|
||||
|
||||
```
|
||||
"DS-전투밸런스_분석자료/[날짜]/" 폴더의 JSON 파일들을 분석하여
|
||||
전투 시스템 종합 분석 문서를 작성해주세요.
|
||||
|
||||
분석 항목:
|
||||
- 10명 스토커별 기본 공격 타이밍 및 피해 배율
|
||||
- 스킬별 Activation Order Group 값
|
||||
- 애니메이션 캔슬 윈도우 (ANS_SkillCancel_C)
|
||||
- 캐릭터 스탯 비교
|
||||
|
||||
이전 분석 문서를 참고하여 동일한 형식으로 작성하고,
|
||||
변경사항이 있다면 별도로 표시해주세요.
|
||||
```
|
||||
|
||||
3. 생성된 문서를 검토하고 수정
|
||||
|
||||
### Step 3: 결과 저장
|
||||
|
||||
```bash
|
||||
# 새 폴더 생성
|
||||
mkdir -p 분석결과/[날짜]
|
||||
|
||||
# 분석 문서 저장
|
||||
# Claude가 생성한 문서를 분석결과/[날짜]/DS-전투시스템_종합분석.md로 저장
|
||||
|
||||
# (선택) 원본 JSON 샘플 저장
|
||||
# 주요 에셋 몇 개만 추출하여 원본데이터/[날짜]/에 저장
|
||||
```
|
||||
|
||||
### Step 4: 변경사항 추적
|
||||
|
||||
**이전 분석과 비교**:
|
||||
|
||||
```bash
|
||||
# diff 도구로 변경 확인
|
||||
diff 분석결과/20251023/DS-전투시스템_종합분석.md \
|
||||
분석결과/20251024/DS-전투시스템_종합분석.md
|
||||
```
|
||||
|
||||
**주요 확인 사항**:
|
||||
- ActivationOrderGroup 변경 (밸런스 조정)
|
||||
- 기본 공격 타이밍 변경 (애니메이션 수정)
|
||||
- AddNormalAttackPer 변경 (피해 배율 조정)
|
||||
- 새로운 스킬 추가/삭제
|
||||
|
||||
## 분석 도구 사용법
|
||||
|
||||
### 1. 스킬 캔슬 윈도우 추출
|
||||
|
||||
```bash
|
||||
python 분석도구/extract_skill_cancel_windows.py \
|
||||
원본데이터/20251023/AnimMontage.json
|
||||
```
|
||||
|
||||
**출력 예시**:
|
||||
```
|
||||
AM_PC_Hilda_B_Skill_SwordStrike
|
||||
캔슬 구간: 1.300s ~ 1.800s (지속: 0.500s)
|
||||
```
|
||||
|
||||
### 2. 캐릭터 스탯 분석
|
||||
|
||||
```bash
|
||||
python 분석도구/analyze_character_stats.py \
|
||||
원본데이터/20251023/DataTable.json
|
||||
```
|
||||
|
||||
**출력 예시**:
|
||||
```
|
||||
이름 직업 STR DEX INT CON WIS
|
||||
힐다 전사 20 15 10 20 10
|
||||
우르드 원거리 15 20 10 15 15
|
||||
```
|
||||
|
||||
### 3. Activation Order Group 추출
|
||||
|
||||
```bash
|
||||
python 분석도구/extract_activation_order_groups.py \
|
||||
원본데이터/20251023/Blueprint.json
|
||||
```
|
||||
|
||||
**출력 예시**:
|
||||
```
|
||||
Hilda:
|
||||
Group 4: Bash, SwordStrike
|
||||
Group 0: BloodMoon_Active, SteelBlocking
|
||||
```
|
||||
|
||||
## 최신 분석 결과
|
||||
|
||||
**날짜**: 2025-10-23
|
||||
**분석 문서**: [분석결과/20251023/DS-전투시스템_종합분석.md](분석결과/20251023/DS-전투시스템_종합분석.md)
|
||||
|
||||
**주요 발견**:
|
||||
- **공격 속도 1위**: Rio (3.867s)
|
||||
- **가장 높은 피해**: Baran, Clad (평타 +30~50%)
|
||||
- **궁극기 보유**: Nave, Baran, Sinobu, Cazimord (4명만)
|
||||
- **가장 다양한 우선순위**: Cazimord (Group 0, 2, 3, 4, 9 모두 사용)
|
||||
|
||||
## 기술 스택
|
||||
|
||||
- **게임 엔진**: Unreal Engine 5.5.4
|
||||
- **에셋 익스포터**: Custom Unreal Editor Plugin
|
||||
- **분석 LLM**: Claude 3.5 Sonnet (Claude Code)
|
||||
- **보조 분석**: Python 3.x
|
||||
- **문서 형식**: Markdown
|
||||
|
||||
## 참고 자료
|
||||
|
||||
### 내부 문서
|
||||
- [DS-전투시스템_종합분석.md](분석결과/20251023/DS-전투시스템_종합분석.md) - 최신 분석 결과
|
||||
- [CLAUDE.md](../CLAUDE.md) - 프로젝트 전체 개요
|
||||
|
||||
### 외부 참고
|
||||
- [Unreal Engine Gameplay Ability System](https://docs.unrealengine.com/5.5/en-US/gameplay-ability-system-for-unreal-engine/)
|
||||
- [Animation Notify System](https://docs.unrealengine.com/5.5/en-US/animation-notifies-in-unreal-engine/)
|
||||
|
||||
## 팀원 기여
|
||||
|
||||
분석 결과에 피드백이나 추가 분석 요청이 있으시면:
|
||||
1. 이슈 등록 (Git Issue)
|
||||
2. 또는 디스코드 공식 커뮤니티에 공유
|
||||
|
||||
---
|
||||
|
||||
**마지막 업데이트**: 2025-10-23
|
||||
**담당자**: AI-assisted Analysis Team
|
||||
2017
분석결과/20251023/DS-전투시스템_종합분석.md
Normal file
2017
분석결과/20251023/DS-전투시스템_종합분석.md
Normal file
File diff suppressed because it is too large
Load Diff
107
분석도구/analyze_character_stats.py
Normal file
107
분석도구/analyze_character_stats.py
Normal file
@ -0,0 +1,107 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
캐릭터 스탯 분석 스크립트
|
||||
|
||||
DT_CharacterStat 테이블에서 스토커들의 기본 스탯을 추출하고 비교 분석합니다.
|
||||
|
||||
사용법:
|
||||
python analyze_character_stats.py <DataTable.json 경로>
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def find_character_stat_table(datatables):
|
||||
"""DT_CharacterStat 테이블 찾기"""
|
||||
for dt in datatables:
|
||||
if dt.get('AssetName') == 'DT_CharacterStat':
|
||||
return dt
|
||||
return None
|
||||
|
||||
|
||||
def analyze_stats(json_path):
|
||||
"""캐릭터 스탯 분석"""
|
||||
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
datatables = json.load(f)
|
||||
|
||||
char_stat_table = find_character_stat_table(datatables)
|
||||
|
||||
if not char_stat_table:
|
||||
print("오류: DT_CharacterStat 테이블을 찾을 수 없습니다.")
|
||||
return
|
||||
|
||||
stalkers = []
|
||||
|
||||
for row in char_stat_table.get('Rows', []):
|
||||
data = row['Data']
|
||||
stalker_info = {
|
||||
'id': row['RowName'],
|
||||
'name': data.get('name', ''),
|
||||
'job': data.get('jobName', ''),
|
||||
'str': data.get('str', 0),
|
||||
'dex': data.get('dex', 0),
|
||||
'int': data.get('int', 0),
|
||||
'con': data.get('con', 0),
|
||||
'wis': data.get('wis', 0),
|
||||
'hp': data.get('hP', 0),
|
||||
'mp': data.get('mP', 0)
|
||||
}
|
||||
stalkers.append(stalker_info)
|
||||
|
||||
return stalkers
|
||||
|
||||
|
||||
def print_stat_table(stalkers):
|
||||
"""스탯 테이블 출력"""
|
||||
print("\n스토커별 기본 스탯")
|
||||
print("=" * 100)
|
||||
print(f"{'이름':<10} {'직업':<10} {'STR':>5} {'DEX':>5} {'INT':>5} {'CON':>5} {'WIS':>5} {'HP':>5} {'MP':>5}")
|
||||
print("-" * 100)
|
||||
|
||||
for s in stalkers:
|
||||
print(f"{s['name']:<10} {s['job']:<10} {s['str']:>5} {s['dex']:>5} {s['int']:>5} {s['con']:>5} {s['wis']:>5} {s['hp']:>5} {s['mp']:>5}")
|
||||
|
||||
|
||||
def print_stat_rankings(stalkers):
|
||||
"""스탯별 랭킹 출력"""
|
||||
print("\n\n스탯별 랭킹")
|
||||
print("=" * 100)
|
||||
|
||||
stats = ['str', 'dex', 'int', 'con', 'wis']
|
||||
stat_names = {'str': 'STR', 'dex': 'DEX', 'int': 'INT', 'con': 'CON', 'wis': 'WIS'}
|
||||
|
||||
for stat in stats:
|
||||
sorted_stalkers = sorted(stalkers, key=lambda x: x[stat], reverse=True)
|
||||
top3 = sorted_stalkers[:3]
|
||||
|
||||
print(f"\n{stat_names[stat]} 순위:")
|
||||
for i, s in enumerate(top3, 1):
|
||||
print(f" {i}위: {s['name']} ({s[stat]})")
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("사용법: python analyze_character_stats.py <DataTable.json 경로>")
|
||||
sys.exit(1)
|
||||
|
||||
json_path = Path(sys.argv[1])
|
||||
|
||||
if not json_path.exists():
|
||||
print(f"오류: 파일을 찾을 수 없습니다: {json_path}")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"분석 중: {json_path}")
|
||||
|
||||
stalkers = analyze_stats(json_path)
|
||||
|
||||
if stalkers:
|
||||
print(f"\n총 {len(stalkers)}명의 스토커 발견")
|
||||
print_stat_table(stalkers)
|
||||
print_stat_rankings(stalkers)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
115
분석도구/extract_activation_order_groups.py
Normal file
115
분석도구/extract_activation_order_groups.py
Normal file
@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Activation Order Group 추출 스크립트
|
||||
|
||||
Blueprint.json에서 스토커별 스킬의 ActivationOrderGroup 값을 추출합니다.
|
||||
|
||||
사용법:
|
||||
python extract_activation_order_groups.py <Blueprint.json 경로>
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
def extract_activation_order_groups(json_path):
|
||||
"""Blueprint.json에서 ActivationOrderGroup 추출"""
|
||||
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
blueprints = json.load(f)
|
||||
|
||||
# 스토커별 스킬 그룹화
|
||||
stalker_skills = defaultdict(list)
|
||||
|
||||
stalkers = ['Hilda', 'Urud', 'Nave', 'Baran', 'Rio', 'Clad', 'Rene', 'Sinobu', 'Lian', 'Cazimord']
|
||||
|
||||
for bp in blueprints:
|
||||
asset_name = bp.get('AssetName', '')
|
||||
|
||||
# GA_Skill_{Stalker}_ 패턴 찾기
|
||||
if asset_name.startswith('GA_Skill_'):
|
||||
for stalker in stalkers:
|
||||
if f'_{stalker}_' in asset_name:
|
||||
# ActivationOrderGroup 찾기
|
||||
activation_order = None
|
||||
for var in bp.get('Variables', []):
|
||||
if var.get('Name') == 'ActivationOrderGroup':
|
||||
activation_order = var.get('DefaultValue', '0')
|
||||
break
|
||||
|
||||
skill_name = asset_name.replace(f'GA_Skill_{stalker}_', '')
|
||||
|
||||
stalker_skills[stalker].append({
|
||||
'skill': skill_name,
|
||||
'order_group': int(activation_order) if activation_order else 0,
|
||||
'full_name': asset_name
|
||||
})
|
||||
|
||||
return stalker_skills
|
||||
|
||||
|
||||
def print_stalker_skills(stalker_skills):
|
||||
"""스토커별 스킬과 ActivationOrderGroup 출력"""
|
||||
|
||||
print("\n스토커별 Activation Order Group")
|
||||
print("=" * 100)
|
||||
|
||||
for stalker, skills in sorted(stalker_skills.items()):
|
||||
print(f"\n{stalker}:")
|
||||
|
||||
# Order Group별로 정렬
|
||||
skills_by_group = defaultdict(list)
|
||||
for skill in skills:
|
||||
skills_by_group[skill['order_group']].append(skill['skill'])
|
||||
|
||||
for group in sorted(skills_by_group.keys(), reverse=True):
|
||||
print(f" Group {group}: {', '.join(sorted(skills_by_group[group]))}")
|
||||
|
||||
|
||||
def print_statistics(stalker_skills):
|
||||
"""통계 정보 출력"""
|
||||
|
||||
print("\n\n통계")
|
||||
print("=" * 100)
|
||||
|
||||
# 각 Group별 사용 빈도
|
||||
group_count = defaultdict(int)
|
||||
for stalker, skills in stalker_skills.items():
|
||||
for skill in skills:
|
||||
group_count[skill['order_group']] += 1
|
||||
|
||||
print("\nGroup별 스킬 수:")
|
||||
for group in sorted(group_count.keys(), reverse=True):
|
||||
print(f" Group {group}: {group_count[group]}개")
|
||||
|
||||
# 스토커별 스킬 수
|
||||
print("\n스토커별 스킬 수:")
|
||||
for stalker, skills in sorted(stalker_skills.items(), key=lambda x: len(x[1]), reverse=True):
|
||||
print(f" {stalker}: {len(skills)}개")
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("사용법: python extract_activation_order_groups.py <Blueprint.json 경로>")
|
||||
sys.exit(1)
|
||||
|
||||
json_path = Path(sys.argv[1])
|
||||
|
||||
if not json_path.exists():
|
||||
print(f"오류: 파일을 찾을 수 없습니다: {json_path}")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"분석 중: {json_path}")
|
||||
|
||||
stalker_skills = extract_activation_order_groups(json_path)
|
||||
|
||||
print(f"\n총 {sum(len(skills) for skills in stalker_skills.values())}개의 스킬 발견")
|
||||
|
||||
print_stalker_skills(stalker_skills)
|
||||
print_statistics(stalker_skills)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
69
분석도구/extract_skill_cancel_windows.py
Normal file
69
분석도구/extract_skill_cancel_windows.py
Normal file
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
스킬 캔슬 윈도우 추출 스크립트
|
||||
|
||||
AnimMontage.json에서 ANS_SkillCancel_C 노티파이를 가진 몽타주를 찾아
|
||||
캔슬 가능 시간 구간을 추출합니다.
|
||||
|
||||
사용법:
|
||||
python extract_skill_cancel_windows.py <AnimMontage.json 경로>
|
||||
"""
|
||||
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def extract_cancel_windows(json_path):
|
||||
"""AnimMontage.json에서 스킬 캔슬 윈도우 추출"""
|
||||
|
||||
with open(json_path, 'r', encoding='utf-8') as f:
|
||||
montages = json.load(f)
|
||||
|
||||
cancel_montages = []
|
||||
|
||||
for montage in montages:
|
||||
asset_name = montage.get('AssetName', '')
|
||||
|
||||
# ANS_SkillCancel_C 노티파이 찾기
|
||||
for notify in montage.get('AnimNotifies', []):
|
||||
if notify.get('NotifyStateClass') == 'ANS_SkillCancel_C':
|
||||
trigger_time = notify['TriggerTime']
|
||||
duration = notify['Duration']
|
||||
|
||||
cancel_montages.append({
|
||||
'montage': asset_name,
|
||||
'start': trigger_time,
|
||||
'end': trigger_time + duration,
|
||||
'duration': duration
|
||||
})
|
||||
|
||||
return cancel_montages
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("사용법: python extract_skill_cancel_windows.py <AnimMontage.json 경로>")
|
||||
sys.exit(1)
|
||||
|
||||
json_path = Path(sys.argv[1])
|
||||
|
||||
if not json_path.exists():
|
||||
print(f"오류: 파일을 찾을 수 없습니다: {json_path}")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"분석 중: {json_path}")
|
||||
print("-" * 80)
|
||||
|
||||
cancel_windows = extract_cancel_windows(json_path)
|
||||
|
||||
print(f"\n총 {len(cancel_windows)}개의 스킬 캔슬 윈도우 발견\n")
|
||||
|
||||
for item in cancel_windows:
|
||||
print(f"{item['montage']}")
|
||||
print(f" 캔슬 구간: {item['start']:.3f}s ~ {item['end']:.3f}s (지속: {item['duration']:.3f}s)")
|
||||
print()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
74
원본데이터/20251023/샘플_AnimMontage.json
Normal file
74
원본데이터/20251023/샘플_AnimMontage.json
Normal file
@ -0,0 +1,74 @@
|
||||
[
|
||||
{
|
||||
"AssetName": "AM_PC_Hilda_B_Attack_W01_01",
|
||||
"AssetPath": "/Game/_Art/_Character/PC/Hilda/AnimMontage/Base/AM_PC_Hilda_B_Attack_W01_01.AM_PC_Hilda_B_Attack_W01_01",
|
||||
"SequenceLength": 1.6000000238418579,
|
||||
"RateScale": 1,
|
||||
"Sections": [
|
||||
{
|
||||
"SectionName": "Default",
|
||||
"StartTime": 0,
|
||||
"NextSectionName": "None"
|
||||
}
|
||||
],
|
||||
"NumSections": 1,
|
||||
"SlotAnimTracks": [
|
||||
{
|
||||
"SlotName": "DefaultSlot",
|
||||
"AnimSegments": [
|
||||
{
|
||||
"AnimReference": "Ani_PC_Hilda_Base_B_Attack_W01_01",
|
||||
"AnimPath": "/Game/_Art/_Character/PC/Hilda/Animations/Base/Ani_PC_Hilda_Base_B_Attack_W01_01.Ani_PC_Hilda_Base_B_Attack_W01_01",
|
||||
"StartPos": 0,
|
||||
"AnimStartTime": 0,
|
||||
"AnimEndTime": 1.6000000238418579,
|
||||
"AnimPlayRate": 1,
|
||||
"LoopingCount": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"AnimNotifies": [
|
||||
{
|
||||
"NotifyName": "ANS_AttackBlock_C",
|
||||
"TriggerTime": 0,
|
||||
"Duration": 0.80000001192092896,
|
||||
"NotifyType": "NotifyState",
|
||||
"NotifyStateClass": "ANS_AttackState_C",
|
||||
"CustomProperties": {
|
||||
"AddGameplayTags": "(GameplayTags=((TagName=\"Ability.BlockGroup.SubAttack\"),(TagName=\"Character.State.Attack\")))",
|
||||
"AttackMoveSpeedEffect": "/Script/Engine.BlueprintGeneratedClass'/Game/Blueprints/Abilities/GE_AttackingWalkSpeedDown.GE_AttackingWalkSpeedDown_C'",
|
||||
"AddNormalAttackPer": "30.000000",
|
||||
"AddPhysicalAttackPer": "",
|
||||
"NotifyColor": "(B=200,G=198,R=202,A=255)",
|
||||
"bShouldFireInEditor": "True"
|
||||
},
|
||||
"IsBranchingPoint": true
|
||||
},
|
||||
{
|
||||
"NotifyName": "AttackWithEquip",
|
||||
"TriggerTime": 0.73333334922790527,
|
||||
"Duration": 0.13333334028720856,
|
||||
"NotifyType": "NotifyState",
|
||||
"NotifyStateClass": "AnimNotifyState_AttackWithEquip",
|
||||
"CustomProperties": {
|
||||
"AttackTag": "(TagName=\"Event.Attack.Normal\")",
|
||||
"PreviewNS": "/Game/_Art/FX/Effects/Common/NS_Hit_DirectionalE001.NS_Hit_DirectionalE001",
|
||||
"bUseEffectNormal": "True",
|
||||
"EffectNormal": "(X=0.000000,Y=-1.500000,Z=-1.000000)",
|
||||
"SocketName": "socket_R_Weapon",
|
||||
"bSendShotEventToActor": "True",
|
||||
"NotifyColor": "(B=111,G=0,R=255,A=255)",
|
||||
"bShouldFireInEditor": "True"
|
||||
},
|
||||
"IsBranchingPoint": true
|
||||
}
|
||||
],
|
||||
"BlendInTime": 0.25,
|
||||
"BlendOutTime": 0.25,
|
||||
"BlendOutTriggerTime": -1,
|
||||
"BlendModeIn": "Standard",
|
||||
"BlendModeOut": "Standard",
|
||||
"Notes": "샘플: Hilda 기본 공격 1타 몽타주 (주요 Notify만 포함, 구조 참고용)"
|
||||
}
|
||||
]
|
||||
77
원본데이터/20251023/샘플_Blueprint.json
Normal file
77
원본데이터/20251023/샘플_Blueprint.json
Normal file
@ -0,0 +1,77 @@
|
||||
[
|
||||
{
|
||||
"AssetName": "GA_Skill_Hilda_SwordStrike",
|
||||
"ParentClass": "GA_Skill_Knight_LeapAttack_C",
|
||||
"Variables": [
|
||||
{
|
||||
"Name": "bActiveOnGive",
|
||||
"Type": "bool",
|
||||
"DefaultValue": "False",
|
||||
"IsEditable": true,
|
||||
"IsBlueprintVisible": false,
|
||||
"IsBlueprintReadOnly": false,
|
||||
"IsEditDefaultsOnly": true,
|
||||
"CategoryName": "WorldStalker",
|
||||
"Source": "C++ParentClass",
|
||||
"OwnerClass": "WSGameplayAbility"
|
||||
},
|
||||
{
|
||||
"Name": "ActivationOrderGroup",
|
||||
"Type": "uint8",
|
||||
"DefaultValue": "4",
|
||||
"IsEditable": true,
|
||||
"IsBlueprintVisible": false,
|
||||
"IsBlueprintReadOnly": false,
|
||||
"IsEditDefaultsOnly": true,
|
||||
"CategoryName": "WorldStalker",
|
||||
"Source": "C++ParentClass",
|
||||
"OwnerClass": "WSGameplayAbility"
|
||||
},
|
||||
{
|
||||
"Name": "AttackEffectClass",
|
||||
"Type": "TSoftClassPtr<UGameplayEffect> ",
|
||||
"DefaultValue": "/Game/Blueprints/Abilities/GE_Attack_Ability.GE_Attack_Ability_C",
|
||||
"IsEditable": true,
|
||||
"IsBlueprintVisible": false,
|
||||
"IsBlueprintReadOnly": false,
|
||||
"IsEditDefaultsOnly": true,
|
||||
"CategoryName": "WorldStalker",
|
||||
"Source": "C++ParentClass",
|
||||
"OwnerClass": "WSGameplayAbility"
|
||||
},
|
||||
{
|
||||
"Name": "ManaCostEffectClass",
|
||||
"Type": "TSoftClassPtr<UGameplayEffect> ",
|
||||
"DefaultValue": "/Game/Blueprints/Abilities/GE_Skill_ManaCost.GE_Skill_ManaCost_C",
|
||||
"IsEditable": true,
|
||||
"IsBlueprintVisible": false,
|
||||
"IsBlueprintReadOnly": false,
|
||||
"IsEditDefaultsOnly": true,
|
||||
"CategoryName": "WorldStalker",
|
||||
"Source": "C++ParentClass",
|
||||
"OwnerClass": "WSGameplayAbility"
|
||||
},
|
||||
{
|
||||
"Name": "CoolTimeEffectClass",
|
||||
"Type": "TSoftClassPtr<UGameplayEffect> ",
|
||||
"DefaultValue": "/Game/Blueprints/Abilities/GE_Skill_CoolTime.GE_Skill_CoolTime_C",
|
||||
"IsEditable": true,
|
||||
"IsBlueprintVisible": false,
|
||||
"IsBlueprintReadOnly": false,
|
||||
"IsEditDefaultsOnly": true,
|
||||
"CategoryName": "WorldStalker",
|
||||
"Source": "C++ParentClass",
|
||||
"OwnerClass": "WSGameplayAbility"
|
||||
}
|
||||
],
|
||||
"EventGraphs": [
|
||||
{
|
||||
"GraphName": "EventGraph",
|
||||
"Nodes": [
|
||||
"(예시) 실제로는 수십~수백 개의 노드가 포함됨"
|
||||
]
|
||||
}
|
||||
],
|
||||
"Notes": "샘플: Hilda SwordStrike 스킬 Blueprint (주요 Variables만 포함, 구조 참고용)"
|
||||
}
|
||||
]
|
||||
67
원본데이터/20251023/샘플_DataTable.json
Normal file
67
원본데이터/20251023/샘플_DataTable.json
Normal file
@ -0,0 +1,67 @@
|
||||
[
|
||||
{
|
||||
"AssetName": "DT_CharacterStat",
|
||||
"AssetPath": "/Game/Blueprints/DataTable/DT_CharacterStat.DT_CharacterStat",
|
||||
"RowStructure": "CharacterStatData",
|
||||
"Rows": [
|
||||
{
|
||||
"RowName": "hilda",
|
||||
"Data": {
|
||||
"name": "힐다",
|
||||
"jobName": "전사",
|
||||
"capsuleRadius": 34,
|
||||
"str": 20,
|
||||
"dex": 15,
|
||||
"int": 10,
|
||||
"con": 20,
|
||||
"wis": 10,
|
||||
"hP": 100,
|
||||
"mP": 50,
|
||||
"manaRegen": 0.20000000298023224,
|
||||
"stamina": 100,
|
||||
"physicalDamage": 0,
|
||||
"magicalDamage": 0,
|
||||
"criticalPer": 5,
|
||||
"criticalDamage": 0,
|
||||
"backAttackDamage": 0,
|
||||
"defense": 0,
|
||||
"physicalResistancePer": 0,
|
||||
"rangedResistancePer": 0,
|
||||
"magicalResistancePer": 0,
|
||||
"fireResistancePer": 0,
|
||||
"poisonResistancePer": 0,
|
||||
"waterResistancePer": 0,
|
||||
"lightningResistancePer": 0,
|
||||
"holyResistancePer": 0,
|
||||
"darkResistancePer": 0,
|
||||
"dOTReduceRatePer": 0,
|
||||
"walkSpeed": 0,
|
||||
"defaultSkills": [
|
||||
"SK100201",
|
||||
"SK100202",
|
||||
"SK100204"
|
||||
],
|
||||
"subSkill": "SK100101",
|
||||
"ultimateSkill": "SK100301",
|
||||
"abilities": [],
|
||||
"tags": {
|
||||
"gameplayTags": []
|
||||
},
|
||||
"montageMap": {},
|
||||
"defaultEquip": {},
|
||||
"equipableTypes": [
|
||||
"WeaponShield",
|
||||
"Heavy",
|
||||
"Light"
|
||||
],
|
||||
"hitRadius": 170,
|
||||
"ultimatePoint": 2495,
|
||||
"breakdownMax": -1,
|
||||
"breakdownStunTime": 0,
|
||||
"breakdownResetTime": 0
|
||||
}
|
||||
}
|
||||
],
|
||||
"Notes": "샘플: Hilda 스토커 기본 스탯 데이터 (구조 참고용)"
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user