Compare commits

...

107 Commits

Author SHA1 Message Date
7fc457a384 적 공격 애니메이션 타이밍 조정 및 무기 장착
기타 누락되었던 프리팹 수정 사항 모두 반영
2026-02-27 19:07:27 +09:00
8093cca251 전장의 안개가 비활성화 되어 있을 때 적이 보이지 않는 문제 수정 2026-02-27 14:34:29 +09:00
c34b9df4f7 팀 체력 UI 2026-02-27 14:19:07 +09:00
BoyongHwang
3aa43bfd20 Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-26 03:18:35 +09:00
BoyongHwang
5284ffc153 팀 정보 HUD 추가
- GameMain > UI > Canvas > TeamCardsRoot > Slot_1 ~ 4
- TeamCard_Large, Small prefab 추가
- https://www.notion.so/HUD-31294d45b1a38099bdcbc63cf9e5279e?source=copy_link
2026-02-26 03:18:28 +09:00
20167a8a52 입력 못받는 버그 추가 수정 및 입력 로직 강제 복구 로직 추가 2026-02-26 01:37:25 +09:00
9951aa98b2 입력 시스템 개선
각자의 입력 처리 로직을 갖지 않고 NetworkPlayerController로부터 받아서 쓰도록 함
2026-02-26 01:20:23 +09:00
600f35ae8f 기본 배치 건물이 시야를 제공하도록 변경 2026-02-26 00:37:38 +09:00
a4eae438de 클라이언트에서 캠프 처치 없이도 ResourcePickup이 보이는 문제 수정 2026-02-25 23:52:13 +09:00
72fe5e5b04 Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-25 23:35:25 +09:00
93d326e692 클라이언트에서 밝혀지지 않은 곳의 적이 보이는 문제 수정 2026-02-25 23:35:18 +09:00
BoyongHwang
863e98a53f Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-25 23:28:14 +09:00
BoyongHwang
a979013b73 260225 플레이 테스트 이후 밸런스 수정
- 타워 비용 증가
- 유닛 속도 감소
- 플레이어 캐퍼시티 감소
2026-02-25 23:28:03 +09:00
9c6a9910cb 클라이언트에서 건설모드를 진입할 수 없는 문제 수정 2026-02-25 22:23:59 +09:00
b3a9823f49 어그로 시스템 관련 오류 수정
순회 중 순회 대상을 수정해서 발생한 문제
순회와 수정을 분리함
2026-02-25 22:14:33 +09:00
0a2119a548 팀원들 모두가 시야를 공유하도록 함 2026-02-25 21:45:06 +09:00
23429ec096 클라이언트의 이동속도가 2배인 문제 수정
로컬 컨트롤러를 제거하고 네트워크 컨트롤러만 남겨둠
2026-02-25 21:40:50 +09:00
2f7eac05ce 클라이언트에게 시야 정보가 공유되지 않는 문제 수정 2026-02-25 21:26:11 +09:00
9a010524f2 Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-25 21:13:14 +09:00
34ab12a093 추격 포기로 인한 복귀 시, 복귀하는 동안 무적 상태 + 체력 전체 회복 2026-02-25 21:13:06 +09:00
BoyongHwang
1c77c5d9cd 크립 사거리 스펙 수정
- 일반 사거리 1
- 원거리 사거리 4
2026-02-25 21:11:04 +09:00
d066290607 플레이어 체력 자연 회복 기능 추가
전투 상태 감지 기능
player stat으로 관리 가능
2026-02-25 21:09:19 +09:00
a27a59d176 적 AI에 어그로 시스템 추가 2026-02-25 21:00:51 +09:00
6ecf799d18 크립 캠프 내 모든 크립이 한번에 플레이어를 인식하도록 변경 2026-02-25 20:50:34 +09:00
e93ef2111c Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-25 18:56:30 +09:00
3d2a9071bc 건물 업그레이드 기능 2026-02-25 18:56:26 +09:00
BoyongHwang
a99a7c192d Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-25 17:43:38 +09:00
BoyongHwang
d79f6c6218 크립 스펙 수정 및 크립 2 추가 2026-02-25 17:43:25 +09:00
0828bb214f enemy의 이동 가속을 높이고, 공격 대상의 표면으로부터 거리 검사를 하도록 함
미끄러지는 현상 감소
코어 앞에서 코어를 못 찾는 문제 수정
2026-02-25 17:26:03 +09:00
84f4020d47 enemy AI의 공격도 애니메이션 이벤트로 타이밍을 제어하도록 함 2026-02-25 17:00:31 +09:00
979f2402c7 타워 이외의 건물을 건설할 수 없는 문제 수정
Lv1만 보이게 하면서, 보이는 index와 실제 index가 달라져서 발생
2026-02-25 16:38:31 +09:00
9fd45ec5e9 사망 시 사망 UI 출력 2026-02-25 16:18:57 +09:00
BoyongHwang
8fd6ab652b large용 애니메이션컨트롤러 override 추가
- 테스트중
2026-02-25 16:05:34 +09:00
BoyongHwang
8ff1ba1a22 크립 체력 20=>100 수정 2026-02-25 16:05:13 +09:00
0d06c6a2d3 클로드 관련 데이터가 git에 포함되지 않도록 함 2026-02-25 15:34:56 +09:00
9b40721b84 멀티플레이에서 플레이어가 공격 시, 데미지가 플레이어 수만큼 곱해지는 문제 수정 2026-02-25 15:34:02 +09:00
75d2ef8dd0 사망 시 체력바가 사라지지 않는 문제 수정 2026-02-25 15:30:57 +09:00
4804e78951 사망 시 이동, 액션, 인터랙션 금지 2026-02-25 15:29:21 +09:00
17b3cf6746 체력바 추가
플레이어는 상시 표시, 나머지는 체력 변경 시 표시
2026-02-25 15:15:29 +09:00
f3923079a4 건설 모드에서 클릭이 잘 작동하지 않는 문제 수정
건설 모드 UI가 클릭되어 건설되지 않는 문제 수정
JMO Asset 위치 조정
Tower, Monster, Creep의 Hit/Destroy FX Prefab 설정 (Template Level)
Tower에 체력바 추가 (최초 건설 시, 체력 변경 시 등장)
Tower 관련 디버깅 로그 정리
건설 토대의 사이즈가 비정상적인 문제 수정
2026-02-25 01:41:58 +09:00
BoyongHwang
3dabf9f9a4 이펙트 라이트 링 제거
- Point Light OFF 처리
2026-02-24 16:59:54 +09:00
BoyongHwang
e4865c725a Hit/Death JMO Asset 적용 2026-02-24 16:48:36 +09:00
BoyongHwang
c75e2c7f3c JMO Asset 추가 2026-02-24 16:36:39 +09:00
98d071480c 적과 타워가 서로 공격하지 않는 문제 수정 2026-02-24 16:08:35 +09:00
BoyongHwang
907e2e24c8 웨이브 난이도 곡선 수정
- InitialCost: 4=>5
- costIncreaseRate: 10=>12%
2026-02-24 15:05:01 +09:00
BoyongHwang
0db8bbf9a7 타워/크립 밸런스 수정
- 체력, 데미지, 시야, 사정거리 수정
- 크립 체력, 데미지 하향 조정
2026-02-24 15:04:22 +09:00
BoyongHwang
194bde37ec 업그레이드 팝업 폴리싱
- 레이아웃 수정 및 아이콘 추가
2026-02-23 20:35:16 +09:00
BoyongHwang
363bdcf992 한글 ㅁㅁ 현상 수정
- SDF 아틀라스 다시 생성 (Custom Range : 32-126,44032-55203,12593-12643,9200-9900)
2026-02-23 18:06:05 +09:00
BoyongHwang
96d901a869 UpgradeListItem Pretendard SDF 적용
- 누락
2026-02-23 17:34:02 +09:00
BoyongHwang
8f55cb212a Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-23 17:31:21 +09:00
BoyongHwang
51b0be2ee3 업그레이드 UI 1열종대 수정
- 박스 범위 수정
- 스크롤바 추가
2026-02-23 17:31:15 +09:00
9e2a950281 업그레이드를 위한 클릭 시, 공격이 나가지 않도록 함 2026-02-23 17:04:20 +09:00
e841438997 대장간을 이용한 업그레이드 기능 추가 2026-02-23 16:55:32 +09:00
BoyongHwang
840ddc1c2c 사망 시 리스폰 안내 팝업 UI 추가
- 리소스, 프리팹, UI 전용 스크립트(RespawnCountdownUI.cs) 추가
2026-02-23 16:19:50 +09:00
BoyongHwang
84d4eee6a1 업그레이드 팝업 폰트 수정
- Pretendard로 수정
2026-02-23 16:01:27 +09:00
BoyongHwang
78f063988b Merge branch 'main' of http://59.18.227.134:30008/dal4segno/Northbound 2026-02-23 11:58:51 +09:00
BoyongHwang
ea6098b723 업그레이드 팝업 수정
- 게임씬에서 제거
- 레이아웃 수정
2026-02-23 11:58:31 +09:00
38a6fe104c Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-23 00:22:03 +09:00
cc475bce3e 업그레이드 데이터 입력 로직 및 기능 추가
캐릭터 스탯을 PlayerStats 컴포넌트에서 모아서 관리하도록 변경
코드에서도 마찬가지
2026-02-23 00:21:44 +09:00
BoyongHwang
ac1d265291 업그레이드 팝업 2차 수정
- 팝업 전체적인 정렬 수정
2026-02-22 22:26:35 +09:00
BoyongHwang
3ea5925d78 업그레이드 팝업 1차 수정
- /UI/Upgrade 폴더 생성
- 업그레이드 리스트 팝업 프리팹 추가(팝업/리스트아이템/효과)
2026-02-22 17:59:10 +09:00
BoyongHwang
b34254137f 업그레이드 팝업 UI 더미 프리팹 추가
- 임시로 구조만 잡은 프리팹
- UpgradeListPopup : 리스트 팝업
ㄴ UpgradeListItem : 리스트 Content 한 줄
ㄴㄴ EffectRow : 효과 내용
ㄴㄴ ReqChip : 요구 조건 내용
2026-02-22 16:33:35 +09:00
BoyongHwang
ec1ff83814 Upgrade 테이블 upgradeShop 컬럼 제거
- Blacksmith로 통일
2026-02-22 15:56:23 +09:00
48fff594f0 upgradeData.cs 누락 추가 2026-02-22 15:43:44 +09:00
b2e3fb1ecf 시야 속성명 변경 대응
vision radius -> sight
2026-02-22 15:43:06 +09:00
2ac9331504 Merge branches 'main' and 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-22 15:35:15 +09:00
BoyongHwang
770512fb72 업그레이드 데이터 추가
- 스키마 json, cs 추가
- 더미 csv 데이터 추가
2026-02-22 15:31:14 +09:00
BoyongHwang
911ee24b31 GameMain BuildingManager Available Buildings 누락 2026-02-22 15:29:25 +09:00
BoyongHwang
b86e087d03 게임 데이터 수정
- Player, Tower, Monster, Creep에 Sight 컬럼 추가 (player는 visionRadius 대응 필요)
- Tower 레벨 컬럼 및 더미 데이터 추가
- 시야 전용 건물 Torch fbx 추가
2026-02-22 15:28:00 +09:00
88d81202bf 초기 자원의 품질이 랜덤으로 결정되는 문제 수정
항상 0%
2026-02-20 15:33:56 +09:00
d87a23ae4d NavMesh 누락 추가 2026-02-20 15:33:39 +09:00
4beb2fb0bb 몬스터가 코어를 제대로 공격하지 못하는 문제 수정
navMesh는 다시 이전으로 되돌림
코어의 중심이 아닌, 코어의 표면을 기준으로 공격하도록 함
2026-02-19 17:04:46 +09:00
72c2ec2884 체력이 있는 오브젝트 사망 시, 적의 인식 대상에서 해제되도록 변경 2026-02-19 16:06:01 +09:00
3ed564eaa5 자원 드랍 관련 누락된 파일 추가 2026-02-19 16:05:31 +09:00
411913520b 플레이어 사망 시, 소지 중인 모든 자원을 드랍하도록 함 2026-02-19 16:04:45 +09:00
01e7291bed 일부 건물의 테두리에 NavMesh가 깔려있지 않은 문제 수정
Collider를 없앤 후 NavMesh를 설치하여 NavMesh를 생성, 그 후에 Collider를 생성하여 빈 공간이 없도록 함
건물에 의해 갈 수 없는 공간도 갈 수 있다고 판단하게 되지만 Collider에 의해 막히기 때문에 괜찮다고 판단

추가로 적의 인지 범위를 조정함
2026-02-19 15:47:17 +09:00
dfb41b0d57 자원에 여러 일꾼이 붙을 수 있는 설정을 기본 True로 변경 2026-02-19 15:35:05 +09:00
BoyongHwang
d0b74bfbf1 리소스 UI 텍스트 넘침 수정 2026-02-19 13:50:24 +09:00
702c0b4f9e creep의 원점 회귀 로직 개선
되돌아가지 않는 문제 수정
되돌아 가는 도중에 플레이어를 다시 인식하는 문제 수정
2026-02-19 01:13:04 +09:00
4ffbbb0aff 모든 네트워크 오브젝트의 소유권을 서버가 갖도록 함
Distributable -> None
관련 사이드 이펙트로 인한 버그 수정
2026-02-18 02:18:42 +09:00
da8c87d082 NetworkConnectionHelper에 localhost client 접속 버튼 추가 2026-02-17 15:25:25 +09:00
63a742d5d4 네트워크 환경에서의 비정상 동작 수정
클라이언트 접속 전에 스폰되어 있는 오브젝트의 경우, Ownership이 Distributable일 경우 클라이언트 접속 시점에 Ownership을 호스트로부터 분배받는다.
서버만 데이터를 수정해야 하는 환경이기 때문에 대부분 Distributable 대신 None을 사용하면 된다.
2026-02-17 01:53:06 +09:00
cc2487e7e4 코드 경고 제거 및 미사용 코드 제거 2026-02-16 22:38:51 +09:00
f73c660579 디버깅용 로그 제거 2026-02-16 22:17:37 +09:00
2f624f621c 씬에 배치된 코어의 컬라이더 좌표가 이상한 문제 수정
Interact가 불가능했음.
2026-02-16 21:19:11 +09:00
7175edc1d1 업그레이드용 건물 생성 및 배치(임시) 2026-02-16 17:29:09 +09:00
2e612f21ca 플레이어 사망 애니메이션 적용
부활 시 다시 일어나기 추가
2026-02-16 17:27:05 +09:00
95db5ce4f3 크립 캠프의 모든 크립 처치 시 획득 가능한 자원이 소환되도록 함 2026-02-16 16:31:46 +09:00
3e026d3319 크립 캠프 배치 데이터 변경
크립 캠프의 일부 기능을 MapGenerator로 이동
2026-02-16 10:39:46 +09:00
a3b1b83c8d GameMain 씬 내 오브젝트 좌표 재설정
z 0~800 기준으로 정렬
2026-02-16 10:05:01 +09:00
225b076b62 타워 공격 시 공격 시점 및 대상을 알 수 있는 이펙트 추가(임시) 2026-02-16 09:52:49 +09:00
5bb8cd533e 파괴 가능 오브젝트에 대해서 피격 시 로그를 남기도록 함 2026-02-16 09:52:14 +09:00
047c115f95 Enemy의 사망 애니메이션 로직
네트워크 상에서의 동작 확인 완료
2026-02-16 00:13:25 +09:00
17457b2e7e Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-14 17:46:10 +09:00
e451d95e0e 건축모드 네트워크 환경 적용 2026-02-14 17:45:31 +09:00
BoyongHwang
25f5db2e16 플레이어/몬스터 사망 애니메이션 세팅
- bIsDeath State 추가
- Condition bIsDeath True일 때 재생
2026-02-14 00:35:48 +09:00
BoyongHwang
fb555577a2 폰트 추가 및 텍스트 사이즈 조절
- Pretendard Medium, Bold, ExtraBold ttf, SDF 추가
- 자원 UI 텍스트 가독성 개선
2026-02-13 20:44:23 +09:00
BoyongHwang
3e1754eb3c 리소스, 웨이브 밸런스 수정
- 리소스 충전량 초당 5=>3 감소
- 웨이브 코스트 4=>10 증가
2026-02-13 16:50:24 +09:00
6d0365c0db MapGenerator의 Resource 배치 x좌표 수정
0 ~ x -> -x/2 ~ x/2
2026-02-13 16:17:48 +09:00
bd17a2e7eb Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound 2026-02-13 16:17:01 +09:00
BoyongHwang
a31ed42f65 몬스터 추적 속도 수정 (탬플릿) 2026-02-13 16:09:31 +09:00
BoyongHwang
11d3dfc101 몬스터 추적 속도 수정 (*1.5 => 1) 2026-02-13 15:55:59 +09:00
6473db37eb 건설 관련 코드에서 플레이어 구분자를 하나로 통일함
ClientID, NetworkObjectId 를 혼용해서 사용하고 있었음.
2026-02-13 15:55:07 +09:00
a65ead915b Merge branch 'main' of http://192.168.10.102:30008/dal4segno/Northbound
# Conflicts:
#	Assets/Prefabs/Worker.prefab
2026-02-13 15:42:54 +09:00
925d74aa57 Worker 상호작용에 Cost 요구사항 제거 2026-02-13 15:41:47 +09:00
e2c40827bf 건물 Ghost가 다른 오브젝트와 충돌하여 밀어내지 않도록 함 2026-02-13 15:36:59 +09:00
a85f4d8fed 몬스터의 플레이어 추격 AI(임시)
코어를 향해 전진하는 도중, 사거리 내에 플레이어가 들어올 시 추격하도록 함
2026-02-13 15:31:10 +09:00
1334 changed files with 2098534 additions and 6436 deletions

View File

@@ -1,7 +0,0 @@
{
"permissions": {
"allow": [
"Bash(tree:*)"
]
}
}

2
.gitignore vendored
View File

@@ -15,3 +15,5 @@ Assets/_Recovery.meta
GameData/Backups
.claude/settings.local.json
AGENTS.md
CLAUDE.md
.claude

View File

@@ -53,7 +53,6 @@
<Compile Include="Assets\FlatKit\[Render Pipeline] URP\Water\Editor\Tooltips.cs" />
<Compile Include="Assets\Scripts\Editor\EnemyPortalEditor.cs" />
<Compile Include="Assets\Scripts\Editor\ObstacleSpawnerEditor.cs" />
<Compile Include="Assets\Scripts\Editor\QuickNetworkSetupEditor.cs" />
<Compile Include="Assets\Scripts\Editor\IPrefabSetup.cs" />
<Compile Include="Assets\FlatKit\[Render Pipeline] URP\Water\Editor\WaterEditor.cs" />
<Compile Include="Assets\Scripts\Editor\TowerPopulator.cs" />
@@ -71,6 +70,7 @@
<Compile Include="Assets\Scripts\Editor\NetworkConnectionHelperEditor.cs" />
<Compile Include="Assets\Scripts\Editor\FogOfWarVisibilitySetup.cs" />
<Compile Include="Assets\FlatKit\Shaders\Editor\MaterialPropertyExtensions.cs" />
<Compile Include="Assets\Scripts\Editor\UpgradePrefabSetup.cs" />
<Compile Include="Assets\FlatKit\Shaders\Editor\TerrainEditor.cs" />
</ItemGroup>
<ItemGroup>
@@ -1370,14 +1370,14 @@
<HintPath>Library\ScriptAssemblies\Unity.2D.Tilemap.Editor.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.InputSystem.ForUI">
<HintPath>Library\ScriptAssemblies\Unity.InputSystem.ForUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.Profiling.Core">
<HintPath>Library\ScriptAssemblies\Unity.Profiling.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.InputSystem.ForUI">
<HintPath>Library\ScriptAssemblies\Unity.InputSystem.ForUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.RenderPipelines.GPUDriven.Runtime">
<HintPath>Library\ScriptAssemblies\Unity.RenderPipelines.GPUDriven.Runtime.dll</HintPath>
<Private>False</Private>
@@ -1689,9 +1689,15 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="Assembly-CSharp.csproj" />
<ProjectReference Include="CFXR.WelcomeScreen.csproj" />
<ProjectReference Include="CFXRRuntime.csproj" />
<ProjectReference Include="Unity.RenderPipelines.Universal.Runtime.csproj" />
<ProjectReference Include="FlatKit.Utils.Editor.csproj" />
<ProjectReference Include="CFXREditor.csproj" />
<ProjectReference Include="KinoBloom.Runtime.csproj" />
<ProjectReference Include="ExternAttributes.Editor.csproj" />
<ProjectReference Include="ToonyColorsPro.Demo.Editor.csproj" />
<ProjectReference Include="CFXRDemo.csproj" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<ItemGroup>

View File

@@ -50,13 +50,14 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Assets\Scripts\NetworkManagerUI.cs" />
<Compile Include="Assets\Scripts\NetworkManagerValidator.cs" />
<Compile Include="Assets\FlatKit\Demos\[Demo] Desert\Scripts\FloatingMotion.cs" />
<Compile Include="Assets\Scripts\PlayerResourceInventory.cs" />
<Compile Include="Assets\Scripts\ITeamMember.cs" />
<Compile Include="Assets\Scripts\UI\UpgradeListItem.cs" />
<Compile Include="Assets\Scripts\EnemyUnit.cs" />
<Compile Include="Assets\Scripts\PlayerActionSystem.cs" />
<Compile Include="Assets\Scripts\BuildingQuickslotUI.cs" />
<Compile Include="Assets\Scripts\UI\UpgradeListPopup.cs" />
<Compile Include="Assets\Scripts\TeamType.cs" />
<Compile Include="Assets\Scripts\CoreResourceManager.cs" />
<Compile Include="Assets\Scripts\MapGenerator.cs" />
@@ -66,7 +67,6 @@
<Compile Include="Assets\Scripts\FogOfWarRenderer.cs" />
<Compile Include="Assets\Scripts\ResourcePickup.cs" />
<Compile Include="Assets\Scripts\PlayerVisionProvider.cs" />
<Compile Include="Assets\Scripts\PlayerController.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\Motion\OrbitMotion.cs" />
<Compile Include="Assets\Scripts\CreepCamp.cs" />
<Compile Include="Assets\Scripts\EnemyAIController.cs" />
@@ -75,32 +75,35 @@
<Compile Include="Assets\Scripts\ContinuousPortMonitor.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\PlayerData.cs" />
<Compile Include="Assets\Scripts\TeamManager.cs" />
<Compile Include="Assets\Scripts\PortListenerTestSimultaneous.cs" />
<Compile Include="Assets\Scripts\TeamGate.cs" />
<Compile Include="Assets\Scripts\Worker.cs" />
<Compile Include="Assets\Scripts\IHealthProvider.cs" />
<Compile Include="Assets\Scripts\WorkerSpawner.cs" />
<Compile Include="Assets\Scripts\Resource.cs" />
<Compile Include="Assets\Scripts\SimpleNetworkMonitor.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\UpgradeData.cs" />
<Compile Include="Assets\Scripts\UpgradeDatabase.cs" />
<Compile Include="Assets\Scripts\UI\TeamHealthUI.cs" />
<Compile Include="Assets\Scripts\AutoTargetSystem.cs" />
<Compile Include="Assets\Scripts\CreepDataComponent.cs" />
<Compile Include="Assets\Scripts\BuildingSlotButton.cs" />
<Compile Include="Assets\Scripts\PlayerStats.cs" />
<Compile Include="Assets\FlatKit\[Render Pipeline] URP\Water\Scripts\Buoyancy.cs" />
<Compile Include="Assets\Scripts\ObstacleSpawner.cs" />
<Compile Include="Assets\Scripts\UnitHealthBar.cs" />
<Compile Include="Assets\Scripts\BuildingFoundation.cs" />
<Compile Include="Assets\Scripts\AttackAction.cs" />
<Compile Include="Assets\Scripts\IInteractable.cs" />
<Compile Include="Assets\Scripts\ServerResourceManager.cs" />
<Compile Include="Assets\Scripts\QuickNetworkSetup.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\UvScroller.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\TowerDataExtensions.cs" />
<Compile Include="Assets\Scripts\GlobalTimer.cs" />
<Compile Include="Assets\InputSystem_Actions.cs" />
<Compile Include="Assets\FlatKit\Demos\[Demo] Desert\Scripts\BillboardLineRendererCircle.cs" />
<Compile Include="Assets\Scripts\BuildingHealthBar.cs" />
<Compile Include="Assets\Scripts\RespawnCountdownUI.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\CreepData.cs" />
<Compile Include="Assets\Scripts\PlayerSpawnPoint.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\AutoLoadPipelineAsset.cs" />
<Compile Include="Assets\Scripts\AutoHost.cs" />
<Compile Include="Assets\Scripts\MonsterAnimationController.cs" />
<Compile Include="Assets\Scripts\IVisionProvider.cs" />
<Compile Include="Assets\Scripts\BuildingManager.cs" />
@@ -110,7 +113,6 @@
<Compile Include="Assets\Scripts\MonsterDataComponent.cs" />
<Compile Include="Assets\Scripts\Core.cs" />
<Compile Include="Assets\Scripts\GamePortConfig.cs" />
<Compile Include="Assets\Scripts\NetworkManagerQuickTest.cs" />
<Compile Include="Assets\Scripts\EnemyPortal.cs" />
<Compile Include="Assets\FlatKit\Demos\Common\Scripts\Motion\LinearMotion.cs" />
<Compile Include="Assets\Scripts\IDamageable.cs" />
@@ -121,16 +123,17 @@
<Compile Include="Assets\Scripts\NetworkConfigDebugger.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\TowerData.cs" />
<Compile Include="Assets\Scripts\IAction.cs" />
<Compile Include="Assets\Scripts\Buildings\Blacksmith.cs" />
<Compile Include="Assets\Scripts\NetworkPlayerController.cs" />
<Compile Include="Assets\Scripts\PlayerInteraction.cs" />
<Compile Include="Assets\Scripts\FogOfWarVisibility.cs" />
<Compile Include="Assets\Scripts\InteractableModal.cs" />
<Compile Include="Assets\Scripts\NetworkResetAndRestart.cs" />
<Compile Include="Assets\Scripts\NetworkDebug.cs" />
<Compile Include="Assets\Data\Scripts\DataClasses\DefaultSettingsData.cs" />
<Compile Include="Assets\Scripts\EnemyAIState.cs" />
<Compile Include="Assets\Scripts\ShortcutNetworkStarter.cs" />
<Compile Include="Assets\Scripts\EquipmentData.cs" />
<Compile Include="Assets\Scripts\PlayerUpgradeManager.cs" />
<Compile Include="Assets\Scripts\NetworkConnectionHelper.cs" />
<Compile Include="Assets\Scripts\NetworkConnectionHandler.cs" />
</ItemGroup>
@@ -139,10 +142,12 @@
<None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile Overlay.shader" />
<None Include="Assets\TextMesh Pro\Shaders\TMP_SDF-Mobile-2-Pass.shader" />
<None Include="Assets\FlatKit\Shaders\StylizedSurface\LibraryUrp\LitForwardPass_DR.hlsl" />
<None Include="Assets\External\JMO Assets\Cartoon FX Remaster\CFXR Assets\Shaders\CFXR_SETTINGS.cginc" />
<None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap.shader" />
<None Include="Assets\FlatKit\Shaders\StylizedSurface\LibraryUrp\TerrainLitPasses_DR.hlsl" />
<None Include="Assets\FlatKit\Demos\[Demo] Desert\Shaders\CircleDecal.shader" />
<None Include="Assets\FlatKit\Demos\[Demo] Desert\Shaders\Noise\ClassicNoise3D.hlsl" />
<None Include="Assets\External\JMO Assets\Cartoon FX Remaster\CFXR Assets\Shaders\CFXR.cginc" />
<None Include="Assets\TextMesh Pro\Shaders\TMPro_Mobile.cginc" />
<None Include="Assets\FlatKit\Shaders\StylizedSurface\LibraryUrp\StylizedInput.hlsl" />
<None Include="Assets\FlatKit\Shaders\GradientSkybox\GradientSkybox.shader" />
@@ -164,6 +169,8 @@
<None Include="Assets\FlatKit\Demos\[Demo] Desert\Shaders\DesertPillar.hlsl" />
<None Include="Assets\TextMesh Pro\Shaders\TMPro_Properties.cginc" />
<None Include="Assets\TextMesh Pro\Shaders\TMPro_Surface.cginc" />
<None Include="Assets\External\JMO Assets\Cartoon FX Remaster\CFXR Prefabs\Texts\_Make your own text effect.txt" />
<None Include="Assets\External\JMO Assets\Cartoon FX Remaster\CFXR Assets\Shaders\CFXR_PASSES.cginc" />
<None Include="Assets\Shaders\FogOfWar.shader" />
<None Include="Assets\TextMesh Pro\Resources\LineBreaking Following Characters.txt" />
<None Include="Assets\External\Kaykit Adventurers Character\Characters\Animations\Animations\Rig_Large\Special\EXPERIMENTAL\Read_me.txt" />
@@ -173,6 +180,7 @@
<None Include="Assets\FlatKit\Shaders\StylizedSurface\TerrainLitAdd_DR.shader" />
<None Include="Assets\TextMesh Pro\Shaders\TMP_SDF Overlay.shader" />
<None Include="Assets\TextMesh Pro\Shaders\TMP_Bitmap-Mobile.shader" />
<None Include="Assets\External\JMO Assets\Cartoon FX Remaster\CFXR Assets\Shaders\CFXR_URP.cginc" />
<None Include="Assets\TextMesh Pro\Fonts\LiberationSans - OFL.txt" />
<None Include="Assets\FlatKit\Shaders\StylizedSurface\StylizedSurface.shader" />
<None Include="Assets\FlatKit\Shaders\LightPlane.shader" />
@@ -1410,14 +1418,14 @@
<HintPath>Library\ScriptAssemblies\Unity.2D.Tilemap.Editor.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.InputSystem.ForUI">
<HintPath>Library\ScriptAssemblies\Unity.InputSystem.ForUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.Profiling.Core">
<HintPath>Library\ScriptAssemblies\Unity.Profiling.Core.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.InputSystem.ForUI">
<HintPath>Library\ScriptAssemblies\Unity.InputSystem.ForUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Unity.RenderPipelines.GPUDriven.Runtime">
<HintPath>Library\ScriptAssemblies\Unity.RenderPipelines.GPUDriven.Runtime.dll</HintPath>
<Private>False</Private>
@@ -1728,9 +1736,15 @@
</Reference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="CFXR.WelcomeScreen.csproj" />
<ProjectReference Include="CFXRRuntime.csproj" />
<ProjectReference Include="Unity.RenderPipelines.Universal.Runtime.csproj" />
<ProjectReference Include="FlatKit.Utils.Editor.csproj" />
<ProjectReference Include="CFXREditor.csproj" />
<ProjectReference Include="KinoBloom.Runtime.csproj" />
<ProjectReference Include="ExternAttributes.Editor.csproj" />
<ProjectReference Include="ToonyColorsPro.Demo.Editor.csproj" />
<ProjectReference Include="CFXRDemo.csproj" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<ItemGroup>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5c4b0e294c51551499712a4aa2161713
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -80,6 +80,12 @@ AnimatorController:
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: Die
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -114,7 +120,7 @@ AnimatorState:
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 5005478036900451222, guid: bbfa9cc7ae2f16448b3adb4300f439e9, type: 3}
m_Motion: {fileID: 7400000, guid: 5c4b0e294c51551499712a4aa2161713, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
@@ -171,6 +177,32 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &3895323774234557799
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Death
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -1923750366902163184, guid: 2632f2cc035d62d41bca411a318fbe36, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &7310025410107308077
AnimatorStateMachine:
serializedVersion: 6
@@ -186,9 +218,13 @@ AnimatorStateMachine:
- serializedVersion: 1
m_State: {fileID: 2543178704363584614}
m_Position: {x: 390, y: 120, z: 0}
- serializedVersion: 1
m_State: {fileID: 3895323774234557799}
m_Position: {x: 390, y: 220, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions:
- {fileID: 1407797717177975804}
- {fileID: 8516396118002013951}
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
@@ -197,3 +233,28 @@ AnimatorStateMachine:
m_ExitPosition: {x: 710, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 2543178704363584614}
--- !u!1101 &8516396118002013951
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Die
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 3895323774234557799}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1

View File

@@ -0,0 +1,19 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!221 &22100000
AnimatorOverrideController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MonsterAnimationController_large
m_Controller: {fileID: 9100000, guid: 0a6254dd97e2e8a47ab5cd5c1a629717, type: 2}
m_Clips:
- m_OriginalClip: {fileID: -1923750366902163184, guid: 2632f2cc035d62d41bca411a318fbe36, type: 3}
m_OverrideClip: {fileID: 7400000, guid: df1a5739c2bbeb740bbbd5c3a4e28906, type: 2}
- m_OriginalClip: {fileID: 345275505875579249, guid: 2632f2cc035d62d41bca411a318fbe36, type: 3}
m_OverrideClip: {fileID: 7400000, guid: dd2f43caa654fa34683e02c96c7067f3, type: 2}
- m_OriginalClip: {fileID: 5005478036900451222, guid: bbfa9cc7ae2f16448b3adb4300f439e9, type: 3}
m_OverrideClip: {fileID: 7400000, guid: 69019833c251e144bbba158d4613e312, type: 2}
- m_OriginalClip: {fileID: -1640158340307531623, guid: e9bbf9eb253a2004aabc86fe90014c06, type: 3}
m_OverrideClip: {fileID: 7400000, guid: dce562c25d5792349a8702307d4ea9e3, type: 2}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c43a01f9e8c8fc246b0c2d6b1515853a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 22100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,30 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1101 &-8793749239544201940
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Revive
m_EventTreshold: 1
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -8582474753685269919}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.6875
m_HasExitTime: 1
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-8582474753685269919
AnimatorState:
serializedVersion: 6
@@ -70,6 +95,58 @@ AnimatorStateTransition:
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-6405359010994864473
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Death
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: -8793749239544201940}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -1923750366902163184, guid: 2632f2cc035d62d41bca411a318fbe36, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &-6260076695452185276
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: Die
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -6405359010994864473}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.1
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-6201445603492837203
AnimatorStateTransition:
m_ObjectHideFlags: 1
@@ -138,10 +215,14 @@ AnimatorStateMachine:
- serializedVersion: 1
m_State: {fileID: 6580572526695193822}
m_Position: {x: 70, y: -130, z: 0}
- serializedVersion: 1
m_State: {fileID: -6405359010994864473}
m_Position: {x: 530, y: -130, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions:
- {fileID: -6201445603492837203}
- {fileID: -5251586739186328965}
- {fileID: -6260076695452185276}
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
@@ -177,6 +258,18 @@ AnimatorController:
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: Die
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: Revive
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer

View File

@@ -14,12 +14,13 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.CreepData
id: 1
memo: "\uAE30\uBCF81"
moveSpeed: 5
maxHp: 100
atkRange: 3
atkDamage: 20
atkIntervalSec: 1.5
cost: 1
moveSpeed: 4
maxHp: 75
sight: 6
atkRange: 1
atkDamage: 10
atkIntervalSec: 2
cost: 2
weight: 1
modelPath: Assets/Models/PlantWarrior.fbx
modelPath: Assets/Models/PlantWarrior_With_Spear.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller

View File

@@ -0,0 +1,26 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f7bb664a82feb0e43b3c5f459ca775f7, type: 3}
m_Name: Creep2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.CreepData
id: 2
memo: "\uAE30\uBCF82"
moveSpeed: 3.5
maxHp: 50
sight: 6
atkRange: 4
atkDamage: 15
atkIntervalSec: 4
cost: 5
weight: 0.5
modelPath: Assets/Models/Rogue.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e3dc093d12ac8e94eac148cbdad689b4
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -14,12 +14,15 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 101
memo: "Grunt(\uAE30\uBCF8)"
moveSpeed: 6.7
moveSpeed: 4.5
maxHp: 75
sight: 6
atkRange: 1
atkDamage: 3
atkIntervalSec: 1.2
cost: 3
weight: 1
modelPath: Assets/Models/Skeleton_Minion.fbx
modelPath: Assets/Models/Skeleton_Minion_With_Sword.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 1
waveMax: 10

View File

@@ -14,8 +14,9 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 102
memo: "Tank(\uB290\uB9BC/\uB2E8\uB2E8)"
moveSpeed: 3.3
moveSpeed: 2.5
maxHp: 125
sight: 6
atkRange: 1
atkDamage: 4
atkIntervalSec: 1.5
@@ -23,3 +24,5 @@ MonoBehaviour:
weight: 0.5
modelPath: Assets/Models/Druid.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 3
waveMax: 15

View File

@@ -14,8 +14,9 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 103
memo: "Ranged(\uC6D0\uAC70\uB9AC/\uC57D\uD568)"
moveSpeed: 5.3
moveSpeed: 3.5
maxHp: 65
sight: 6
atkRange: 5
atkDamage: 2
atkIntervalSec: 1.4
@@ -23,3 +24,5 @@ MonoBehaviour:
weight: 0.2
modelPath: Assets/Models/Skeleton_Warrior.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 3
waveMax: 20

View File

@@ -14,8 +14,9 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 104
memo: "Fast(\uBE60\uB984/\uC57D\uD568)"
moveSpeed: 8.6
moveSpeed: 6
maxHp: 45
sight: 6
atkRange: 1
atkDamage: 2
atkIntervalSec: 1
@@ -23,3 +24,5 @@ MonoBehaviour:
weight: 0.333
modelPath: Assets/Models/Skeleton_Rogue.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 3
waveMax: 20

View File

@@ -14,8 +14,9 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.MonsterData
id: 105
memo: "Elite(\uC18C\uC218 \uC815\uC608)"
moveSpeed: 6.6
moveSpeed: 4.5
maxHp: 100
sight: 6
atkRange: 1
atkDamage: 7
atkIntervalSec: 1.3
@@ -23,3 +24,5 @@ MonoBehaviour:
weight: 0.1
modelPath: Assets/Models/Barbarian_Large.fbx
animationControllerPath: Assets/Animations/MonsterAnimationController.controller
waveMin: 5
waveMax: 20

View File

@@ -14,15 +14,19 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 1
memo: "\uD0C0\uC6CC"
buildingName:
mana: 100
manpower: 10
buildingName: Arrow Tower Lv.1
level: 1
upgradeTo: 2
towerType: attack
mana: 150
manpower: 50
sizeX: 4
sizeY: 10
sizeZ: 4
maxHp: 50
maxHp: 100
sight: 15
atkRange: 10
atkDamage: 3
atkDamage: 15
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 8512676738329978770, guid: 3f7838db2c2fc424d9bd9a0d243b43be, type: 3}

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower10
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 10
memo: "\uBCBD"
buildingName: Wall Lv.5
level: 5
upgradeTo: 0
towerType: defense
mana: 150
manpower: 50
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 110
sight: 1
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 5817331480696920731, guid: c680d37f654a3624f918970c8e7cee7a, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 06213f59024aa9f46b74b23e61a03ba8
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower11
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 11
memo: "\uC640\uB4DC"
buildingName: Ward Lv.1
level: 1
upgradeTo: 0
towerType: sight
mana: 10
manpower: 10
sizeX: 1
sizeY: 1
sizeZ: 1
maxHp: 10
sight: 5
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/torch.fbx
prefab: {fileID: 4836465544871382218, guid: 444d5b6b074d6db4dbe8fcb699ca6203, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 591be145c85809342bb41e15f86bbe5d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -13,18 +13,22 @@ MonoBehaviour:
m_Name: Tower2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 2
memo: "\uBCBD"
buildingName:
mana: 50
manpower: 5
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
memo: "\uD0C0\uC6CC"
buildingName: Arrow Tower Lv.2
level: 2
upgradeTo: 3
towerType: attack
mana: 300
manpower: 60
sizeX: 4
sizeY: 10
sizeZ: 4
maxHp: 150
sight: 15
atkRange: 15
atkDamage: 20
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 3671057791414486316, guid: ae9a9b515e1792a45887f0d967b943d6, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower3
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 3
memo: "\uD0C0\uC6CC"
buildingName: Arrow Tower Lv.3
level: 3
upgradeTo: 4
towerType: attack
mana: 450
manpower: 70
sizeX: 4
sizeY: 10
sizeZ: 4
maxHp: 200
sight: 20
atkRange: 15
atkDamage: 30
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 5178364993341969979, guid: a8163f1921c918b4db0ca25636eef8f9, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d4f93d45d6697c245b583cff180c602b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower4
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 4
memo: "\uD0C0\uC6CC"
buildingName: Arrow Tower Lv.4
level: 4
upgradeTo: 5
towerType: attack
mana: 600
manpower: 80
sizeX: 4
sizeY: 10
sizeZ: 4
maxHp: 250
sight: 25
atkRange: 20
atkDamage: 40
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 4171458273137159353, guid: 8430b50192177b8478a235db6987ae31, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8df4365a2a8ec4041a840a674c9fcdb2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower5
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 5
memo: "\uD0C0\uC6CC"
buildingName: Arrow Tower Lv.5
level: 5
upgradeTo: 0
towerType: attack
mana: 750
manpower: 100
sizeX: 4
sizeY: 10
sizeZ: 4
maxHp: 400
sight: 25
atkRange: 25
atkDamage: 50
atkIntervalSec: 2
modelPath: Assets/Models/building_tower_B_blue.fbx
prefab: {fileID: 7839175078399552227, guid: 56b0a93f2c28474419ccd3d67c2af475, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b1e7d2677a482df45a6db3185adbeb4d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower6
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 6
memo: "\uBCBD"
buildingName: Wall Lv.1
level: 1
upgradeTo: 7
towerType: defense
mana: 10
manpower: 10
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 30
sight: 1
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 164713662324750716, guid: 667453ec7fc252240b7de7512cb575c5, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 347d5d19570d2314095c974067ccc481
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower7
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 7
memo: "\uBCBD"
buildingName: Wall Lv.2
level: 2
upgradeTo: 8
towerType: defense
mana: 30
manpower: 20
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 50
sight: 1
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 7542015048609582274, guid: bc3e47c18fbc0fb48bccecfb984ccc1b, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 69d45810fe4341b4597d5ced3b60af50
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower8
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 8
memo: "\uBCBD"
buildingName: Wall Lv.3
level: 3
upgradeTo: 9
towerType: defense
mana: 50
manpower: 30
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 60
sight: 1
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 7602931991599237580, guid: bc315c69c34c838458975519fd75f0f5, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8b72a1e58e168234280edfa2b5940212
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,47 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c40fef5ebc37b743a3f225c1ca57c32, type: 3}
m_Name: Tower9
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.TowerData
id: 9
memo: "\uBCBD"
buildingName: Wall Lv.4
level: 4
upgradeTo: 10
towerType: defense
mana: 100
manpower: 40
sizeX: 8
sizeY: 4
sizeZ: 3
maxHp: 80
sight: 1
atkRange: 0
atkDamage: 0
atkIntervalSec: 0
modelPath: Assets/Models/wall_straight.fbx
prefab: {fileID: 1425357096898832299, guid: c3ad48c2790ce194982baccac3d4cd9a, type: 3}
icon: {fileID: 0}
placementOffset: {x: 0, y: 0, z: 0}
allowRotation: 1
isIndestructible: 0
autoRegenerate: 0
regenPerSecond: 1
providesVision: 1
constructionEquipment:
socketName: RightHand
equipmentPrefab: {fileID: 0}
attachOnStart: 1
detachOnEnd: 1
keepEquipped: 0
attachDelay: 0
detachDelay: 0

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 99150640204515549b6441c26cad9691
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade1
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 1
memo: "\uCCB4\uB825 \uC99D\uAC00 Lv.1"
upgradeCategory: combat
upgradeTarget: person
mana: 200
requireUpgradeId:
effectStatList:
- player_max_hp
effectOpList:
- add
effectValueList:
- 50
sortOrder: 1

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b9e46f00da341b24ab07b314c89b7fd9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade10
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 10
memo: "\uB178\uB3D9\uB825 \uC99D\uAC00 Lv.1"
upgradeCategory: harvest
upgradeTarget: person
mana: 200
requireUpgradeId:
effectStatList:
- player_manpower
effectOpList:
- add
effectValueList:
- 5
sortOrder: 10

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c665e2cbdd230c04fb6d3e9fac091a65
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade11
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 11
memo: "\uB178\uB3D9\uB825 \uC99D\uAC00 Lv.2"
upgradeCategory: harvest
upgradeTarget: person
mana: 300
requireUpgradeId: 0a000000
effectStatList:
- player_manpower
effectOpList:
- add
effectValueList:
- 10
sortOrder: 11

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f5ad1c8a4ecf84a43b7c609c58592295
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade12
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 12
memo: "\uB178\uB3D9\uB825 \uC99D\uAC00 Lv.3"
upgradeCategory: harvest
upgradeTarget: person
mana: 400
requireUpgradeId: 070000000a000000
effectStatList:
- player_manpower
effectOpList:
- add
effectValueList:
- 20
sortOrder: 12

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 555ef1e6ff58ee442953d075e417c091
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade13
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 13
memo: "\uC774\uB3D9\uC18D\uB3C4 \uC99D\uAC00 Lv.1"
upgradeCategory: scout
upgradeTarget: person
mana: 200
requireUpgradeId:
effectStatList:
- player_move_speed
effectOpList:
- mul
effectValueList:
- 1.1
sortOrder: 13

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: aa2a6eecb804c3948a4fa7e75bacfca6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade14
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 14
memo: "\uC774\uB3D9\uC18D\uB3C4 \uC99D\uAC00 Lv.2"
upgradeCategory: scout
upgradeTarget: person
mana: 300
requireUpgradeId: 0d000000
effectStatList:
- player_move_speed
effectOpList:
- mul
effectValueList:
- 1.2
sortOrder: 14

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3216444533dfdc14891741f0b1c5a30a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade15
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 15
memo: "\uC774\uB3D9\uC18D\uB3C4 \uC99D\uAC00 Lv.3"
upgradeCategory: scout
upgradeTarget: person
mana: 400
requireUpgradeId: 0e000000
effectStatList:
- player_move_speed
effectOpList:
- mul
effectValueList:
- 1.3
sortOrder: 15

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 227e825691ca7c9498e4af4cbb592faa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade2
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 2
memo: "\uCCB4\uB825 \uC99D\uAC00 Lv.2"
upgradeCategory: combat
upgradeTarget: person
mana: 300
requireUpgradeId: 01000000
effectStatList:
- player_max_hp
effectOpList:
- add
effectValueList:
- 100
sortOrder: 2

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d989011e0aeec9a4b9ed3d9e49488c8a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade3
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 3
memo: "\uCCB4\uB825 \uC99D\uAC00 Lv.3"
upgradeCategory: combat
upgradeTarget: person
mana: 400
requireUpgradeId: 0200000005000000
effectStatList:
- player_max_hp
effectOpList:
- add
effectValueList:
- 150
sortOrder: 3

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 29b2206b90bc89c4183c6fb0a1bb699e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade4
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 4
memo: "\uACF5\uACA9\uB825 \uC99D\uAC00 Lv.1"
upgradeCategory: combat
upgradeTarget: person
mana: 200
requireUpgradeId:
effectStatList:
- player_atk_damage
effectOpList:
- add
effectValueList:
- 5
sortOrder: 4

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4c370fa5d360b034b977fa923d14f60b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade5
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 5
memo: "\uACF5\uACA9\uB825 \uC99D\uAC00 Lv.2"
upgradeCategory: combat
upgradeTarget: person
mana: 300
requireUpgradeId: 04000000
effectStatList:
- player_atk_damage
effectOpList:
- add
effectValueList:
- 10
sortOrder: 5

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 49e9bbb379a103741bca937c322db0cb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade6
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 6
memo: "\uACF5\uACA9\uB825 \uC99D\uAC00 Lv.3"
upgradeCategory: combat
upgradeTarget: person
mana: 400
requireUpgradeId: 0200000005000000
effectStatList:
- player_atk_damage
effectOpList:
- add
effectValueList:
- 15
sortOrder: 6

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c6178f649bd6ad141888fb39c653bda9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade7
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 7
memo: "\uC790\uC6D0 \uCD5C\uB300 \uC6A9\uB7C9 \uC99D\uAC00 Lv.1"
upgradeCategory: harvest
upgradeTarget: person
mana: 200
requireUpgradeId:
effectStatList:
- player_capacity
effectOpList:
- add
effectValueList:
- 20
sortOrder: 7

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 36cdb899e627bd54092fa9e4458ff6d2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade8
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 8
memo: "\uC790\uC6D0 \uCD5C\uB300 \uC6A9\uB7C9 \uC99D\uAC00 Lv.2"
upgradeCategory: harvest
upgradeTarget: person
mana: 300
requireUpgradeId: 07000000
effectStatList:
- player_capacity
effectOpList:
- add
effectValueList:
- 50
sortOrder: 8

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9e8418449515bb142b06d88d7a0ac4e1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f134815569ad014e9ccc81ddc443c4c, type: 3}
m_Name: Upgrade9
m_EditorClassIdentifier: Assembly-CSharp::Northbound.Data.UpgradeData
id: 9
memo: "\uC790\uC6D0 \uCD5C\uB300 \uC6A9\uB7C9 \uC99D\uAC00 Lv.3"
upgradeCategory: harvest
upgradeTarget: person
mana: 400
requireUpgradeId: 070000000a000000
effectStatList:
- player_capacity
effectOpList:
- add
effectValueList:
- 100
sortOrder: 9

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: eca8a6e3f11a84f44aa061493293e791
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -18,6 +18,8 @@ namespace Northbound.Data
public float moveSpeed;
/// <summary>체력</summary>
public int maxHp;
/// <summary>시야</summary>
public int sight;
/// <summary>사정 거리</summary>
public int atkRange;
/// <summary>데미지</summary>

View File

@@ -18,20 +18,26 @@ namespace Northbound.Data
public float moveSpeed;
/// <summary>체력</summary>
public int maxHp;
/// <summary>시야</summary>
public int sight;
/// <summary>사정 거리</summary>
public int atkRange;
/// <summary>데미지</summary>
public int atkDamage;
/// <summary>공격 주기</summary>
/// <summary>공격 주기 (초)</summary>
public float atkIntervalSec;
/// <summary>몬스터 난이도 점수</summary>
public int cost;
/// <summary>등장 가중치</summary>
public float weight;
/// <summary>사용할 모델의 경로</summary>
/// <summary>사용할 모델의 경로 • 확장자까지 입력</summary>
public string modelPath;
/// <summary>사용할 애니메이션 컨트롤러의 경로</summary>
/// <summary>사용할 애니메이션 컨트롤러의 경로 • 확장자까지 입력</summary>
public string animationControllerPath;
/// <summary>등장 가능 최소 웨이브 정의 • 최소 1 입력</summary>
public int waveMin;
/// <summary>등장 가능 최대 웨이브 정의 • null = 웨이브 제한 없음</summary>
public int waveMax;
}
}

View File

@@ -16,14 +16,14 @@ namespace Northbound.Data
public string memo;
/// <summary>이동 속도</summary>
public float moveSpeed;
/// <summary>시야 반경</summary>
public float visionRadius;
/// <summary>운반 용량</summary>
public int capacity;
/// <summary>생산 노동량</summary>
public float manpower;
/// <summary>체력</summary>
public int maxHp;
/// <summary>시야</summary>
public int sight;
/// <summary>사정거리</summary>
public int atkRange;
/// <summary>데미지</summary>

View File

@@ -16,7 +16,13 @@ namespace Northbound.Data
public string memo;
/// <summary>건물 이름</summary>
public string buildingName;
/// <summary>건설 비용 (mana=20) (mana=50; iron=10)</summary>
/// <summary>타워 레벨</summary>
public int level;
/// <summary>레벨업 시 변경될 타워 ID 입력</summary>
public int upgradeTo;
/// <summary>업그레이드 분류용 타워 종류 • attack • defense • special • sight</summary>
public string towerType;
/// <summary>건설 비용</summary>
public int mana;
/// <summary>건설 노동량</summary>
public float manpower;
@@ -28,13 +34,15 @@ namespace Northbound.Data
public int sizeZ;
/// <summary>체력</summary>
public int maxHp;
/// <summary>타워 시야</summary>
public int sight;
/// <summary>사정거리</summary>
public int atkRange;
/// <summary>데미지</summary>
public int atkDamage;
/// <summary>공격 주기</summary>
public float atkIntervalSec;
/// <summary>모델 경로</summary>
/// <summary>프리팹/리소스 경로</summary>
public string modelPath;
}

View File

@@ -34,19 +34,19 @@ namespace Northbound.Data
public EquipmentData constructionEquipment;
[Header("Properties for convenience")]
public int width => sizeX;
public int length => sizeY;
public float height => sizeY;
public int width => sizeX; // X축
public int length => sizeZ; // Z축 (깊이)
public float height => sizeY; // Y축 (높이)
public int maxHealth => maxHp;
public float visionRange => atkRange;
public float visionRange => sight;
public float requiredWorkAmount => manpower;
public Vector3 GetSize(int rotation)
{
bool isRotated = (rotation == 1 || rotation == 3);
float w = isRotated ? length : width;
float l = isRotated ? width : length;
return new Vector3(w, sizeY, l);
float d = isRotated ? width : length;
return new Vector3(w, height, d); // (width, height, depth)
}
}
}

View File

@@ -0,0 +1,35 @@
// 이 파일은 자동 생성되었습니다. 직접 수정하지 마세요!
// 생성 스크립트: DataTools/generate_csharp_classes.py
using UnityEngine;
using System.Collections.Generic; // 리스트 지원을 위해 추가
namespace Northbound.Data
{
[CreateAssetMenu(fileName = "UpgradeData", menuName = "Northbound/Upgrade Data")]
public partial class UpgradeData : ScriptableObject
{
[Header("기본 정보")]
/// <summary>고유 ID</summary>
public int id;
/// <summary>기획용 메모</summary>
public string memo;
/// <summary>업그레이드 타입 • combat • harvest • building • scout</summary>
public string upgradeCategory;
/// <summary>업그레이드 대상 • person • share</summary>
public string upgradeTarget;
/// <summary>건설 비용 (mana=20)(mana=50; iron=10)</summary>
public int mana;
/// <summary>선행 조건 ID (목록)</summary>
public List<int> requireUpgradeId = new List<int>();
/// <summary>효과 타입 목록 • player_movespeed • player_sight • …</summary>
public List<string> effectStatList = new List<string>();
/// <summary>계산식 목록 • add • mul • set</summary>
public List<string> effectOpList = new List<string>();
/// <summary>효과 수치 목록</summary>
public List<float> effectValueList = new List<float>();
/// <summary>UI 정렬 값</summary>
public int sortOrder;
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4f134815569ad014e9ccc81ddc443c4c

View File

@@ -79,7 +79,7 @@ MonoBehaviour:
GlobalObjectIdHash: 437508337
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
Ownership: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
@@ -104,8 +104,10 @@ MonoBehaviour:
ShowTopMostFoldoutHeaderGroup: 1
enemyTeam: 2
maxHealth: 100
damageEffectPrefab: {fileID: 0}
destroyEffectPrefab: {fileID: 0}
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
destroyEffectPrefab: {fileID: 141433446842962269, guid: 9fe8f8b3288e45a44af36ff8aa04486e, type: 3}
showHealthBar: 1
healthBarPrefab: {fileID: 100000, guid: 8e7a5b12c9f8a4a5ba3c8d1f2e5a7b9c, type: 3}
--- !u!195 &4485945348237935463
NavMeshAgent:
m_ObjectHideFlags: 0
@@ -142,7 +144,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyAIController
ShowTopMostFoldoutHeaderGroup: 1
aiType: 2
detectionRange: 15
detectionRange: 6
detectionAngle: 360
playerLayer:
serializedVersion: 2
@@ -156,7 +158,7 @@ MonoBehaviour:
attackInterval: 1.5
attackDamage: 10
moveSpeed: 3.5
chaseSpeedMultiplier: 1.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
--- !u!95 &6023907831447366429
Animator:
@@ -196,6 +198,7 @@ MonoBehaviour:
speedParam: Speed
attackTriggerParam: Attack
isMovingParam: IsMoving
dieTriggerParam: Die
autoLoadFromMonsterData: 1
debugLogging: 0
--- !u!114 &3928237758911375249
@@ -243,6 +246,10 @@ MonoBehaviour:
NameHash: -823668238
Synchronize: 1
ParameterType: 1
- name: Die
NameHash: 20298039
Synchronize: 1
ParameterType: 9
AnimatorParametersExpanded: 0
--- !u!114 &-8703503294977252669
MonoBehaviour:

View File

@@ -79,7 +79,7 @@ MonoBehaviour:
GlobalObjectIdHash: 209349728
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
Ownership: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
@@ -104,8 +104,10 @@ MonoBehaviour:
ShowTopMostFoldoutHeaderGroup: 1
enemyTeam: 3
maxHealth: 100
damageEffectPrefab: {fileID: 0}
destroyEffectPrefab: {fileID: 0}
damageEffectPrefab: {fileID: 4021103657954561961, guid: 5c755f9bc5253ea418e919994537dcc7, type: 3}
destroyEffectPrefab: {fileID: 141433446842962269, guid: 9fe8f8b3288e45a44af36ff8aa04486e, type: 3}
showHealthBar: 1
healthBarPrefab: {fileID: 100000, guid: 8e7a5b12c9f8a4a5ba3c8d1f2e5a7b9c, type: 3}
--- !u!195 &4485945348237935463
NavMeshAgent:
m_ObjectHideFlags: 0
@@ -142,7 +144,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::Northbound.EnemyAIController
ShowTopMostFoldoutHeaderGroup: 1
aiType: 3
detectionRange: 15
detectionRange: 6
detectionAngle: 360
playerLayer:
serializedVersion: 2
@@ -156,7 +158,7 @@ MonoBehaviour:
attackInterval: 1.5
attackDamage: 10
moveSpeed: 3.5
chaseSpeedMultiplier: 1.5
chaseSpeedMultiplier: 1
showDebugInfo: 1
--- !u!114 &3710510283885710978
MonoBehaviour:
@@ -210,6 +212,7 @@ MonoBehaviour:
speedParam: Speed
attackTriggerParam: Attack
isMovingParam: IsMoving
dieTriggerParam: Die
autoLoadFromMonsterData: 1
debugLogging: 0
--- !u!114 &502360995489719830
@@ -243,6 +246,10 @@ MonoBehaviour:
NameHash: -823668238
Synchronize: 1
ParameterType: 1
- name: Die
NameHash: 20298039
Synchronize: 1
ParameterType: 9
AnimatorParametersExpanded: 0
--- !u!114 &-6991373811087161316
MonoBehaviour:

View File

@@ -15,7 +15,7 @@ GameObject:
- component: {fileID: -4086363217010332088}
- component: {fileID: 4822792797652874450}
- component: {fileID: -6756709031183627887}
m_Layer: 0
m_Layer: 7
m_Name: TowerTemplate
m_TagString: Untagged
m_Icon: {fileID: 0}
@@ -52,7 +52,7 @@ MonoBehaviour:
GlobalObjectIdHash: 4259369348
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
Ownership: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
@@ -119,9 +119,9 @@ MonoBehaviour:
initialOwnerId: 0
useInitialOwner: 0
showHealthBar: 1
healthBarPrefab: {fileID: 0}
destroyEffectPrefab: {fileID: 0}
damageEffectPrefab: {fileID: 0}
healthBarPrefab: {fileID: 100000, guid: 8e7a5b12c9f8a4a5ba3c8d1f2e5a7b9c, type: 3}
destroyEffectPrefab: {fileID: 8656522925564163052, guid: e509867be4f82f246a95eca1ee5a2d61, type: 3}
damageEffectPrefab: {fileID: 1429954232896169633, guid: 83036083a4ebcd34f98131bd3cf6f4d2, type: 3}
effectSpawnPoint: {fileID: 0}
showGridBounds: 1
gridBoundsColor: {r: 0, g: 1, b: 1, a: 1}
@@ -161,4 +161,10 @@ MonoBehaviour:
targetLayer:
serializedVersion: 2
m_Bits: 2304
beamPrefab: {fileID: 0}
beamColor: {r: 1, g: 0, b: 0, a: 1}
beamStartWidth: 0.1
beamEndWidth: 0.05
beamDuration: 0.15
firePoint: {fileID: 0}
showDebugInfo: 1

View File

@@ -159,3 +159,58 @@ MonoBehaviour:
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 3769411674882976201, guid: 368961a0f2d71ce4aad5d8ffe52e0b7f, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 5178364993341969979, guid: a8163f1921c918b4db0ca25636eef8f9, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 4171458273137159353, guid: 8430b50192177b8478a235db6987ae31, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 7839175078399552227, guid: 56b0a93f2c28474419ccd3d67c2af475, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 164713662324750716, guid: 667453ec7fc252240b7de7512cb575c5, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 7542015048609582274, guid: bc3e47c18fbc0fb48bccecfb984ccc1b, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 7602931991599237580, guid: bc315c69c34c838458975519fd75f0f5, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 1425357096898832299, guid: c3ad48c2790ce194982baccac3d4cd9a, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 5817331480696920731, guid: c680d37f654a3624f918970c8e7cee7a, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 4836465544871382218, guid: 444d5b6b074d6db4dbe8fcb699ca6203, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 8411033062678718070, guid: 1b51c70b826d97d47bb851e2d8ff758f, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}

2
Assets/External/JMO Assets.meta vendored Normal file
View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 976974e4d3018034e87caeb9f51f20f6

View File

@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: b18b93d4b5d00384ba417df18aeac5a3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX FREE (old legacy effects).unitypackage
uploadId: 836238

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,14 @@
{
"name": "CFXREditor",
"references": [],
"optionalUnityReferences": [],
"includePlatforms": [
"Editor"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}

View File

@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: eb5cb7c323a395242a81960087292f3c
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR Editor.asmdef
uploadId: 836238

View File

@@ -0,0 +1,275 @@
//--------------------------------------------------------------------------------------------------------------------------------
// Cartoon FX
// (c) 2012-2025 Jean Moreno
//--------------------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using System.IO;
// Parse conditional expressions from CFXR_MaterialInspector to show/hide some parts of the UI easily
namespace CartoonFX
{
public static class ExpressionParser
{
public delegate bool EvaluateFunction(string content);
//--------------------------------------------------------------------------------------------------------------------------------
// Main Function to use
static public bool EvaluateExpression(string expression, EvaluateFunction evalFunction)
{
//Remove white spaces and double && ||
string cleanExpr = "";
for(int i = 0; i < expression.Length; i++)
{
switch(expression[i])
{
case ' ': break;
case '&': cleanExpr += expression[i]; i++; break;
case '|': cleanExpr += expression[i]; i++; break;
default: cleanExpr += expression[i]; break;
}
}
List<Token> tokens = new List<Token>();
StringReader reader = new StringReader(cleanExpr);
Token t = null;
do
{
t = new Token(reader);
tokens.Add(t);
} while(t.type != Token.TokenType.EXPR_END);
List<Token> polishNotation = Token.TransformToPolishNotation(tokens);
var enumerator = polishNotation.GetEnumerator();
enumerator.MoveNext();
Expression root = MakeExpression(ref enumerator, evalFunction);
return root.Evaluate();
}
//--------------------------------------------------------------------------------------------------------------------------------
// Expression Token
public class Token
{
static Dictionary<char, KeyValuePair<TokenType, string>> typesDict = new Dictionary<char, KeyValuePair<TokenType, string>>()
{
{'(', new KeyValuePair<TokenType, string>(TokenType.OPEN_PAREN, "(")},
{')', new KeyValuePair<TokenType, string>(TokenType.CLOSE_PAREN, ")")},
{'!', new KeyValuePair<TokenType, string>(TokenType.UNARY_OP, "NOT")},
{'&', new KeyValuePair<TokenType, string>(TokenType.BINARY_OP, "AND")},
{'|', new KeyValuePair<TokenType, string>(TokenType.BINARY_OP, "OR")}
};
public enum TokenType
{
OPEN_PAREN,
CLOSE_PAREN,
UNARY_OP,
BINARY_OP,
LITERAL,
EXPR_END
}
public TokenType type;
public string value;
public Token(StringReader s)
{
int c = s.Read();
if(c == -1)
{
type = TokenType.EXPR_END;
value = "";
return;
}
char ch = (char)c;
//Special case: solve bug where !COND_FALSE_1 && COND_FALSE_2 would return True
bool embeddedNot = (ch == '!' && s.Peek() != '(');
if(typesDict.ContainsKey(ch) && !embeddedNot)
{
type = typesDict[ch].Key;
value = typesDict[ch].Value;
}
else
{
string str = "";
str += ch;
while(s.Peek() != -1 && !typesDict.ContainsKey((char)s.Peek()))
{
str += (char)s.Read();
}
type = TokenType.LITERAL;
value = str;
}
}
static public List<Token> TransformToPolishNotation(List<Token> infixTokenList)
{
Queue<Token> outputQueue = new Queue<Token>();
Stack<Token> stack = new Stack<Token>();
int index = 0;
while(infixTokenList.Count > index)
{
Token t = infixTokenList[index];
switch(t.type)
{
case Token.TokenType.LITERAL:
outputQueue.Enqueue(t);
break;
case Token.TokenType.BINARY_OP:
case Token.TokenType.UNARY_OP:
case Token.TokenType.OPEN_PAREN:
stack.Push(t);
break;
case Token.TokenType.CLOSE_PAREN:
while(stack.Peek().type != Token.TokenType.OPEN_PAREN)
{
outputQueue.Enqueue(stack.Pop());
}
stack.Pop();
if(stack.Count > 0 && stack.Peek().type == Token.TokenType.UNARY_OP)
{
outputQueue.Enqueue(stack.Pop());
}
break;
default:
break;
}
index++;
}
while(stack.Count > 0)
{
outputQueue.Enqueue(stack.Pop());
}
var list = new List<Token>(outputQueue);
list.Reverse();
return list;
}
}
//--------------------------------------------------------------------------------------------------------------------------------
// Boolean Expression Classes
public abstract class Expression
{
public abstract bool Evaluate();
}
public class ExpressionLeaf : Expression
{
private string content;
private EvaluateFunction evalFunction;
public ExpressionLeaf(EvaluateFunction _evalFunction, string _content)
{
this.evalFunction = _evalFunction;
this.content = _content;
}
override public bool Evaluate()
{
//embedded not, see special case in Token declaration
if(content.StartsWith("!"))
{
return !this.evalFunction(content.Substring(1));
}
return this.evalFunction(content);
}
}
public class ExpressionAnd : Expression
{
private Expression left;
private Expression right;
public ExpressionAnd(Expression _left, Expression _right)
{
this.left = _left;
this.right = _right;
}
override public bool Evaluate()
{
return left.Evaluate() && right.Evaluate();
}
}
public class ExpressionOr : Expression
{
private Expression left;
private Expression right;
public ExpressionOr(Expression _left, Expression _right)
{
this.left = _left;
this.right = _right;
}
override public bool Evaluate()
{
return left.Evaluate() || right.Evaluate();
}
}
public class ExpressionNot : Expression
{
private Expression expr;
public ExpressionNot(Expression _expr)
{
this.expr = _expr;
}
override public bool Evaluate()
{
return !expr.Evaluate();
}
}
static public Expression MakeExpression(ref List<Token>.Enumerator polishNotationTokensEnumerator, EvaluateFunction _evalFunction)
{
if(polishNotationTokensEnumerator.Current.type == Token.TokenType.LITERAL)
{
Expression lit = new ExpressionLeaf(_evalFunction, polishNotationTokensEnumerator.Current.value);
polishNotationTokensEnumerator.MoveNext();
return lit;
}
else
{
if(polishNotationTokensEnumerator.Current.value == "NOT")
{
polishNotationTokensEnumerator.MoveNext();
Expression operand = MakeExpression(ref polishNotationTokensEnumerator, _evalFunction);
return new ExpressionNot(operand);
}
else if(polishNotationTokensEnumerator.Current.value == "AND")
{
polishNotationTokensEnumerator.MoveNext();
Expression left = MakeExpression(ref polishNotationTokensEnumerator, _evalFunction);
Expression right = MakeExpression(ref polishNotationTokensEnumerator, _evalFunction);
return new ExpressionAnd(left, right);
}
else if(polishNotationTokensEnumerator.Current.value == "OR")
{
polishNotationTokensEnumerator.MoveNext();
Expression left = MakeExpression(ref polishNotationTokensEnumerator, _evalFunction);
Expression right = MakeExpression(ref polishNotationTokensEnumerator, _evalFunction);
return new ExpressionOr(left, right);
}
}
return null;
}
}
}

View File

@@ -0,0 +1,17 @@
fileFormatVersion: 2
guid: ce7d96d3a4d4f3b4681ab437a9710d60
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR_ExpressionParser.cs
uploadId: 836238

View File

@@ -0,0 +1,604 @@
//--------------------------------------------------------------------------------------------------------------------------------
// Cartoon FX
// (c) 2012-2025 Jean Moreno
//--------------------------------------------------------------------------------------------------------------------------------
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
// Custom material inspector for Stylized FX shaders
// - organize UI using comments in the shader code
// - more flexibility than the material property drawers
// version 2 (dec 2017)
namespace CartoonFX
{
public class MaterialInspector : ShaderGUI
{
//Set by PropertyDrawers to defined if the next properties should be visible
static private Stack<bool> ShowStack = new Stack<bool>();
static public bool ShowNextProperty { get; private set; }
static public void PushShowProperty(bool value)
{
ShowStack.Push(ShowNextProperty);
ShowNextProperty &= value;
}
static public void PopShowProperty()
{
ShowNextProperty = ShowStack.Pop();
}
//--------------------------------------------------------------------------------------------------
const string kGuiCommandPrefix = "//#";
const string kGC_IfKeyword = "IF_KEYWORD";
const string kGC_IfProperty = "IF_PROPERTY";
const string kGC_EndIf = "END_IF";
const string kGC_HelpBox = "HELP_BOX";
const string kGC_Label = "LABEL";
Dictionary<int, List<GUICommand>> guiCommands = new Dictionary<int, List<GUICommand>>();
bool initialized = false;
AssetImporter shaderImporter;
ulong lastTimestamp;
void Initialize(MaterialEditor editor, bool force)
{
if((!initialized || force) && editor != null)
{
initialized = true;
guiCommands.Clear();
//Find the shader and parse the source to find special comments that will organize the GUI
//It's hackish, but at least it allows any character to be used (unlike material property drawers/decorators) and can be used along with property drawers
var materials = new List<Material>();
foreach(var o in editor.targets)
{
var m = o as Material;
if(m != null)
materials.Add(m);
}
if(materials.Count > 0 && materials[0].shader != null)
{
var path = AssetDatabase.GetAssetPath(materials[0].shader);
//get asset importer
shaderImporter = AssetImporter.GetAtPath(path);
if(shaderImporter != null)
{
lastTimestamp = shaderImporter.assetTimeStamp;
}
//remove 'Assets' and replace with OS path
path = Application.dataPath + path.Substring(6);
//convert to cross-platform path
path = path.Replace('/', Path.DirectorySeparatorChar);
//open file for reading
var lines = File.ReadAllLines(path);
bool insideProperties = false;
//regex pattern to find properties, as they need to be counted so that
//special commands can be inserted at the right position when enumerating them
var regex = new Regex(@"[a-zA-Z0-9_]+\s*\([^\)]*\)");
int propertyCount = 0;
bool insideCommentBlock = false;
foreach(var l in lines)
{
var line = l.TrimStart();
if(insideProperties)
{
bool isComment = line.StartsWith("//");
if(line.Contains("/*"))
insideCommentBlock = true;
if(line.Contains("*/"))
insideCommentBlock = false;
//finished properties block?
if(line.StartsWith("}"))
break;
//comment
if(line.StartsWith(kGuiCommandPrefix))
{
string command = line.Substring(kGuiCommandPrefix.Length).TrimStart();
//space
if(string.IsNullOrEmpty(command))
AddGUICommand(propertyCount, new GC_Space());
//separator
else if(command.StartsWith("---"))
AddGUICommand(propertyCount, new GC_Separator());
//separator
else if(command.StartsWith("==="))
AddGUICommand(propertyCount, new GC_SeparatorDouble());
//if keyword
else if(command.StartsWith(kGC_IfKeyword))
{
var expr = command.Substring(command.LastIndexOf(kGC_IfKeyword) + kGC_IfKeyword.Length + 1);
AddGUICommand(propertyCount, new GC_IfKeyword() { expression = expr, materials = materials.ToArray() });
}
//if property
else if(command.StartsWith(kGC_IfProperty))
{
var expr = command.Substring(command.LastIndexOf(kGC_IfProperty) + kGC_IfProperty.Length + 1);
AddGUICommand(propertyCount, new GC_IfProperty() { expression = expr, materials = materials.ToArray() });
}
//end if
else if(command.StartsWith(kGC_EndIf))
{
AddGUICommand(propertyCount, new GC_EndIf());
}
//help box
else if(command.StartsWith(kGC_HelpBox))
{
var messageType = MessageType.Error;
var message = "Invalid format for HELP_BOX:\n" + command;
var cmd = command.Substring(command.LastIndexOf(kGC_HelpBox) + kGC_HelpBox.Length + 1).Split(new string[] { "::" }, System.StringSplitOptions.RemoveEmptyEntries);
if(cmd.Length == 1)
{
message = cmd[0];
messageType = MessageType.None;
}
else if(cmd.Length == 2)
{
try
{
var msgType = (MessageType)System.Enum.Parse(typeof(MessageType), cmd[0], true);
message = cmd[1].Replace(" ", "\n");
messageType = msgType;
}
catch { }
}
AddGUICommand(propertyCount, new GC_HelpBox()
{
message = message,
messageType = messageType
});
}
//label
else if(command.StartsWith(kGC_Label))
{
var label = command.Substring(command.LastIndexOf(kGC_Label) + kGC_Label.Length + 1);
AddGUICommand(propertyCount, new GC_Label() { label = label });
}
//header: plain text after command
else
{
AddGUICommand(propertyCount, new GC_Header() { label = command });
}
}
else
//property
{
if(regex.IsMatch(line) && !insideCommentBlock && !isComment)
propertyCount++;
}
}
//start properties block?
if(line.StartsWith("Properties"))
{
insideProperties = true;
}
}
}
}
}
void AddGUICommand(int propertyIndex, GUICommand command)
{
if(!guiCommands.ContainsKey(propertyIndex))
guiCommands.Add(propertyIndex, new List<GUICommand>());
guiCommands[propertyIndex].Add(command);
}
public override void AssignNewShaderToMaterial(Material material, Shader oldShader, Shader newShader)
{
initialized = false;
base.AssignNewShaderToMaterial(material, oldShader, newShader);
}
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
{
//init:
//- read metadata in properties comment to generate ui layout
//- force update if timestamp doesn't match last (= file externally updated)
bool force = (shaderImporter != null && shaderImporter.assetTimeStamp != lastTimestamp);
Initialize(materialEditor, force);
var shader = (materialEditor.target as Material).shader;
materialEditor.SetDefaultGUIWidths();
//show all properties by default
ShowNextProperty = true;
ShowStack.Clear();
for(int i = 0; i < properties.Length; i++)
{
if(guiCommands.ContainsKey(i))
{
for(int j = 0; j < guiCommands[i].Count; j++)
{
guiCommands[i][j].OnGUI();
}
}
//Use custom properties to enable/disable groups based on keywords
if(ShowNextProperty)
{
#if UNITY_6000_1_OR_NEWER
if((properties[i].propertyFlags & (UnityEngine.Rendering.ShaderPropertyFlags.HideInInspector | UnityEngine.Rendering.ShaderPropertyFlags.PerRendererData)) == UnityEngine.Rendering.ShaderPropertyFlags.None)
#else
if((properties[i].flags & (MaterialProperty.PropFlags.HideInInspector | MaterialProperty.PropFlags.PerRendererData)) == MaterialProperty.PropFlags.None)
#endif
{
DisplayProperty(properties[i], materialEditor);
}
}
}
//make sure to show gui commands that are after properties
int index = properties.Length;
if(guiCommands.ContainsKey(index))
{
for(int j = 0; j < guiCommands[index].Count; j++)
{
guiCommands[index][j].OnGUI();
}
}
//Special fields
Styles.MaterialDrawSeparatorDouble();
materialEditor.RenderQueueField();
materialEditor.EnableInstancingField();
}
virtual protected void DisplayProperty(MaterialProperty property, MaterialEditor materialEditor)
{
float propertyHeight = materialEditor.GetPropertyHeight(property, property.displayName);
Rect controlRect = EditorGUILayout.GetControlRect(true, propertyHeight, EditorStyles.layerMaskField, new GUILayoutOption[0]);
materialEditor.ShaderProperty(controlRect, property, property.displayName);
}
}
// Same as Toggle drawer, but doesn't set any keyword
// This will avoid adding unnecessary shader keyword to the project
internal class MaterialToggleNoKeywordDrawer : MaterialPropertyDrawer
{
private static bool IsPropertyTypeSuitable(MaterialProperty prop)
{
#if UNITY_6000_1_OR_NEWER
return prop.propertyType == UnityEngine.Rendering.ShaderPropertyType.Float || prop.propertyType == UnityEngine.Rendering.ShaderPropertyType.Range;
#else
return prop.type == MaterialProperty.PropType.Float || prop.type == MaterialProperty.PropType.Range;
#endif
}
public override float GetPropertyHeight(MaterialProperty prop, string label, MaterialEditor editor)
{
float height;
if (!MaterialToggleNoKeywordDrawer.IsPropertyTypeSuitable(prop))
{
height = 40f;
}
else
{
height = base.GetPropertyHeight(prop, label, editor);
}
return height;
}
public override void OnGUI(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor)
{
if (!MaterialToggleNoKeywordDrawer.IsPropertyTypeSuitable(prop))
{
EditorGUI.HelpBox(position, "Toggle used on a non-float property: " + prop.name, MessageType.Warning);
}
else
{
EditorGUI.BeginChangeCheck();
bool flag = Mathf.Abs(prop.floatValue) > 0.001f;
EditorGUI.showMixedValue = prop.hasMixedValue;
flag = EditorGUI.Toggle(position, label, flag);
EditorGUI.showMixedValue = false;
if (EditorGUI.EndChangeCheck())
{
prop.floatValue = ((!flag) ? 0f : 1f);
}
}
}
}
// Same as KeywordEnum drawer, but uses the keyword supplied as is rather than adding a prefix to them
internal class MaterialKeywordEnumNoPrefixDrawer : MaterialPropertyDrawer
{
private readonly GUIContent[] labels;
private readonly string[] keywords;
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1) : this(new[] { lbl1 }, new[] { kw1 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1, string lbl2, string kw2) : this(new[] { lbl1, lbl2 }, new[] { kw1, kw2 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1, string lbl2, string kw2, string lbl3, string kw3) : this(new[] { lbl1, lbl2, lbl3 }, new[] { kw1, kw2, kw3 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1, string lbl2, string kw2, string lbl3, string kw3, string lbl4, string kw4) : this(new[] { lbl1, lbl2, lbl3, lbl4 }, new[] { kw1, kw2, kw3, kw4 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1, string lbl2, string kw2, string lbl3, string kw3, string lbl4, string kw4, string lbl5, string kw5) : this(new[] { lbl1, lbl2, lbl3, lbl4, lbl5 }, new[] { kw1, kw2, kw3, kw4, kw5 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string lbl1, string kw1, string lbl2, string kw2, string lbl3, string kw3, string lbl4, string kw4, string lbl5, string kw5, string lbl6, string kw6) : this(new[] { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 }, new[] { kw1, kw2, kw3, kw4, kw5, kw6 }) { }
public MaterialKeywordEnumNoPrefixDrawer(string[] labels, string[] keywords)
{
this.labels= new GUIContent[keywords.Length];
this.keywords = new string[keywords.Length];
for (int i = 0; i < keywords.Length; ++i)
{
this.labels[i] = new GUIContent(labels[i]);
this.keywords[i] = keywords[i];
}
}
static bool IsPropertyTypeSuitable(MaterialProperty prop)
{
#if UNITY_6000_1_OR_NEWER
return prop.propertyType == UnityEngine.Rendering.ShaderPropertyType.Float || prop.propertyType == UnityEngine.Rendering.ShaderPropertyType.Range;
#else
return prop.type == MaterialProperty.PropType.Float || prop.type == MaterialProperty.PropType.Range;
#endif
}
void SetKeyword(MaterialProperty prop, int index)
{
for (int i = 0; i < keywords.Length; ++i)
{
string keyword = GetKeywordName(prop.name, keywords[i]);
foreach (Material material in prop.targets)
{
if (index == i)
material.EnableKeyword(keyword);
else
material.DisableKeyword(keyword);
}
}
}
public override float GetPropertyHeight(MaterialProperty prop, string label, MaterialEditor editor)
{
if (!IsPropertyTypeSuitable(prop))
{
return EditorGUIUtility.singleLineHeight * 2.5f;
}
return base.GetPropertyHeight(prop, label, editor);
}
public override void OnGUI(Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor)
{
if (!IsPropertyTypeSuitable(prop))
{
EditorGUI.HelpBox(position, "Toggle used on a non-float property: " + prop.name, MessageType.Warning);
return;
}
EditorGUI.BeginChangeCheck();
EditorGUI.showMixedValue = prop.hasMixedValue;
var value = (int)prop.floatValue;
value = EditorGUI.Popup(position, label, value, labels);
EditorGUI.showMixedValue = false;
if (EditorGUI.EndChangeCheck())
{
prop.floatValue = value;
SetKeyword(prop, value);
}
}
public override void Apply(MaterialProperty prop)
{
base.Apply(prop);
if (!IsPropertyTypeSuitable(prop))
return;
if (prop.hasMixedValue)
return;
SetKeyword(prop, (int)prop.floatValue);
}
// Final keyword name: property name + "_" + display name. Uppercased,
// and spaces replaced with underscores.
private static string GetKeywordName(string propName, string name)
{
// Just return the supplied name
return name;
// Original code:
/*
string n = propName + "_" + name;
return n.Replace(' ', '_').ToUpperInvariant();
*/
}
}
//================================================================================================================================================================================================
// GUI Commands System
//
// Workaround to Material Property Drawers limitations:
// - uses shader comments to organize the GUI, and show/hide properties based on conditions
// - can use any character (unlike property drawers)
// - parsed once at material editor initialization
internal class GUICommand
{
public virtual bool Visible() { return true; }
public virtual void OnGUI() { }
}
internal class GC_Separator : GUICommand { public override void OnGUI() { if(MaterialInspector.ShowNextProperty) Styles.MaterialDrawSeparator(); } }
internal class GC_SeparatorDouble : GUICommand { public override void OnGUI() { if(MaterialInspector.ShowNextProperty) Styles.MaterialDrawSeparatorDouble(); } }
internal class GC_Space : GUICommand { public override void OnGUI() { if(MaterialInspector.ShowNextProperty) GUILayout.Space(8); } }
internal class GC_HelpBox : GUICommand
{
public string message { get; set; }
public MessageType messageType { get; set; }
public override void OnGUI()
{
if(MaterialInspector.ShowNextProperty)
Styles.HelpBoxRichText(message, messageType);
}
}
internal class GC_Header : GUICommand
{
public string label { get; set; }
GUIContent guiContent;
public override void OnGUI()
{
if(guiContent == null)
guiContent = new GUIContent(label);
if(MaterialInspector.ShowNextProperty)
Styles.MaterialDrawHeader(guiContent);
}
}
internal class GC_Label : GUICommand
{
public string label { get; set; }
GUIContent guiContent;
public override void OnGUI()
{
if(guiContent == null)
guiContent = new GUIContent(label);
if(MaterialInspector.ShowNextProperty)
GUILayout.Label(guiContent);
}
}
internal class GC_IfKeyword : GUICommand
{
public string expression { get; set; }
public Material[] materials { get; set; }
public override void OnGUI()
{
bool show = ExpressionParser.EvaluateExpression(expression, (string s) =>
{
foreach(var m in materials)
{
if(m.IsKeywordEnabled(s))
return true;
}
return false;
});
MaterialInspector.PushShowProperty(show);
}
}
internal class GC_EndIf : GUICommand { public override void OnGUI() { MaterialInspector.PopShowProperty(); } }
internal class GC_IfProperty : GUICommand
{
string _expression;
public string expression
{
get { return _expression; }
set { _expression = value.Replace("!=", "<>"); }
}
public Material[] materials { get; set; }
public override void OnGUI()
{
bool show = ExpressionParser.EvaluateExpression(expression, EvaluatePropertyExpression);
MaterialInspector.PushShowProperty(show);
}
bool EvaluatePropertyExpression(string expr)
{
//expression is expected to be in the form of: property operator value
var reader = new StringReader(expr);
string property = "";
string op = "";
float value = 0f;
int overflow = 0;
while(true)
{
char c = (char)reader.Read();
//operator
if(c == '=' || c == '>' || c == '<' || c == '!')
{
op += c;
//second operator character, if any
char c2 = (char)reader.Peek();
if(c2 == '=' || c2 == '>')
{
reader.Read();
op += c2;
}
//end of string is the value
var end = reader.ReadToEnd();
if(!float.TryParse(end, out value))
{
Debug.LogError("Couldn't parse float from property expression:\n" + end);
return false;
}
break;
}
//property name
property += c;
overflow++;
if(overflow >= 9999)
{
Debug.LogError("Expression parsing overflow!\n");
return false;
}
}
//evaluate property
bool conditionMet = false;
foreach(var m in materials)
{
float propValue = 0f;
if(property.Contains(".x") || property.Contains(".y") || property.Contains(".z") || property.Contains(".w"))
{
string[] split = property.Split('.');
string component = split[1];
switch(component)
{
case "x": propValue = m.GetVector(split[0]).x; break;
case "y": propValue = m.GetVector(split[0]).y; break;
case "z": propValue = m.GetVector(split[0]).z; break;
case "w": propValue = m.GetVector(split[0]).w; break;
default: Debug.LogError("Invalid component for vector property: '" + property + "'"); break;
}
}
else
propValue = m.GetFloat(property);
switch(op)
{
case ">=": conditionMet = propValue >= value; break;
case "<=": conditionMet = propValue <= value; break;
case ">": conditionMet = propValue > value; break;
case "<": conditionMet = propValue < value; break;
case "<>": conditionMet = propValue != value; break; //not equal, "!=" is replaced by "<>" to prevent bug with leading ! ("not" operator)
case "==": conditionMet = propValue == value; break;
default:
Debug.LogError("Invalid property expression:\n" + expr);
break;
}
if(conditionMet)
return true;
}
return false;
}
}
}

View File

@@ -0,0 +1,19 @@
fileFormatVersion: 2
guid: 4fb4c15e772a1cc4baecc7a958bf9cc7
timeCreated: 1486392341
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR_MaterialInspector.cs
uploadId: 836238

View File

@@ -0,0 +1,423 @@
// #define SHOW_EXPORT_BUTTON
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEditor.Rendering;
using UnityEngine;
#if UNITY_2020_2_OR_NEWER
using UnityEditor.AssetImporters;
#else
using UnityEditor.Experimental.AssetImporters;
#endif
using UnityEngine.Rendering;
namespace CartoonFX
{
namespace CustomShaderImporter
{
static class Utils
{
public static bool IsUsingURP()
{
#if UNITY_2019_3_OR_NEWER
var renderPipeline = GraphicsSettings.currentRenderPipeline;
#else
var renderPipeline = GraphicsSettings.renderPipelineAsset;
#endif
return renderPipeline != null && renderPipeline.GetType().Name.Contains("Universal");
}
}
[ScriptedImporter(0, FILE_EXTENSION)]
public class CFXR_ShaderImporter : ScriptedImporter
{
public enum RenderPipeline
{
Auto,
ForceBuiltInRenderPipeline,
ForceUniversalRenderPipeline
}
public const string FILE_EXTENSION = "cfxrshader";
[Tooltip("In case of errors when building the project or with addressables, you can try forcing a specific render pipeline")]
public RenderPipeline renderPipelineDetection = RenderPipeline.Auto;
public string detectedRenderPipeline = "Built-In Render Pipeline";
public int strippedLinesCount = 0;
public string shaderSourceCode;
public string shaderName;
public string[] shaderErrors;
public ulong variantCount;
public ulong variantCountUsed;
enum ComparisonOperator
{
Equal,
Greater,
GreaterOrEqual,
Less,
LessOrEqual
}
#if UNITY_2022_2_OR_NEWER
const int URP_VERSION = 14;
#elif UNITY_2021_2_OR_NEWER
const int URP_VERSION = 12;
#elif UNITY_2021_1_OR_NEWER
const int URP_VERSION = 11;
#elif UNITY_2020_3_OR_NEWER
const int URP_VERSION = 10;
#else
const int URP_VERSION = 7;
#endif
static ComparisonOperator ParseComparisonOperator(string symbols)
{
switch (symbols)
{
case "==": return ComparisonOperator.Equal;
case "<=": return ComparisonOperator.LessOrEqual;
case "<": return ComparisonOperator.Less;
case ">": return ComparisonOperator.Greater;
case ">=": return ComparisonOperator.GreaterOrEqual;
default: throw new Exception("Invalid comparison operator: " + symbols);
}
}
static bool CompareWithOperator(int value1, int value2, ComparisonOperator comparisonOperator)
{
switch (comparisonOperator)
{
case ComparisonOperator.Equal: return value1 == value2;
case ComparisonOperator.Greater: return value1 > value2;
case ComparisonOperator.GreaterOrEqual: return value1 >= value2;
case ComparisonOperator.Less: return value1 < value2;
case ComparisonOperator.LessOrEqual: return value1 <= value2;
default: throw new Exception("Invalid comparison operator value: " + comparisonOperator);
}
}
bool StartsOrEndWithSpecialTag(string line)
{
bool startsWithTag = (line.Length > 4 && line[0] == '/' && line[1] == '*' && line[2] == '*' && line[3] == '*');
if (startsWithTag) return true;
int l = line.Length-1;
bool endsWithTag = (line.Length > 4 && line[l] == '/' && line[l-1] == '*' && line[l-2] == '*' && line[l-3] == '*');
return endsWithTag;
}
public override void OnImportAsset(AssetImportContext context)
{
bool isUsingURP;
switch (renderPipelineDetection)
{
default:
case RenderPipeline.Auto:
{
isUsingURP = Utils.IsUsingURP();
detectedRenderPipeline = isUsingURP ? "Universal Render Pipeline" : "Built-In Render Pipeline";
break;
}
case RenderPipeline.ForceBuiltInRenderPipeline:
{
detectedRenderPipeline = "Built-In Render Pipeline";
isUsingURP = false;
break;
}
case RenderPipeline.ForceUniversalRenderPipeline:
{
detectedRenderPipeline = "Universal Render Pipeline";
isUsingURP = true;
break;
}
}
StringWriter shaderSource = new StringWriter();
string[] sourceLines = File.ReadAllLines(context.assetPath);
Stack<bool> excludeCurrentLines = new Stack<bool>();
strippedLinesCount = 0;
for (int i = 0; i < sourceLines.Length; i++)
{
bool excludeThisLine = excludeCurrentLines.Count > 0 && excludeCurrentLines.Peek();
string line = sourceLines[i];
if (StartsOrEndWithSpecialTag(line))
{
if (line.StartsWith("/*** BIRP ***/"))
{
excludeCurrentLines.Push(excludeThisLine || isUsingURP);
}
else if (line.StartsWith("/*** URP ***/"))
{
excludeCurrentLines.Push(excludeThisLine || !isUsingURP);
}
else if (line.StartsWith("/*** URP_VERSION "))
{
string subline = line.Substring("/*** URP_VERSION ".Length);
int spaceIndex = subline.IndexOf(' ');
string version = subline.Substring(spaceIndex, subline.LastIndexOf(' ') - spaceIndex);
string op = subline.Substring(0, spaceIndex);
var compOp = ParseComparisonOperator(op);
int compVersion = int.Parse(version);
bool isCorrectURP = CompareWithOperator(URP_VERSION, compVersion, compOp);
excludeCurrentLines.Push(excludeThisLine || !isCorrectURP);
}
else if (excludeThisLine && line.StartsWith("/*** END"))
{
excludeCurrentLines.Pop();
}
else if (!excludeThisLine && line.StartsWith("/*** #define URP_VERSION ***/"))
{
shaderSource.WriteLine("\t\t\t#define URP_VERSION " + URP_VERSION);
}
}
else
{
if (excludeThisLine)
{
strippedLinesCount++;
continue;
}
shaderSource.WriteLine(line);
}
}
// Get source code and extract name
shaderSourceCode = shaderSource.ToString();
int idx = shaderSourceCode.IndexOf("Shader \"", StringComparison.InvariantCulture) + 8;
int idx2 = shaderSourceCode.IndexOf('"', idx);
shaderName = shaderSourceCode.Substring(idx, idx2 - idx);
shaderErrors = null;
Shader shader = ShaderUtil.CreateShaderAsset(context, shaderSourceCode, true);
if (ShaderUtil.ShaderHasError(shader))
{
string[] shaderSourceLines = shaderSourceCode.Split(new [] {'\n'}, StringSplitOptions.None);
var errors = ShaderUtil.GetShaderMessages(shader);
shaderErrors = Array.ConvertAll(errors, err => $"{err.message} (line {err.line})");
foreach (ShaderMessage error in errors)
{
string message = error.line <= 0 ?
string.Format("Shader Error in '{0}' (in file '{2}')\nError: {1}\n", shaderName, error.message, error.file) :
string.Format("Shader Error in '{0}' (line {2} in file '{3}')\nError: {1}\nLine: {4}\n", shaderName, error.message, error.line, error.file, shaderSourceLines[error.line-1]);
if (error.severity == ShaderCompilerMessageSeverity.Warning)
{
Debug.LogWarning(message);
}
else
{
Debug.LogError(message);
}
}
}
else
{
ShaderUtil.ClearShaderMessages(shader);
}
context.AddObjectToAsset("MainAsset", shader);
context.SetMainObject(shader);
// Try to count variant using reflection:
// internal static extern ulong GetVariantCount(Shader s, bool usedBySceneOnly);
variantCount = 0;
variantCountUsed = 0;
MethodInfo getVariantCountReflection = typeof(ShaderUtil).GetMethod("GetVariantCount", BindingFlags.Static | BindingFlags.NonPublic);
if (getVariantCountReflection != null)
{
try
{
object result = getVariantCountReflection.Invoke(null, new object[] {shader, false});
variantCount = (ulong)result;
result = getVariantCountReflection.Invoke(null, new object[] {shader, true});
variantCountUsed = (ulong)result;
}
catch
{
// ignored
}
}
}
}
namespace Inspector
{
[CustomEditor(typeof(CFXR_ShaderImporter)), CanEditMultipleObjects]
public class TCP2ShaderImporter_Editor : Editor
{
CFXR_ShaderImporter Importer => (CFXR_ShaderImporter) this.target;
// From: UnityEditor.ShaderInspectorPlatformsPopup
static string FormatCount(ulong count)
{
bool flag = count > 1000000000uL;
string result;
if (flag)
{
result = (count / 1000000000.0).ToString("f2", CultureInfo.InvariantCulture.NumberFormat) + "B";
}
else
{
bool flag2 = count > 1000000uL;
if (flag2)
{
result = (count / 1000000.0).ToString("f2", CultureInfo.InvariantCulture.NumberFormat) + "M";
}
else
{
bool flag3 = count > 1000uL;
if (flag3)
{
result = (count / 1000.0).ToString("f2", CultureInfo.InvariantCulture.NumberFormat) + "k";
}
else
{
result = count.ToString();
}
}
}
return result;
}
static GUIStyle _HelpBoxRichTextStyle;
static GUIStyle HelpBoxRichTextStyle
{
get
{
if (_HelpBoxRichTextStyle == null)
{
_HelpBoxRichTextStyle = new GUIStyle("HelpBox");
_HelpBoxRichTextStyle.richText = true;
_HelpBoxRichTextStyle.margin = new RectOffset(4, 4, 0, 0);
_HelpBoxRichTextStyle.padding = new RectOffset(4, 4, 4, 4);
}
return _HelpBoxRichTextStyle;
}
}
public override void OnInspectorGUI()
{
bool multipleValues = serializedObject.isEditingMultipleObjects;
CFXR_ShaderImporter.RenderPipeline detection = ((CFXR_ShaderImporter)target).renderPipelineDetection;
bool isUsingURP = Utils.IsUsingURP();
serializedObject.Update();
GUILayout.Label(Importer.shaderName);
string variantsText = "";
if (Importer.variantCount > 0 && Importer.variantCountUsed > 0)
{
string variantsCount = multipleValues ? "-" : FormatCount(Importer.variantCount);
string variantsCountUsed = multipleValues ? "-" : FormatCount(Importer.variantCountUsed);
variantsText = $"\nVariants (currently used): <b>{variantsCountUsed}</b>\nVariants (including unused): <b>{variantsCount}</b>";
}
string strippedLinesCount = multipleValues ? "-" : Importer.strippedLinesCount.ToString();
string renderPipeline = Importer.detectedRenderPipeline;
if (targets is { Length: > 1 })
{
foreach (CFXR_ShaderImporter importer in targets)
{
if (importer.detectedRenderPipeline != renderPipeline)
{
renderPipeline = "-";
break;
}
}
}
GUILayout.Label($"{(detection == CFXR_ShaderImporter.RenderPipeline.Auto ? "Detected" : "Forced")} render pipeline: <b>{renderPipeline}</b>\nStripped lines: <b>{strippedLinesCount}</b>{variantsText}", HelpBoxRichTextStyle);
if (Importer.shaderErrors != null && Importer.shaderErrors.Length > 0)
{
GUILayout.Space(4);
var color = GUI.color;
GUI.color = new Color32(0xFF, 0x80, 0x80, 0xFF);
GUILayout.Label($"<b>Errors:</b>\n{string.Join("\n", Importer.shaderErrors)}", HelpBoxRichTextStyle);
GUI.color = color;
}
bool shouldReimportShader = false;
bool compiledForURP = Importer.detectedRenderPipeline.Contains("Universal");
if (detection == CFXR_ShaderImporter.RenderPipeline.Auto
&& ((isUsingURP && !compiledForURP) || (!isUsingURP && compiledForURP)))
{
GUILayout.Space(4);
Color guiColor = GUI.color;
GUI.color *= Color.yellow;
EditorGUILayout.HelpBox("The detected render pipeline doesn't match the pipeline this shader was compiled for!\nPlease reimport the shaders for them to work in the current render pipeline.", MessageType.Warning);
if (GUILayout.Button("Reimport Shader"))
{
shouldReimportShader = true;
}
GUI.color = guiColor;
}
GUILayout.Space(4);
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(CFXR_ShaderImporter.renderPipelineDetection)));
if (EditorGUI.EndChangeCheck())
{
shouldReimportShader = true;
}
if (GUILayout.Button("View Source", GUILayout.ExpandWidth(false)))
{
string path = Application.temporaryCachePath + "/" + Importer.shaderName.Replace("/", "-") + "_Source.shader";
if (File.Exists(path))
{
File.SetAttributes(path, FileAttributes.Normal);
}
File.WriteAllText(path, Importer.shaderSourceCode);
File.SetAttributes(path, FileAttributes.ReadOnly);
UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(path, 0);
}
#if SHOW_EXPORT_BUTTON
GUILayout.Space(8);
EditorGUI.BeginDisabledGroup(string.IsNullOrEmpty(importer.shaderSourceCode));
{
if (GUILayout.Button("Export .shader file", GUILayout.ExpandWidth(false)))
{
string savePath = EditorUtility.SaveFilePanel("Export CFXR shader", Application.dataPath, "CFXR Shader","shader");
if (!string.IsNullOrEmpty(savePath))
{
File.WriteAllText(savePath, importer.shaderSourceCode);
}
}
}
EditorGUI.EndDisabledGroup();
#endif
serializedObject.ApplyModifiedProperties();
if (shouldReimportShader)
{
ReimportShader();
}
}
void ReimportShader()
{
foreach (UnityEngine.Object t in targets)
{
string path = AssetDatabase.GetAssetPath(t);
AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceSynchronousImport);
}
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
fileFormatVersion: 2
guid: fe56ec25963759b49955809beeb4324b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR_ShaderImporter.cs
uploadId: 836238

View File

@@ -0,0 +1,38 @@
using System;
using UnityEditor;
using UnityEngine;
namespace CartoonFX
{
namespace CustomShaderImporter
{
public class CFXR_ShaderPostProcessor : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
CleanCFXRShaders(importedAssets);
}
static void CleanCFXRShaders(string[] paths)
{
foreach (var assetPath in paths)
{
if (!assetPath.EndsWith(CFXR_ShaderImporter.FILE_EXTENSION, StringComparison.InvariantCultureIgnoreCase))
{
continue;
}
var shader = AssetDatabase.LoadMainAssetAtPath(assetPath) as Shader;
if (shader != null)
{
ShaderUtil.ClearShaderMessages(shader);
if (!ShaderUtil.ShaderHasError(shader))
{
ShaderUtil.RegisterShader(shader);
}
}
}
}
}
}
}

View File

@@ -0,0 +1,18 @@
fileFormatVersion: 2
guid: 29d46695388f9a84d9ae71b5140727a3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR_ShaderPostProcessor.cs
uploadId: 836238

View File

@@ -0,0 +1,362 @@
//--------------------------------------------------------------------------------------------------------------------------------
// Cartoon FX
// (c) 2012-2025 Jean Moreno
//--------------------------------------------------------------------------------------------------------------------------------
using UnityEngine;
using UnityEditor;
// GUI Styles and UI methods
namespace CartoonFX
{
public static class Styles
{
//================================================================================================================================
// GUI Styles
//================================================================================================================================
//================================================================================================================================
// (x) close button
static GUIStyle _closeCrossButton;
public static GUIStyle CloseCrossButton
{
get
{
if(_closeCrossButton == null)
{
//Try to load GUISkin according to its GUID
//Assumes that its .meta file should always stick with it!
string guiSkinPath = AssetDatabase.GUIDToAssetPath("02d396fa782e5d7438e231ea9f8be23c");
var gs = AssetDatabase.LoadAssetAtPath<GUISkin>(guiSkinPath);
if(gs != null)
{
_closeCrossButton = System.Array.Find<GUIStyle>(gs.customStyles, x => x.name == "CloseCrossButton");
}
//Else fall back to minibutton
if(_closeCrossButton == null)
_closeCrossButton = EditorStyles.miniButton;
}
return _closeCrossButton;
}
}
//================================================================================================================================
// Shuriken Toggle with label alignment fix
static GUIStyle _shurikenToggle;
public static GUIStyle ShurikenToggle
{
get
{
if(_shurikenToggle == null)
{
_shurikenToggle = new GUIStyle("ShurikenToggle");
_shurikenToggle.fontSize = 9;
_shurikenToggle.contentOffset = new Vector2(16, -1);
if(EditorGUIUtility.isProSkin)
{
var textColor = new Color(.8f, .8f, .8f);
_shurikenToggle.normal.textColor = textColor;
_shurikenToggle.active.textColor = textColor;
_shurikenToggle.focused.textColor = textColor;
_shurikenToggle.hover.textColor = textColor;
_shurikenToggle.onNormal.textColor = textColor;
_shurikenToggle.onActive.textColor = textColor;
_shurikenToggle.onFocused.textColor = textColor;
_shurikenToggle.onHover.textColor = textColor;
}
}
return _shurikenToggle;
}
}
//================================================================================================================================
// Bold mini-label (the one from EditorStyles isn't actually "mini")
static GUIStyle _miniBoldLabel;
public static GUIStyle MiniBoldLabel
{
get
{
if(_miniBoldLabel == null)
{
_miniBoldLabel = new GUIStyle(EditorStyles.boldLabel);
_miniBoldLabel.fontSize = 10;
_miniBoldLabel.margin = new RectOffset(0, 0, 0, 0);
}
return _miniBoldLabel;
}
}
//================================================================================================================================
// Bold mini-foldout
static GUIStyle _miniBoldFoldout;
public static GUIStyle MiniBoldFoldout
{
get
{
if(_miniBoldFoldout == null)
{
_miniBoldFoldout = new GUIStyle(EditorStyles.foldout);
_miniBoldFoldout.fontSize = 10;
_miniBoldFoldout.fontStyle = FontStyle.Bold;
_miniBoldFoldout.margin = new RectOffset(0, 0, 0, 0);
}
return _miniBoldFoldout;
}
}
//================================================================================================================================
// Gray right-aligned label for Orderable List (Material Animator)
static GUIStyle _PropertyTypeLabel;
public static GUIStyle PropertyTypeLabel
{
get
{
if(_PropertyTypeLabel == null)
{
_PropertyTypeLabel = new GUIStyle(EditorStyles.label);
_PropertyTypeLabel.alignment = TextAnchor.MiddleRight;
_PropertyTypeLabel.normal.textColor = Color.gray;
_PropertyTypeLabel.fontSize = 9;
}
return _PropertyTypeLabel;
}
}
// Dark Gray right-aligned label for Orderable List (Material Animator)
static GUIStyle _PropertyTypeLabelFocused;
public static GUIStyle PropertyTypeLabelFocused
{
get
{
if(_PropertyTypeLabelFocused == null)
{
_PropertyTypeLabelFocused = new GUIStyle(EditorStyles.label);
_PropertyTypeLabelFocused.alignment = TextAnchor.MiddleRight;
_PropertyTypeLabelFocused.normal.textColor = new Color(.2f, .2f, .2f);
_PropertyTypeLabelFocused.fontSize = 9;
}
return _PropertyTypeLabelFocused;
}
}
//================================================================================================================================
// Rounded Box
static GUIStyle _roundedBox;
public static GUIStyle RoundedBox
{
get
{
if(_roundedBox == null)
{
_roundedBox = new GUIStyle(EditorStyles.helpBox);
}
return _roundedBox;
}
}
//================================================================================================================================
// Center White Label ("Editing Spline" label in Scene View)
static GUIStyle _CenteredWhiteLabel;
public static GUIStyle CenteredWhiteLabel
{
get
{
if(_CenteredWhiteLabel == null)
{
_CenteredWhiteLabel = new GUIStyle(EditorStyles.centeredGreyMiniLabel);
_CenteredWhiteLabel.fontSize = 20;
_CenteredWhiteLabel.normal.textColor = Color.white;
}
return _CenteredWhiteLabel;
}
}
//================================================================================================================================
// Used to draw lines for separators
static public GUIStyle _LineStyle;
static public GUIStyle LineStyle
{
get
{
if(_LineStyle == null)
{
_LineStyle = new GUIStyle();
_LineStyle.normal.background = EditorGUIUtility.whiteTexture;
_LineStyle.stretchWidth = true;
}
return _LineStyle;
}
}
//================================================================================================================================
// HelpBox with rich text formatting support
static GUIStyle _HelpBoxRichTextStyle;
static public GUIStyle HelpBoxRichTextStyle
{
get
{
if(_HelpBoxRichTextStyle == null)
{
_HelpBoxRichTextStyle = new GUIStyle("HelpBox");
_HelpBoxRichTextStyle.richText = true;
}
return _HelpBoxRichTextStyle;
}
}
//================================================================================================================================
// Material Blue Header
static public GUIStyle _MaterialHeaderStyle;
static public GUIStyle MaterialHeaderStyle
{
get
{
if(_MaterialHeaderStyle == null)
{
_MaterialHeaderStyle = new GUIStyle(EditorStyles.label);
_MaterialHeaderStyle.fontStyle = FontStyle.Bold;
_MaterialHeaderStyle.fontSize = 11;
_MaterialHeaderStyle.padding.top = 0;
_MaterialHeaderStyle.padding.bottom = 0;
_MaterialHeaderStyle.normal.textColor = EditorGUIUtility.isProSkin ? new Color32(75, 128, 255, 255) : new Color32(0, 50, 230, 255);
_MaterialHeaderStyle.stretchWidth = true;
}
return _MaterialHeaderStyle;
}
}
//================================================================================================================================
// Material Header emboss effect
static public GUIStyle _MaterialHeaderStyleHighlight;
static public GUIStyle MaterialHeaderStyleHighlight
{
get
{
if(_MaterialHeaderStyleHighlight == null)
{
_MaterialHeaderStyleHighlight = new GUIStyle(MaterialHeaderStyle);
_MaterialHeaderStyleHighlight.contentOffset = new Vector2(1, 1);
_MaterialHeaderStyleHighlight.normal.textColor = EditorGUIUtility.isProSkin ? new Color32(255, 255, 255, 16) : new Color32(255, 255, 255, 32);
}
return _MaterialHeaderStyleHighlight;
}
}
//================================================================================================================================
// Filled rectangle
static private GUIStyle _WhiteRectangleStyle;
static public void DrawRectangle(Rect position, Color color)
{
var col = GUI.color;
GUI.color *= color;
DrawRectangle(position);
GUI.color = col;
}
static public void DrawRectangle(Rect position)
{
if(_WhiteRectangleStyle == null)
{
_WhiteRectangleStyle = new GUIStyle();
_WhiteRectangleStyle.normal.background = EditorGUIUtility.whiteTexture;
}
if(Event.current != null && Event.current.type == EventType.Repaint)
{
_WhiteRectangleStyle.Draw(position, false, false, false, false);
}
}
//================================================================================================================================
// Methods
//================================================================================================================================
static public void DrawLine(float height = 2f)
{
DrawLine(Color.black, height);
}
static public void DrawLine(Color color, float height = 1f)
{
Rect position = GUILayoutUtility.GetRect(0f, float.MaxValue, height, height, LineStyle);
DrawLine(position, color);
}
static public void DrawLine(Rect position, Color color)
{
if(Event.current.type == EventType.Repaint)
{
Color orgColor = GUI.color;
GUI.color = orgColor * color;
LineStyle.Draw(position, false, false, false, false);
GUI.color = orgColor;
}
}
static public void MaterialDrawHeader(GUIContent guiContent)
{
var rect = GUILayoutUtility.GetRect(guiContent, MaterialHeaderStyle);
GUI.Label(rect, guiContent, MaterialHeaderStyleHighlight);
GUI.Label(rect, guiContent, MaterialHeaderStyle);
}
static public void MaterialDrawSeparator()
{
GUILayout.Space(4);
if(EditorGUIUtility.isProSkin)
DrawLine(new Color(.3f, .3f, .3f, 1f), 1);
else
DrawLine(new Color(.6f, .6f, .6f, 1f), 1);
GUILayout.Space(4);
}
static public void MaterialDrawSeparatorDouble()
{
GUILayout.Space(6);
if(EditorGUIUtility.isProSkin)
{
DrawLine(new Color(.1f, .1f, .1f, 1f), 1);
DrawLine(new Color(.4f, .4f, .4f, 1f), 1);
}
else
{
DrawLine(new Color(.3f, .3f, .3f, 1f), 1);
DrawLine(new Color(.9f, .9f, .9f, 1f), 1);
}
GUILayout.Space(6);
}
//built-in console icons, also used in help box
static Texture2D warnIcon;
static Texture2D infoIcon;
static Texture2D errorIcon;
static public void HelpBoxRichText(Rect position, string message, MessageType msgType)
{
Texture2D icon = null;
switch(msgType)
{
case MessageType.Warning: icon = warnIcon ?? (warnIcon = EditorGUIUtility.Load("console.warnicon") as Texture2D); break;
case MessageType.Info: icon = infoIcon ?? (infoIcon = EditorGUIUtility.Load("console.infoicon") as Texture2D); break;
case MessageType.Error: icon = errorIcon ?? (errorIcon = EditorGUIUtility.Load("console.erroricon") as Texture2D); break;
}
EditorGUI.LabelField(position, GUIContent.none, new GUIContent(message, icon), HelpBoxRichTextStyle);
}
static public void HelpBoxRichText(string message, MessageType msgType)
{
Texture2D icon = null;
switch(msgType)
{
case MessageType.Warning: icon = warnIcon ?? (warnIcon = EditorGUIUtility.Load("console.warnicon") as Texture2D); break;
case MessageType.Info: icon = infoIcon ?? (infoIcon = EditorGUIUtility.Load("console.infoicon") as Texture2D); break;
case MessageType.Error: icon = errorIcon ?? (errorIcon = EditorGUIUtility.Load("console.erroricon") as Texture2D); break;
}
EditorGUILayout.LabelField(GUIContent.none, new GUIContent(message, icon), HelpBoxRichTextStyle);
}
}
}

View File

@@ -0,0 +1,19 @@
fileFormatVersion: 2
guid: 26306333afc273640814fd7a7b3968e0
timeCreated: 1501149213
licenseType: Store
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 109565
packageName: Cartoon FX Remaster Free
packageVersion: R 1.5.0
assetPath: Assets/JMO Assets/Cartoon FX Remaster/CFXR Assets/Editor/CFXR_Styles.cs
uploadId: 836238

View File

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

View File

@@ -0,0 +1,113 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: cfxr aura rays hdr ab nosp
m_Shader: {fileID: -6465566751694194690, guid: 1a29b4d27eb8b04479ef89c00dea533d,
type: 3}
m_ValidKeywords:
- _ALPHABLEND_ON
- _CFXR_HDR_BOOST
- _CFXR_SINGLE_CHANNEL
m_InvalidKeywords:
- _
- _CFXR_DITHERED_SHADOWS_OFF
- _CFXR_OVERLAYBLEND_RGBA
- _CFXR_OVERLAYTEX_OFF
m_LightmapFlags: 0
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DissolveTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DitherCustom:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 4ece64fbaa1a3d14091abf505199104e, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OverlayTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SecondColorTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BacklightTransmittance: 1
- _BlendingType: 0
- _BumpScale: 1
- _CFXR_DITHERED_SHADOWS: 0
- _CFXR_OVERLAYBLEND: 0
- _CFXR_OVERLAYTEX: 0
- _Cutoff: 0.1
- _DirLightScreenAtten: 1
- _DirectLightingRamp: 1
- _DissolveSmooth: 0.1
- _Distort: 0.1
- _DoubleDissolve: 0
- _DstBlend: 10
- _EdgeFadePow: 1
- _FadeAlongU: 0
- _HdrBoost: 1
- _HdrMultiply: 2
- _IndirectLightingMix: 0.5
- _InvertDissolveTex: 0
- _LightingWorldPosStrength: 0.2
- _OVERLAYBLEND: 0
- _OVERLAYTEX: 0
- _SecondColorSmooth: 0.2
- _ShadowStrength: 1
- _SingleChannel: 1
- _SoftParticlesFadeDistanceFar: 1
- _SoftParticlesFadeDistanceNear: 0
- _SrcBlend: 5
- _UVDistortionAdd: 0
- _UseAlphaClip: 0
- _UseBackLighting: 0
- _UseDissolve: 0
- _UseDissolveOffsetUV: 0
- _UseEF: 0
- _UseEmission: 0
- _UseFB: 0
- _UseFontColor: 0
- _UseLighting: 0
- _UseLightingWorldPosOffset: 0
- _UseNormalMap: 0
- _UseSP: 0
- _UseSecondColor: 0
- _UseUV2Distortion: 0
- _UseUVDistortion: 0
- _ZWrite: 0
m_Colors:
- _Color: {r: 4.237095, g: 4.237095, b: 4.237095, a: 1}
- _DissolveScroll: {r: 0, g: 0, b: 0, a: 0}
- _DistortScrolling: {r: 0, g: 0, b: 1, a: 1}
- _OverlayTex_Scroll: {r: 0.1, g: 0.1, b: 1, a: 1}
- _ShadowColor: {r: 0, g: 0, b: 0, a: 1}
- _SoftParticlesFadeDistance: {r: 0, g: 1, b: 0, a: 0}
m_BuildTextureStacks: []

Some files were not shown because too many files have changed in this diff Show More