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; }
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; }