Merge branch 'develop' into feature/revive

This commit is contained in:
HungDK
2025-11-04 14:51:15 +07:00
789 changed files with 3249130 additions and 1753 deletions
+309
View File
@@ -0,0 +1,309 @@
---
description: Binary data conversion rules when reading C++ binary files in C#
---
# Binary Data Conversion Rules (C++ to C#)
When reading binary data from C++ files using `FileStream`, follow these conversion patterns based on the variable type in the original C++ struct.
## Important Type Mappings
- `unsigned long` in C++ → `uint` in C#
- `bool` in C++ → 1 byte (read as `byte` in C#, then convert with `> 0`)
- `wchar_t` on Windows → 2 bytes
- `task_char` → `ushort`
- Pointer size in C++ binary → typically 4 bytes (32-bit)
**Critical**: When reading binary data, match the original C++ memory layout exactly, accounting for struct packing and alignment.
## Case 1: Normal Value Type Variables (Primitives)
**Pattern**: Directly stored scalar values (no arrays, no pointers, no user-defined structs)
**C++ Examples**:
```cpp
unsigned long m_ID;
bool m_bHasSign;
int m_lAvailFrequency;
float m_fLibraryTasksProbability;
```
**C# Conversion**:
```csharp
// Read value and assign to the field
fixedData.m_ID = AAssit.ReadFromBinaryOf<uint>(fp, ref readBytes);
// Special case for bool: read as byte and compare with > 0
fixedData.m_bHasSign = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes) > 0;
fixedData.m_bChooseOne = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes) > 0;
// Other primitive types
fixedData.m_lAvailFrequency = AAssit.ReadFromBinaryOf<int>(fp, ref readBytes);
fixedData.m_fLibraryTasksProbability = AAssit.ReadFromBinaryOf<float>(fp, ref readBytes);
```
**Rule**: Use `AAssit.ReadFromBinaryOf<T>(fp, ref readBytes)` where T is the C# equivalent type.
**Important for bool**: C++ bool is stored as 1 byte in binary files. Always read as `byte` and convert to C# bool using `> 0`:
```csharp
// Correct pattern for bool
fixedData.m_boolField = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes) > 0;
```
---
## Case 2: Fixed-Size Arrays (Inline Memory)
**Pattern**: Arrays with a known constant size defined by a macro or constant
**C++ Examples**:
```cpp
task_char m_szName[MAX_TASK_NAME_LEN]; // MAX_TASK_NAME_LEN = 30
char m_tmType[MAX_TIMETABLE_SIZE]; // MAX_TIMETABLE_SIZE = 32
task_tm m_tmStart[MAX_TIMETABLE_SIZE];
task_tm m_tmEnd[MAX_TIMETABLE_SIZE];
```
**C# Conversion**:
```csharp
// Read array from binary and assign to the field
fixedData.m_szName = AAssit.ReadArrayFromBinary<ushort>(fp, TaskTemplConstants.MAX_TASK_NAME_LEN, ref readBytes);
fixedData.m_tmType = AAssit.ReadArrayFromBinary<byte>(fp, TaskTemplConstants.MAX_TIMETABLE_SIZE, ref readBytes);
fixedData.m_tmStart = AAssit.ReadArrayFromBinary<task_tm>(fp, TaskTemplConstants.MAX_TIMETABLE_SIZE, ref readBytes);
fixedData.m_tmEnd = AAssit.ReadArrayFromBinary<task_tm>(fp, TaskTemplConstants.MAX_TIMETABLE_SIZE, ref readBytes);
```
**Rule**: Use `AAssit.ReadArrayFromBinary<T>(fp, arraySize, ref readBytes)` where:
- `T` is the C# equivalent element type
- `arraySize` is the predefined constant size
---
## Case 3: Pointer to User-Defined Type or String
**Pattern**: Fields that store only the pointer address, not the actual object/data
**C++ Examples**:
```cpp
task_char* m_pszSignature;
AWARD_DATA* m_Award_S;
Task_Region* m_pDelvRegion;
ITEM_WANTED* m_PremItems;
```
**C# Conversion**:
```csharp
// Skip pointer size (4 bytes for 32-bit pointers)
// The content is not inlined in the struct
fp.Seek(4, SeekOrigin.Current);
```
**Rule**: Skip 4 bytes using `fp.Seek(4, SeekOrigin.Current)` because only the pointer address is stored in the binary file, not the actual data.
**Note**: If the pointed-to data exists separately in the file, it must be read later based on additional logic (e.g., checking a count variable or flag).
---
## Case 4: User-Defined Struct (Inline, Not Pointer)
**Pattern**: A complete user-defined struct embedded directly in the parent struct
**C++ Examples**:
```cpp
task_tm m_tmAbsFailTime; // Inline struct
AWARD_DATA m_Award_S; // Inline struct (if not a pointer)
```
**C# Conversion**:
```csharp
// Skip the full size of the struct in bytes
// Check the struct's internal members and padding to calculate correct size
fp.Seek(24, SeekOrigin.Current); // Example: sizeof(task_tm) = 24 bytes on Windows/MSVC
```
**Rule**:
1. Calculate the exact size of the struct including padding
2. Skip that many bytes using `fp.Seek(structSize, SeekOrigin.Current)`
**Important**: Do not rely on hardcoded numbers. Calculate the actual struct size considering:
- Size of each member
- Struct packing (`Pack = 1`, `Pack = 4`, etc.)
- Platform-specific alignment rules
**Alternative**: If you need the data, read the struct directly:
```csharp
fixedData.m_tmAbsFailTime = AAssit.ReadFromBinaryOf<task_tm>(fp, ref readBytes);
```
---
## Case 5: Pointer to Basic Type (Not Inline)
**Pattern**: Pointer to a basic/primitive type where only the pointer address is stored in the struct. The pointed-to content (if any) is stored elsewhere in the file and must be read later based on counts/flags.
**C++ Examples**:
```cpp
ushort* m_pszSignature; // Pointer to ushort
int* m_plChangeKey; // Pointer to int
bool* m_pbChangeType; // Pointer to bool
float* m_pFloatArray; // Pointer to float
```
**C# Conversion**:
```csharp
// Always skip the pointer address (4 bytes in the binary layout)
fp.Seek(4, SeekOrigin.Current);
```
**Rule**: For any pointer (to basic or user-defined types), always skip 4 bytes to account for the stored pointer address in the C++ binary. The actual data, if present, should be read later using accompanying count/flag fields.
**Note**: This assumes the source binary was written with 32-bit pointer sizes. If you ever process binaries with 64-bit pointer sizes, adjust accordingly.
---
## Decision Tree
Use this flowchart to determine which case applies:
```
Is it a pointer (has * in C++)?
├── YES
│ ├── Is it a user-defined type (struct/class)?
│ │ ├── YES → Case 3: Skip 4 bytes (pointer address)
│ │ └── NO (basic type) → Case 5: Skip 4 bytes (pointer address)
│ └── NO
│ ├── Is it an array with predefined size?
│ │ ├── YES → Case 2: Read array using ReadArrayFromBinary
│ │ └── NO
│ │ ├── Is it a user-defined struct (inline)?
│ │ │ ├── YES → Case 4: Skip sizeof(struct) or read struct
│ │ │ └── NO → Case 1: Read value using ReadFromBinaryOf
```
---
## Common Patterns and Examples
### Pattern: Conditional Data Reading
When a field has associated data only if a flag/count is set:
**C++ Example**:
```cpp
bool m_bHasSign;
task_char* m_pszSignature; // Only has data if m_bHasSign is true
unsigned long m_ulTimetable;
task_tm* m_tmStart; // Only has data if m_ulTimetable > 0
```
**C# Conversion**:
```csharp
// First read the flag/count (read bool as byte and convert with > 0)
fixedData.m_bHasSign = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes) > 0;
// Skip the pointer (Case 3)
fp.Seek(4, SeekOrigin.Current);
// Later, conditionally read the actual data
if (fixedData.m_bHasSign)
{
fixedData.m_pszSignature = AAssit.ReadArrayFromBinary<ushort>(fp, MAX_TASK_NAME_LEN, ref readBytes);
}
```
### Pattern: String Conversion
For `task_char` arrays (which are `ushort` arrays in C#):
```csharp
// Read the array
fixedData.m_szName = AAssit.ReadArrayFromBinary<ushort>(fp, MAX_TASK_NAME_LEN, ref readBytes);
// Convert to readable string
TaskTemplUtils.convert_txt(ref fixedData.m_szName, MAX_TASK_NAME_LEN, TaskTemplUtils.uint_to_ushort(fixedData.m_ID));
string taskName = ByteToStringUtils.UshortArrayToCP936String(fixedData.m_szName);
```
---
## Reference: AAssit Helper Methods
From [AAssit.cs](mdc:Assets/PerfectWorld/Scripts/Common/DataProcess/AAssit.cs):
```csharp
// Read a single value
public static T ReadFromBinaryOf<T>(FileStream fp, ref long readBytes) where T : struct
// Read an array of values
public static T[] ReadArrayFromBinary<T>(FileStream fp, int count, ref long readBytes) where T : struct
```
---
## Best Practices
1. **Always track readBytes**: Pass `ref readBytes` to track how many bytes have been read for debugging
2. **Match C++ layout exactly**: Ensure struct packing in C# matches C++ (`Pack = 1` is common)
3. **Document your assumptions**: Add comments explaining the byte sizes you're skipping
4. **Verify with logs**: Log read values to verify correctness
5. **Check file position**: Use `fp.Position` to verify you're reading from the expected location
6. **Handle platform differences**: Be aware of 32-bit vs 64-bit pointer sizes (though binary files usually use fixed sizes)
---
## Common Mistakes to Avoid
❌ **Wrong**: Reading bool directly as bool type
```csharp
// C++: bool m_bHasSign
fixedData.m_bHasSign = AAssit.ReadFromBinaryOf<bool>(fp, ref readBytes); // Wrong!
```
✅ **Correct**:
```csharp
// Read as byte and compare with > 0
fixedData.m_bHasSign = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes) > 0; // Correct!
```
---
❌ **Wrong**: Skipping only `sizeof(basic type)` for a pointer in Case 5
```csharp
// C++: ushort* m_pszSignature
fp.Seek(2, SeekOrigin.Current); // Wrong! Do not skip sizeof(ushort) for pointers
```
✅ **Correct**:
```csharp
// Always skip the pointer address (4 bytes)
fp.Seek(4, SeekOrigin.Current);
```
---
❌ **Wrong**: Reading inline array as a single value
```csharp
// C++: char m_tmType[MAX_TIMETABLE_SIZE]
byte value = AAssit.ReadFromBinaryOf<byte>(fp, ref readBytes); // Wrong!
```
✅ **Correct**:
```csharp
byte[] values = AAssit.ReadArrayFromBinary<byte>(fp, MAX_TIMETABLE_SIZE, ref readBytes);
```
---
❌ **Wrong**: Not accounting for struct padding
```csharp
// C++: struct with padding
fp.Seek(20, SeekOrigin.Current); // Might be wrong due to padding!
```
✅ **Correct**:
```csharp
// Calculate actual size with padding
// Or read the struct directly if needed
fixedData.m_structField = AAssit.ReadFromBinaryOf<MyStruct>(fp, ref readBytes);
```
+13
View File
@@ -0,0 +1,13 @@
---
alwaysApply: true
---
When convert cpp to c#
- unsigned long convert to uint
- unsigned char to byte
- task_char to ushort
- Keeps all the naming
- keeps all the original chinese comments. But add a translated English version side by side
- struct has to be public
- struct has to be use [StructLayout(LayoutKind.Sequential, Pack = 1)]
- all field in struct has to be public
- array has to be use [MarshalAs(UnmanagedType.ByValArray, SizeConst = )] to fix the array size
+2
View File
@@ -12,6 +12,8 @@
/[Uu]ser[Ss]ettings/
*.log
.DS_Store
# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control.
*.blend1
*.blend1.meta
@@ -1,5 +1,57 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-8246595925621566861
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u901A\u653B\u51FB2_\u7A7A\u62F3\u8D77"
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: 7400000, guid: 13d67a517390ab44ab7cd04a01241fa1, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-5871009920633307743
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u901A\u653B\u51FB3_\u7A7A\u62F3\u8D77"
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: 7400000, guid: 94e88f93d73c0384e912f9bdf56ca0f0, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-3428370780428663456
AnimatorState:
serializedVersion: 6
@@ -26,6 +78,32 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-2067993840832057464
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u901A\u653B\u51FB4_\u7A7A\u62F3\u8D77"
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: 7400000, guid: 0f91f25e28e0f9e40b3775ae54c8f7da, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
@@ -66,6 +144,18 @@ AnimatorStateMachine:
- serializedVersion: 1
m_State: {fileID: 4752791884131023009}
m_Position: {x: 420, y: 240, z: 0}
- serializedVersion: 1
m_State: {fileID: -2067993840832057464}
m_Position: {x: 170, y: 180, z: 0}
- serializedVersion: 1
m_State: {fileID: -5871009920633307743}
m_Position: {x: 190, y: 257, z: 0}
- serializedVersion: 1
m_State: {fileID: -8246595925621566861}
m_Position: {x: 197, y: 352, z: 0}
- serializedVersion: 1
m_State: {fileID: 3997183232589304477}
m_Position: {x: -50, y: 230, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
@@ -76,6 +166,32 @@ AnimatorStateMachine:
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -3428370780428663456}
--- !u!1102 &3997183232589304477
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: "\u666E\u901A\u653B\u51FB1_\u7A7A\u62F3\u8D77"
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: 7400000, guid: b0ca22f0c2157aa46a778db01a1e5021, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &4752791884131023009
AnimatorState:
serializedVersion: 6
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 395b18d42bf948a4ca7ca17093aee7ff
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4b543650c1481144285e5fe06b033ebd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: dd5e60f12fb344d47b0cdc01cfc94f59
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4573b2de65f0a8c45b35a59434fa3d2d
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9c59835295cb31c479efc40c96944f41
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 726186c8282ed7c47a52217b4fa0152b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4dd60f54a083c55499303404333169f1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 189a99c4d2f855d498e4608157b141cc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 49d7a5616e80420409e1788df9a63368
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9e48bf6bc233d71429c25385b0b6f6fa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a8565f972c8562b4387ef69a894dbd3a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e293cfb5d6cb1df488a0d993cbd72bcc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c8cc4ea36caf1604ca3524427646d42f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 74d89af8400e9f647bf269077b0ea78f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bc97e31f15f83fd4d8b890282c0a9e3b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 54534f33b63930041b37c47b3db4bdf6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e1ef26d68f2d38746b742170641bb259
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f260cd0e9d73c3943ac7e132f1268d74
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fcc349582b728d348bfb0f737a910209
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5f0435ad5f13b7d4a92ebcbc0832eb3a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3b2e22cc081b848459ae464586365ab0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c2e337500ecf1e14087a4f4460cec85e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ed65f9d7d3efa484f876a9ca8a90b24c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d32eb00ddeceebd489e8c730970b434f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 23cfa8d3995a8cf4eb8c4c7939425b01
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ca2dbf6c3021e144d8cf21aa7fb6aa89
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 87503e45616689947bac7732bcf15757
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d62da6acaf5e5504e9d21840e488267a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 19efab864b451ba4094d8dcefcb177f3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: def09d4200e41f54fa4f9670f379a4b9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9ceb8066a33f42346a0bdfa8e55729bc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 290903340ed08b64a94ab3c3d9cd2379
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f80e1a293bc8a3449879cdb23d4359a6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9a753a3f4b866694e862bc0d4428f72b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4d4791e9b72440a4fba7be1447abfe6f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1952d4fe5abac5f4e85aec4b8ccec735
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ff638cb5bec869c4eadd42a8ed9b90a5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8518d1f7d26070943b14a71eb822f4e7
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 44dd889b333df7c4ea750344ecd90b61
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6ed8ebd28c23d014f8449c336ab8cc68
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f07e7201ae989f147993e2b846c14024
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 245a3e491f659484db6680321a0f393c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 983bfb813ef18fe41a82b722f2b2f403
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5b640c8072bbeb44b8962b2ea778b7da
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a4b175842ec77b74a9266116d5527133
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: cba4a56d73cfcdd42bd372aefe6b4750
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4648c4dba3ea97e4f9315d147a1ee186
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c11b1c940bb08d84590034941d975470
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b30b5715d7827184b8aa61da74bba92e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

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