Esempio n. 1
0
    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;
    }
Esempio n. 2
0
    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);
    }