Esempio n. 1
0
    private static IEnumerator AsyncCreateEquip(GameObject root, Equip equip, bool load = true)
    {
        if (load)
        {
            TLEditorWww sdWww = TLEditorWww.Create("res/myshader.sd");
            while (!sdWww.Finished)
            {
                yield return(null);
            }
            sdWww.GetAsset();
            Shader.WarmupAllShaders();
        }
        TLEditorWww www = null;

        www = TLEditorWww.Create(equip.ModelPath);
        while (!www.Finished)
        {
            yield return(null);
        }

        GameObject modelObject = UnityEngine.Object.Instantiate(www.GetAsset()) as GameObject;
        Renderer   Renderer    = modelObject.GetComponentInChildren <Renderer>();

        Renderer.enabled = true;
        Renderer.sharedMaterial.shader = Shader.Find(Renderer.sharedMaterial.shader.name);
        yield return(null);

        yield return(null);//延迟两帧unload,避免unload太快,instantiate还没执行完导致贴图丢失

        RoleObject ro = root.GetComponent <RoleObject>();

        www.Unload();

        foreach (EffectConfig effectInfo in equip.Effects.Where(effectInfo => !string.IsNullOrEmpty(effectInfo.EffectAssetPath)))
        {
            TLEditorWww eff = TLEditorWww.Create(effectInfo.EffectAssetPath);
            while (!eff.Finished)
            {
                yield return(null);
            }

            GameObject effect = UnityEngine.Object.Instantiate(eff.GetAsset()) as GameObject;
            eff.Unload();
            if (effect)
            {
                Transform tf = RoleObject.FindChildTransformWithName(root, effectInfo.BindBone);
                if (!tf)
                {
                    tf = modelObject.transform;
                }

                effect.transform.parent           = tf;
                effect.transform.localPosition    = effectInfo.Position;
                effect.transform.localEulerAngles = effectInfo.Rotation;
                effect.transform.localScale       = effectInfo.Scale;
                TLEditorWww.ApplyParticleScale(effect.transform, effectInfo.Scale.x);
            }
        }

        Role config = root.gameObject.GetComponent <Role>();

        if (!config)
        {
            modelObject.transform.SetParent(root.transform);
            modelObject.transform.localPosition    = Vector3.zero;
            modelObject.transform.localEulerAngles = Vector3.zero;
            modelObject.transform.localScale       = Vector3.one;
            yield break;
        }

        SkinnedMeshRenderer skinrender = modelObject.GetComponentInChildren <SkinnedMeshRenderer>();

        if (skinrender)
        {
            if (equip.Bones != null && equip.Bones.Length > 0)
            {
                Transform[] bones = new Transform[equip.Bones.Length];
                for (int i = 0; i < equip.Bones.Length; i++)
                {
                    bones[i] = ModelLoader.FindChildByName(root.transform, equip.Bones[i]);
                }

                skinrender.bones    = bones;
                skinrender.rootBone = FindChildByName(config.transform, equip.RootBone);
            }
            skinrender.enabled = true;
        }

        Transform bindTF = FindChildByName(config.transform, equip.ParentBone);

        if (!bindTF)
        {
            bindTF = config.transform;
        }

        if (ro)
        {
            ro.Skins.Add(modelObject);
        }

        Animation ani = modelObject.GetComponent <Animation>();

        if (ani)
        {
            ro.Animations.Add(ani);
        }

        modelObject.transform.SetParent(bindTF);
        modelObject.transform.localPosition    = Vector3.zero;
        modelObject.transform.localEulerAngles = Vector3.zero;
        modelObject.transform.localScale       = Vector3.one;
        modelObject.layer = ro.modelLayer;
    }
Esempio n. 2
0
    private static void AsyncCreateEquip(GameObject root, Equip equip, bool high, bool load = true)
    {
        string model = equip.ModelPath;

        string[] bones = equip.Bones;
        if (high && !string.IsNullOrEmpty(equip.HighModelPath))
        {
            model = equip.HighModelPath;
            bones = equip.HighBones;
        }

        GameObject modelObject = UnityEngine.Object.Instantiate(EditorWww.Create(model)) as GameObject;
        Renderer   Renderer    = modelObject.GetComponentInChildren <Renderer>();

        Renderer.enabled = true;
        Renderer.sharedMaterial.shader = Shader.Find(Renderer.sharedMaterial.shader.name);
        RoleObject ro = root.GetComponent <RoleObject>();

        foreach (EffectConfig effectInfo in equip.Effects)
        {
            string path = effectInfo.EffectAssetPath;
            if (!high && !string.IsNullOrEmpty(effectInfo.LowEffectAssetPath))
            {
                path = effectInfo.LowEffectAssetPath;
            }

            if (string.IsNullOrEmpty(path))
            {
                continue;
            }

            GameObject effect = UnityEngine.Object.Instantiate(EditorWww.Create(effectInfo.EffectAssetPath)) as GameObject;
            if (effect)
            {
                Transform tf = RoleObject.FindChildTransformWithName(root, effectInfo.BindBone);
                if (!tf)
                {
                    tf = modelObject.transform;
                }

                effect.transform.parent           = tf;
                effect.transform.localPosition    = effectInfo.Position;
                effect.transform.localEulerAngles = effectInfo.Rotation;
                effect.transform.localScale       = effectInfo.Scale;
            }
        }

        Role config = root.gameObject.GetComponent <Role>();

        if (!config)
        {
            modelObject.transform.SetParent(root.transform);
            modelObject.transform.localPosition    = Vector3.zero;
            modelObject.transform.localEulerAngles = Vector3.zero;
            modelObject.transform.localScale       = Vector3.one;
            return;
        }

        SwingBone[] swingBones = config.GetComponentsInChildren <SwingBone>(true);
        for (int i = 0; i < swingBones.Length; i++)
        {
            swingBones[i].enabled = true;
            swingBones[i].gameObject.SetActive(true);
        }

        SkinnedMeshRenderer skinrender = modelObject.GetComponentInChildren <SkinnedMeshRenderer>();

        if (skinrender)
        {
            if (bones != null && bones.Length > 0)
            {
                Transform[] bonetfs = new Transform[bones.Length];
                for (int i = 0; i < bones.Length; i++)
                {
                    bonetfs[i] = ModelLoader.FindChildByName(root.transform, bones[i]);
                }

                skinrender.bones    = bonetfs;
                skinrender.rootBone = FindChildByName(config.transform, equip.RootBone);
            }
            skinrender.enabled = true;
        }

        Transform bindTF = FindChildByName(config.transform, equip.ParentBone);

        if (!bindTF)
        {
            bindTF = config.transform;
        }

        if (ro)
        {
            ro.Skins.Add(modelObject);
        }

        Animation ani = modelObject.GetComponent <Animation>();

        if (ani)
        {
            ro.Animations.Add(ani);
        }

        modelObject.transform.SetParent(bindTF);
        modelObject.transform.localPosition    = Vector3.zero;
        modelObject.transform.localEulerAngles = Vector3.zero;
        modelObject.transform.localScale       = Vector3.one;
        modelObject.layer = ro.modelLayer;
    }