private static void MapBones(MechSkeleton mechSkeleton, SkinnedMeshRenderer newPart, SkinnedMeshRenderer partToSwitch) { Transform[] MyBones = new Transform[newPart.bones.Length]; Transform rootBone = mechSkeleton.RootBone; for (var i = 0; i < newPart.bones.Length; i++) { if (newPart.bones[i].name.Contains(newPart.name)) { string boneName = newPart.bones[i].name.Remove(0, 6); string boneToFind = "Bip01" + boneName; MyBones[i] = TransformExtension.FindDeepChild(rootBone, boneToFind); } if (MyBones[i] == null) { MyBones[i] = TransformExtension.FindDeepChild(rootBone.transform, newPart.bones[i].name, newPart.bones[i].parent.name); } if (MyBones[i] == null) { Transform parent; if (newPart.bones[i].parent.name == "Bip01") //the root bone is not checked { rootBone.transform.rotation = Quaternion.identity; parent = rootBone.transform; GameObject newbone = new GameObject(newPart.bones[i].name); //TODO : improve this (mesh on hip has rotation bug , temp. use this to solve) newbone.transform.parent = parent; newbone.transform.localPosition = Vector3.zero; newbone.transform.localRotation = Quaternion.Euler(0, 0, 90); newbone.transform.localScale = new Vector3(1, 1, 1); MyBones[i] = newbone.transform; } else { parent = TransformExtension.FindDeepChild(rootBone.transform, newPart.bones[i].parent.name); MyBones[i] = parent; } if (parent == null) { Debug.LogError("Can't locate the bone : " + newPart.bones[i].name); } } } partToSwitch.bones = MyBones; }
public static void Build(BundledResourceManager resourceManager, MechPresentationSetup mechPresentationSetup, MechSkeleton mechSkeleton, MechSettings mechSettings, bool server) { var mechPartRegistry = resourceManager.GetResourceRegistry <MechPartRegistry>(); // Create new array to store skinned mesh renderers SkinnedMeshRenderer[] newSMR = new SkinnedMeshRenderer[4]; var partPrefabs = new Object[5]; HeadPartAsset head = mechPartRegistry.heads[mechSettings.Head]; partPrefabs[0] = resourceManager.GetSingleAssetResource(head.Prefab); CorePartAsset core = mechPartRegistry.cores[mechSettings.Core]; partPrefabs[1] = resourceManager.GetSingleAssetResource(core.Prefab); ArmsPartAsset arms = mechPartRegistry.arms[mechSettings.Arms]; partPrefabs[2] = resourceManager.GetSingleAssetResource(arms.Prefab); LegsPartAsset legs = mechPartRegistry.legs[mechSettings.Legs]; partPrefabs[3] = resourceManager.GetSingleAssetResource(legs.Prefab); BoosterPartAsset booster = mechPartRegistry.boosters[mechSettings.Booster]; partPrefabs[4] = resourceManager.GetSingleAssetResource(booster.Prefab); //Extract Skinned Mesh for (int i = 0; i < 4; i++) { newSMR[i] = ((GameObject)partPrefabs[i]).GetComponentInChildren <SkinnedMeshRenderer>(); } // Replace all SkinnedMeshRenderer[] curSMR = mechPresentationSetup.CurSMRs; for (int i = 0; i < 4; i++) //TODO : remake the order part //Note the order of parts in MechFrame.prefab matters { if (newSMR[i] == null) { Debug.LogError(i + " is null."); continue; } MapBones(mechSkeleton, newSMR[i], curSMR[i]); curSMR[i].sharedMesh = newSMR[i].sharedMesh; //Material[] mats = new Material[2]; //mats[0] = Resources.Load("MechPartMaterials/" + partPrefabs[i].name + "mat", typeof(Material)) as Material; //mats[1] = Resources.Load("MechPartMaterials/" + partPrefabs[i].name + "_2mat", typeof(Material)) as Material; //curSMR[i].materials = mats; curSMR[i].enabled = true; } //Load booster Transform boosterbone = mechSkeleton.BoosterBone; //Destroy previous booster GameObject preBooster = (boosterbone.childCount == 0) ? null : boosterbone.GetChild(0).gameObject; if (preBooster != null) { GameObject.DestroyImmediate(preBooster); } GameObject newBooster = GameObject.Instantiate((GameObject)partPrefabs[4], boosterbone); newBooster.transform.localPosition = Vector3.zero; newBooster.transform.localRotation = Quaternion.Euler(90, 0, 0); }