Merge branch 'develop' into feature/revive
This commit is contained in:
@@ -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);
|
||||
```
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
+116
@@ -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:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c59835295cb31c479efc40c96944f41
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 726186c8282ed7c47a52217b4fa0152b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4dd60f54a083c55499303404333169f1
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 189a99c4d2f855d498e4608157b141cc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49d7a5616e80420409e1788df9a63368
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9e48bf6bc233d71429c25385b0b6f6fa
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a8565f972c8562b4387ef69a894dbd3a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e293cfb5d6cb1df488a0d993cbd72bcc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8cc4ea36caf1604ca3524427646d42f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74d89af8400e9f647bf269077b0ea78f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc97e31f15f83fd4d8b890282c0a9e3b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+12919
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 54534f33b63930041b37c47b3db4bdf6
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+12343
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e1ef26d68f2d38746b742170641bb259
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+10327
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f260cd0e9d73c3943ac7e132f1268d74
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fcc349582b728d348bfb0f737a910209
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+6646
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5f0435ad5f13b7d4a92ebcbc0832eb3a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1417
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3b2e22cc081b848459ae464586365ab0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+3739
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c2e337500ecf1e14087a4f4460cec85e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+3568
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed65f9d7d3efa484f876a9ca8a90b24c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d32eb00ddeceebd489e8c730970b434f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 23cfa8d3995a8cf4eb8c4c7939425b01
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1417
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ca2dbf6c3021e144d8cf21aa7fb6aa89
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 87503e45616689947bac7732bcf15757
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d62da6acaf5e5504e9d21840e488267a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+12703
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 19efab864b451ba4094d8dcefcb177f3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1417
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: def09d4200e41f54fa4f9670f379a4b9
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+5251
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9ceb8066a33f42346a0bdfa8e55729bc
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+3010
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 290903340ed08b64a94ab3c3d9cd2379
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+5251
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f80e1a293bc8a3449879cdb23d4359a6
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+6295
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9a753a3f4b866694e862bc0d4428f72b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+3505
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4d4791e9b72440a4fba7be1447abfe6f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+2515
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1952d4fe5abac5f4e85aec4b8ccec735
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ff638cb5bec869c4eadd42a8ed9b90a5
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8518d1f7d26070943b14a71eb822f4e7
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 44dd889b333df7c4ea750344ecd90b61
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ed8ebd28c23d014f8449c336ab8cc68
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f07e7201ae989f147993e2b846c14024
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 245a3e491f659484db6680321a0f393c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 983bfb813ef18fe41a82b722f2b2f403
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5b640c8072bbeb44b8962b2ea778b7da
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+1417
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a4b175842ec77b74a9266116d5527133
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cba4a56d73cfcdd42bd372aefe6b4750
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4648c4dba3ea97e4f9315d147a1ee186
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
+8
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c11b1c940bb08d84590034941d975470
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b30b5715d7827184b8aa61da74bba92e
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 7400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user