private void PrintContent(AssetTypeValueField field, int tabDepth) { Console.WriteLine($"{new string('\t', tabDepth)}{field.GetName()} = {field.GetValue()?.AsString()}"); if (field.GetChildrenCount() <= 0) { return; } foreach (AssetTypeValueField child in field.GetChildrenList()) { PrintContent(child, tabDepth + 1); } }
public FsmDataInstance LoadFSM(long id) { AssetFileInfoEx info = curFile.table.GetAssetInfo(id); AssetTypeValueField baseField = am.GetMonoBaseFieldCached(curFile, info, Path.Combine(Path.GetDirectoryName(curFile.path), "Managed")); AssetNameResolver namer = new AssetNameResolver(am, curFile); FsmDataInstance dataInstance = new FsmDataInstance(); AssetTypeValueField fsm = baseField.Get("fsm"); AssetTypeValueField states = fsm.Get("states"); AssetTypeValueField events = fsm.Get("events"); AssetTypeValueField variables = fsm.Get("variables"); AssetTypeValueField globalTransitions = fsm.Get("globalTransitions"); AssetTypeValueField dataVersionField = fsm.Get("dataVersion"); dataInstance.fsmName = fsm.Get("name").GetValue().AsString(); AssetTypeInstance goAti = am.GetExtAsset(curFile, baseField.Get("m_GameObject")).instance; if (goAti != null) { string m_Name = goAti.GetBaseField().Get("m_Name").GetValue().AsString(); dataInstance.goName = m_Name; } if (dataVersionField.IsDummy()) { dataInstance.dataVersion = fsm.Get("version").GetValue().AsInt() + 1; } else { dataInstance.dataVersion = dataVersionField.GetValue().AsInt(); } dataInstance.states = new List <FsmStateData>(); for (int i = 0; i < states.GetChildrenCount(); i++) { FsmStateData stateData = new FsmStateData(); stateData.ActionData = new List <ActionScriptEntry>(); stateData.state = new FsmState(namer, states[i]); stateData.node = new FsmNodeData(stateData.state); GetActionData(stateData.ActionData, stateData.state.actionData, dataInstance.dataVersion); dataInstance.states.Add(stateData); } dataInstance.events = new List <FsmEventData>(); for (int i = 0; i < events.GetChildrenCount(); i++) { FsmEventData eventData = new FsmEventData(); eventData.Global = events[i].Get("isGlobal").GetValue().AsBool(); eventData.Name = events[i].Get("name").GetValue().AsString(); dataInstance.events.Add(eventData); } dataInstance.variables = new List <FsmVariableData>(); GetVariableValues(dataInstance.variables, namer, variables); dataInstance.globalTransitions = new List <FsmNodeData>(); for (int i = 0; i < globalTransitions.GetChildrenCount(); i++) { AssetTypeValueField globalTransitionField = globalTransitions[i]; FsmGlobalTransition globalTransition = new FsmGlobalTransition() { fsmEvent = new FsmEvent(globalTransitionField.Get("fsmEvent")), toState = globalTransitionField.Get("toState").GetValue().AsString(), linkStyle = globalTransitionField.Get("linkStyle").GetValue().AsInt(), linkConstraint = globalTransitionField.Get("linkConstraint").GetValue().AsInt(), colorIndex = (byte)globalTransitionField.Get("colorIndex").GetValue().AsInt() }; FsmNodeData node = new FsmNodeData(dataInstance, globalTransition); dataInstance.globalTransitions.Add(node); } //dataInstance.events = new List<FsmEventData>(); //for (int i = 0; i < events.GetChildrenCount(); i++) //{ // FsmEventData eventData = new FsmEventData(); // AssetTypeValueField evt = events[i]; // eventData.Name = evt.Get("name").GetValue().AsString(); // eventData.Global = evt.Get("isGlobal").GetValue().AsBool(); //} // //dataInstance.variables = new List<FsmVariableData>(); //for (int i = 0; i < variables.GetChildrenCount(); i++) //{ // FsmVariableData variableData = new FsmVariableData(); // AssetTypeValueField vars = events[i]; //} return(dataInstance); }
private void ReplaceReferencesRecurse(AssetsFileInstance inst, AssetTypeValueField field, AssetFileInfoEx inf) { foreach (AssetTypeValueField child in field.children) { //not a value (ie int) if (!child.templateField.hasValue) { //not null if (child == null) { return; } //not array of values either if (child.templateField.isArray && child.templateField.children[1].valueType != EnumValueTypes.ValueType_None) { break; } string typeName = child.templateField.type; //is a pptr if (typeName.StartsWith("PPtr<") && typeName.EndsWith(">") && child.childrenCount == 2) { int fileId = child.Get("m_FileID").GetValue().AsInt(); long pathId = child.Get("m_PathID").GetValue().AsInt64(); //not a null pptr if (pathId == 0) { continue; } AssetID aid = ConvertToAssetID(inst, fileId, pathId); //not already visited if (references.ContainsKey(aid)) { AssetID id = references[aid]; //normally, I would've just checked if the path names //matched up, but this is faster than looking up names //I check type of this asset and compare with the name //of the assetid to see if it should be itself or if //it should be the dependency file bool isSelfAsset = IsAsset(inf); bool isDepAsset = id.fileName == ASSET_LEVEL_NAME; int newFileId = isDepAsset ^ isSelfAsset ? 1 : 0; child.Get("m_FileID").GetValue().Set(newFileId); child.Get("m_PathID").GetValue().Set(id.pathId); } else { /////////////// todo move to another method AssetsFileInstance depInst = ConvertToInstance(inst, fileId); AssetFileInfoEx depInf = depInst.table.GetAssetInfo(pathId); if (depInf.curFileType == 0x72) { ushort scriptIndex = depInst.file.typeTree.unity5Types[depInf.curFileTypeOrIndex].scriptIndex; if (tk2dSpriteScriptIndex == 0xffff) { AssetTypeValueField monoBase = am.GetATI(depInst.file, depInf).GetBaseField(); AssetExternal scriptBaseExt = am.GetExtAsset(depInst, monoBase.Get("m_Script")); if (scriptBaseExt.instance != null) { AssetTypeValueField scriptBase = scriptBaseExt.instance.GetBaseField(); string scriptName = scriptBase.Get("m_ClassName").GetValue().AsString(); if (scriptName == "tk2dSprite") { tk2dSpriteScriptIndex = scriptIndex; } } } if (tk2dSpriteScriptIndex == depInst.file.typeTree.unity5Types[depInf.curFileTypeOrIndex].scriptIndex) { string managedPath = Path.Combine(Path.GetDirectoryName(depInst.path), "Managed"); AssetTypeValueField spriteBase = am.GetMonoBaseFieldCached(depInst, depInf, managedPath); int spriteId = spriteBase.Get("_spriteId").GetValue().AsInt(); AssetExternal colBaseExt = am.GetExtAsset(depInst, spriteBase.Get("collection")); AssetsFileInstance colInst = colBaseExt.file; AssetTypeValueField colBase = am.GetMonoBaseFieldCached(colInst, colBaseExt.info, managedPath); AssetTypeValueField spriteDefinitions = colBase.Get("spriteDefinitions")[spriteId]; AssetTypeValueField positionsField = spriteDefinitions.Get("positions"); AssetTypeValueField uvsField = spriteDefinitions.Get("uvs"); AssetTypeValueField indicesField = spriteDefinitions.Get("indices"); Vector3[] positions = new Vector3[positionsField.GetChildrenCount()]; Vector2[] uvs = new Vector2[uvsField.GetChildrenCount()]; int[] indices = new int[indicesField.GetChildrenCount()]; for (int i = 0; i < positions.Length; i++) { AssetTypeValueField positionField = positionsField[i]; positions[i] = new Vector3() { x = positionField.Get("x").GetValue().AsFloat(), y = positionField.Get("y").GetValue().AsFloat(), z = positionField.Get("z").GetValue().AsFloat() }; } for (int i = 0; i < uvs.Length; i++) { AssetTypeValueField uvField = uvsField[i]; uvs[i] = new Vector2() { x = uvField.Get("x").GetValue().AsFloat(), y = uvField.Get("y").GetValue().AsFloat() }; } for (int i = 0; i < indices.Length; i++) { AssetTypeValueField indexField = indicesField[i]; indices[i] = indexField.GetValue().AsInt(); } AssetID thisAid = ConvertToAssetID(inst, 0, inf.index); tk2dFromGoLookup[thisAid] = new Tk2dInfo(positions, uvs, indices); } } /////////////// child.Get("m_FileID").GetValue().Set(0); child.Get("m_PathID").GetValue().Set(0); } } ReplaceReferencesRecurse(inst, child, inf); } } }
public static List <T> ReadAssetList <T>(AssetNameResolver namer, AssetTypeValueField field) { List <T> data = new List <T>(); int size = field.GetChildrenCount(); switch (typeof(T)) { case Type intType when intType == typeof(int): for (int i = 0; i < size; i++) { data.Add((T)(object)field[i].GetValue().AsInt()); } return(data); case Type stringType when stringType == typeof(string): for (int i = 0; i < size; i++) { data.Add((T)(object)field[i].GetValue().AsString()); } return(data); case Type boolType when boolType == typeof(bool): for (int i = 0; i < size; i++) { data.Add((T)(object)field[i].GetValue().AsBool()); } return(data); case Type byteType when byteType == typeof(byte): for (int i = 0; i < size; i++) { data.Add((T)(object)(byte)field[i].GetValue().AsInt()); } return(data); case Type enumType when enumType.IsEnum: for (int i = 0; i < size; i++) { data.Add((T)(object)field[i].GetValue().AsInt()); } return(data); //don't use this anymore, does not have name info case Type pptrType when pptrType == typeof(AssetPPtr): for (int i = 0; i < size; i++) { data.Add((T)(object)ReadAssetPPtr(field[i])); } return(data); case Type namedPPtrType when namedPPtrType == typeof(NamedAssetPPtr): for (int i = 0; i < size; i++) { data.Add((T)(object)ReadNamedAssetPPtr(namer, field[i])); } return(data); default: //no error checking so don't put something stupid for <T> for (int i = 0; i < size; i++) { data.Add((T)Activator.CreateInstance(typeof(T), namer, field[i])); } return(data); } }