private void ApplyPersonSkinDataToMachine(CreatureStateMachine machine, SkinInstance instance) { PersonSkinConfig SkinConfig = instance.entitySkinConfig as PersonSkinConfig; if (null == SkinConfig) { Debug.LogError("切换皮肤重大错误-ApplyPersonSkinDataToMachine"); return; } m_machine.animator = instance.MainAnimator; m_machine.animatorCtrl.weaponAnimator = instance.weaponAnimator; m_machine.animatorCtrl.weaponAnimator2 = instance.weaponAnimator2; if (SkinConfig.AttackAnimatorLayer > 0) { m_machine.animatorCtrl.ana = instance.MainAnimator; m_machine.animatorCtrl.anb = instance.MainAnimator; m_machine.animatorCtrl.anc = null; m_machine.moveAnimatorLayer = 0; } else { m_machine.animatorCtrl.anc = instance.bipedIKAnimator; m_machine.animatorCtrl.ana = instance.MainAnimator; m_machine.animatorCtrl.anb = instance.AnimatorB; } m_machine.attackAnimatorLayer = SkinConfig.AttackAnimatorLayer; instance.ReferencedSkinCtrl = this; }
public override void OnInspectorGUI() { base.OnInspectorGUI(); PersonSkinConfig pa = target as PersonSkinConfig; pa.Main = (Transform)EditorGUILayout.ObjectField("Main:", pa.Main, typeof(Transform), true); pa.Root_M = (Transform)EditorGUILayout.ObjectField("Root_M:", pa.Root_M, typeof(Transform), true); pa.BackA_M = (Transform)EditorGUILayout.ObjectField("BackA_M:", pa.BackA_M, typeof(Transform), true); pa.Root_MCopy = (Transform)EditorGUILayout.ObjectField("Root_MCopy:", pa.Root_MCopy, typeof(Transform), true); pa.weaponObject = (Transform)EditorGUILayout.ObjectField("weaponObject:", pa.weaponObject, typeof(Transform), true); pa.weaponObject2 = (Transform)EditorGUILayout.ObjectField("weaponObject2:", pa.weaponObject2, typeof(Transform), true); pa.adjustSpine = EditorGUILayout.Toggle("adjustSpine:", pa.adjustSpine); pa.RootAReplace = EditorGUILayout.Toggle("RootAReplace:", pa.RootAReplace); pa.AttackAnimatorLayer = EditorGUILayout.IntField("上下半身分离的攻击层位置,0表示用旧版IK做上下半身分离:", pa.AttackAnimatorLayer); if (pa.AttackAnimatorLayer >= 0) { pa.controllerA = null; pa.controllerB = null; } else { pa.controllerA = (RuntimeAnimatorController)EditorGUILayout.ObjectField("controllerA:", pa.controllerA, typeof(RuntimeAnimatorController), false); pa.controllerB = (RuntimeAnimatorController)EditorGUILayout.ObjectField("controllerB:", pa.controllerB, typeof(RuntimeAnimatorController), false); } pa.rootAngleWithAim = EditorGUILayout.Vector3Field("rootAngleWithAim:", pa.rootAngleWithAim); pa.progressWeight = EditorGUILayout.Toggle("progressWeight:", pa.progressWeight); pa.lookAngleScale = EditorGUILayout.FloatField("弯腰瞄准程度(0-1):", pa.lookAngleScale); pa.lookRefTransform = (Transform)EditorGUILayout.ObjectField("弯腰瞄准参考骨骼:", pa.lookRefTransform, typeof(Transform), true); pa.ScreenCastObject = (GameObject)EditorGUILayout.ObjectField("ScreenCastObject:", pa.ScreenCastObject, typeof(GameObject), true); pa.jumpDeltyTick = EditorGUILayout.IntField("jumpDeltyTick:", pa.jumpDeltyTick); pa.maxFallSpeed = EditorGUILayout.FloatField("maxFallSpeed:", pa.maxFallSpeed); pa.MorphHip = EditorGUILayout.Toggle("MorphHip:", pa.MorphHip); EditorGUILayout.HelpBox("必须根据实际情况拖拽RightWeaponRender、" + "LeftWeraponRender、BodyRnder!" + "必须根据实际情况填写CacheCout,比如弓兵,同时存在" + "的数目大概会达到30个,这个值要填30!", MessageType.Info); }
private static bool CheckPlayerSkin(Skin skin) { if (skin.bChecked) { return(skin.CheckedReslut); } if (null == skin.ResSkinObj || !skin.ResSkinObj.IsValid()) { skin.bChecked = true; skin.CheckedReslut = false; return(false); } skin.SkinCheckObj = skin.ResSkinObj.InstanceMainRes(); if (!skin.SkinCheckObj) { skin.bChecked = true; skin.CheckedReslut = false; Debug.LogWarning("CheckPlayerSkin:skin.SkinObj 为 null!!"); return(false); } if (skin.SkinType != ENTITY_TYPE.TYPE_PLAYER_ROLE) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "类型与皮肤类型不一致" + "ID:" + skin.nSkinID + ",名字:" + "," + "目标类型" + skin.SkinType.ToString() + ",需要类型:" + ENTITY_TYPE.TYPE_PLAYER_ROLE.ToString() + ",请请[--策划--]检查配置文件"); return(false); } GameObject go = skin.SkinCheckObj; //先检查skinnedmeshrender,对于animator来说,如果skinnedmeshrender丢失的话,打包的时候会崩溃 //所以要检查每一个预制体的skinned是否正常 SkinnedMeshRenderer[] allSkinneds = go.GetComponentsInChildren <SkinnedMeshRenderer>(true); foreach (SkinnedMeshRenderer sk in allSkinneds) { if (!sk.sharedMesh) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("ID:" + skin.nSkinID + ",名字:" + go.name + "丢失mesh,请[策划]检查资源"); return(false); } } Transform SkinDataTransform = go.transform.FindChild("SkinDataObj"); GameObject SkinDataObj = null; if (null != SkinDataTransform) { SkinDataObj = SkinDataTransform.gameObject; } else { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "对应皮肤预制体找不到SkinDataObj" + "ID:" + skin.nSkinID + ",名字:" + go.name + "请请[--策划--]检查预制体!"); return(false); } CreatureProperty cp = SkinDataObj.GetComponent <CreatureProperty>(); if (!cp) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "对应的皮肤上的SkinDataObj没有CreatureProperty组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } PersonSkinConfig msp = SkinDataObj.GetComponent <PersonSkinConfig>(); if (!msp) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "对应的皮肤上的SkinDataObj没有PersonSkinConfig组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } skin.skinConfig = msp; Animator ani = go.GetComponent <Animator>(); if (!ani) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:对应的皮肤上没有Animator组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } if (ani.runtimeAnimatorController == null || ani.avatar == null) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:对应的皮肤上的Animator中Controller或者avator为null,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } CharacterController con = SkinDataObj.GetComponent <CharacterController>(); if (!con) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:对应的皮肤上的SkinDataObj没有CharacterController组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } CameraProperty cpp = SkinDataObj.GetComponent <CameraProperty>(); if (!cpp) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:对应的的SkinDataObj皮肤上没有CameraProperty组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } //Editor模式下检查资源 if (Application.isEditor) { SkinnedMeshRenderer[] renders = skin.SkinCheckObj.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (SkinnedMeshRenderer r in renders) { if (!r.sharedMesh) { Trace.Warning(skin.ResSkinObj.AssetName + "Mesh资源丢失!请请[--策划--]检查资源或预制体"); } if (!r.sharedMaterial) { Trace.Warning(skin.ResSkinObj.AssetName + "材质资源丢失!请请[--策划--]检查资源或预制体"); } } } skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.bChecked = true; skin.CheckedReslut = true; skin.SkinCheckObj = null; return(true); }
private void OnSkinLoadFinish(Skin skin) { if (skin == null) { return; } //回调的,跟当前ID不匹配,卸载这个皮肤 if (skin.nSkinID != currentSkinId) { if (m_currentLoadedSkinInstance != null) { if (m_currentLoadedSkinInstance.isValid) { //看看当前的skininstance是不是与skin的ID一样 if (m_currentLoadedSkinInstance.nSkinID == skin.nSkinID) { SkinManager.CacheSkinInstance(m_currentLoadedSkinInstance); m_currentLoadedSkinInstance = null; } } } RemoveCallBack(skin.nSkinID); SkinManager.DeleteSkinAsync(skin.nSkinID, OnSkinLoadFinish, NotReleaseFromCache); return; } //如果已经被裁剪了,卸载这个皮肤 if (isCull && SkinManager.enabledSkinCull) { if (m_currentLoadedSkinInstance != null) { if (m_currentLoadedSkinInstance.isValid) { //看看当前的skininstance是不是与skin的ID一样 if (m_currentLoadedSkinInstance.nSkinID == skin.nSkinID) { SkinManager.CacheSkinInstance(m_currentLoadedSkinInstance); m_currentLoadedSkinInstance = null; } } } SkinManager.DeleteSkinAsync(skin.nSkinID, OnSkinLoadFinish, NotReleaseFromCache); return; } if (m_currentLoadedSkinInstance != null) { if (m_currentLoadedSkinInstance.isValid) { SkinManager.CacheSkinInstance(m_currentLoadedSkinInstance); RemoveCallBack(m_currentLoadedSkinInstance.nSkinID); SkinManager.DeleteSkinAsync(m_currentLoadedSkinInstance.nSkinID, OnSkinLoadFinish, NotReleaseFromCache); m_currentLoadedSkinInstance = null; } } SkinControlAsyncLoadingObj obj = AllocSkinControlAsyncLoadingObj(skin.nSkinID); if (m_ChangeSkinData.ContainsKey(skin.nSkinID)) { obj.loadFinish = true; } SkinInstance si = skin.Instantiate_Main(); if (si == null) { m_currentLoadedSkinInstance = null; ClearPersonSkinDataFromMachine(m_machine); return; } GameUtil.SetLayer(m_machine.creature.gameObject.layer, si.SkinObj, true); m_currentLoadedSkinInstance = si; PersonSkinConfig psp = si.entitySkinConfig as PersonSkinConfig; si.SkinObj.transform.parent = transform; si.SkinObj.transform.localPosition = Vector3.zero; si.SkinObj.transform.localRotation = Quaternion.identity; si.SkinObj.transform.name = skin.ResSkinObj.AssetName + "-skin" + skin.nSkinID + "_C";; if (psp.AttackAnimatorLayer <= 0) { si.SkinObj_A.transform.parent = transform; si.SkinObj_B.transform.parent = transform; } if (si.SkinObj_A) { si.SkinObj_A.transform.parent = transform; si.SkinObj_A.transform.localPosition = new Vector3(-1.0f, 0.0f, 0.0f); si.SkinObj_A.transform.localRotation = Quaternion.identity; si.SkinObj_A.name = skin.ResSkinObj.AssetName + "-skin" + skin.nSkinID + "_A"; } if (si.SkinObj_B) { si.SkinObj_B.transform.parent = transform; si.SkinObj_B.transform.localPosition = new Vector3(-1.0f, 0.0f, 0.0f); si.SkinObj_B.transform.localRotation = Quaternion.identity; si.SkinObj_B.name = skin.ResSkinObj.AssetName + "-skin" + skin.nSkinID + "_A"; } foreach (RenderVisibleHelper skre in si.VisibleHelperList) { skre.hostSkin = null; } foreach (RenderVisibleHelper skre in si.VisibleHelperList) { skre.hostSkin = this; } ApplyStateData(m_currStateData); ApplyPersonSkinDataToMachine(m_machine, si); }
private static void BuildPlayerSkinInstance(Skin skin, GameObject instanceSkin, ref SkinInstance si) { if (!skin.isValid) { return; } if (null == si) { si = new SkinInstance(); si.m_nSkinID = skin.nSkinID; } si.m_SkinType = skin.SkinType; Transform SkinDataObj = instanceSkin.transform.FindChild("SkinDataObj"); SkinDataObj.localPosition = Vector3.zero; SkinDataObj.localRotation = Quaternion.identity; SkinDataObj.localScale = Vector3.one; PersonSkinConfig psc = SkinDataObj.GetComponent <PersonSkinConfig>(); si.m_SkinDataObj = SkinDataObj; si.m_SkinObj = instanceSkin; si.m_characterController = SkinDataObj.GetComponent <CharacterController>(); si.m_characterController.enabled = false; si.m_entitySkinConfig = psc; si.m_cameraProperty = SkinDataObj.GetComponent <CameraProperty>(); if (psc.AttackAnimatorLayer > 0) { si.m_MainAnimator = instanceSkin.GetComponent <Animator>(); si.m_AnimatorB = si.MainAnimator; si.m_overrideController = new AnimatorOverrideController(); si.orginalAnimatorController = si.MainAnimator.runtimeAnimatorController; si.overrideController.runtimeAnimatorController = si.orginalAnimatorController; si.MainAnimator.runtimeAnimatorController = si.overrideController; } else { Debug.LogError("BuildPlayerSkinInstance--- psc.AttackAnimatorLayer <= 0"); } //else //{ // Debug.Log("--------------皮肤调试信息-----------------------" + instanceSkin.name); // GameObject goa = CreateSkinObject(skin, false, psc.controllerA); // GameObject gob = CreateSkinObject(skin, false, psc.controllerB); // Transform skina = goa.transform.FindChild("SkinDataObj"); // if (skina != null) // { // var temp = skina.gameObject; // ResNode.DestroyRes(ref temp); // } // Transform skinb = gob.transform.FindChild("SkinDataObj"); // if (skinb != null) // { // var temp = skinb.gameObject; // ResNode.DestroyRes(ref temp); // } // Renderer[] rsa = goa.GetComponentsInChildren<Renderer>(); // foreach (Renderer ra in rsa) // { // var temp = ra; // ResNode.DestroyRes(ref temp); // } // Renderer[] rsb = gob.GetComponentsInChildren<Renderer>(); // foreach (Renderer rb in rsb) // { // var temp = rb; // ResNode.DestroyRes(ref temp); // } // si.MainAnimator = goa.GetComponent<Animator>(); // si.AnimatorB = gob.GetComponent<Animator>(); // Animator anoldc = instanceSkin.GetComponent<Animator>(); // if (anoldc != null) // { // ResNode.DestroyRes(ref anoldc); // } // si.bipedIKAnimator = instanceSkin.AddComponent<BipedIKAnimator>(); // si.bipedIKAnimator.goA = goa; // si.bipedIKAnimator.goB = gob; // si.bipedIKAnimator.Build(); // si.SkinObj_A = goa; // si.SkinObj_B = gob; //} si.MainAnimator.applyRootMotion = false; si.MainAnimator.cullingMode = AnimatorCullingMode.AlwaysAnimate;//有的动作会飞出屏幕,所以需要这个 si.AnimatorB.applyRootMotion = false; // si.AnimatorB.cullingMode = AnimatorCullingMode.AlwaysAnimate; si.m_bindSound = instanceSkin.AddComponent <BindSound>(); si.m_bindEffect_A = instanceSkin.AddComponent <BindEffect>(); if (si.SkinObj_B) { si.m_bindEffect_B = si.SkinObj_B.AddComponent <BindEffect>(); } else { si.m_bindEffect_B = instanceSkin.AddComponent <BindEffect>(); } if (psc.weaponObject) { si.m_weaponAnimator = psc.weaponObject.GetComponent <Animator>(); } if (psc.weaponObject2) { si.m_weaponAnimator2 = psc.weaponObject2.GetComponent <Animator>(); } si.m_creatureProperty = SkinDataObj.GetComponent <CreatureProperty>(); si.m_sidekickEntity = SkinDataObj.GetComponent <SidekickEntity>(); if (si.sidekickEntity) { si.sidekickEntity.init(); } si.m_ConfigScale = skin.fSkinScale; si.m_PrefabScale = instanceSkin.transform.localScale; if (psc.BodyNeedToBakeMesh) { SkinnedMeshRenderer smr = psc.BodyRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); psc.BodyRender = MakeBakeMeshRender(smr, nod); } } if (psc.RightWeaponNeedToBakeMesh) { SkinnedMeshRenderer smr = psc.RightWeaponRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); psc.RightWeaponRender = MakeBakeMeshRender(smr, nod); } } if (psc.LeftWeaponNeedToBakeMesh) { SkinnedMeshRenderer smr = psc.LeftWeaponRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); psc.LeftWeaponRender = MakeBakeMeshRender(smr, nod); } } if (psc.BackBodyNeedToBakeMesh) { SkinnedMeshRenderer smr = psc.BackBodyRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); psc.BackBodyRender = MakeBakeMeshRender(smr, nod); } } si.m_characterShadow = instanceSkin.AddComponent <CharacterShadow>(); si.m_characterShadow.Bake(instanceSkin.transform, psc.BodyRender); si.m_characterShadow.Init(Initialize.mainCam); //si.m_characterShadow.enabled = false; si.m_switchEffectWithHeroDistance = SkinDataObj.GetComponent <Effect.SwitchEffectWithHeroDistance>(); si.m_playEntityStaticEffect = SkinDataObj.GetComponent <Effect.Effect_PlayEntityStaticEffect>(); si.SkinnedMeshRenderList.AddRange(instanceSkin.GetComponentsInChildren <SkinnedMeshRenderer>()); si.MeshRenderList.AddRange(instanceSkin.GetComponentsInChildren <MeshRenderer>()); foreach (SkinnedMeshRenderer skr in si.SkinnedMeshRenderList) { RenderVisibleHelper vb = skr.gameObject.AddComponent <RenderVisibleHelper>(); si.VisibleHelperList.Add(vb); } int length = si.SkinnedMeshRenderList.Count; //移除skindataobj下的物体 for (int k = 0; k < length; k++) { si.SkinnedMeshRenderList[k].motionVectors = false; si.SkinnedMeshRenderList[k].skinnedMotionVectors = false; Transform t = si.SkinnedMeshRenderList[k].transform; if (t.IsChildOf(SkinDataObj.transform)) { si.SkinnedMeshRenderList.RemoveAt(k); } else { si.AllRenders.Add(si.SkinnedMeshRenderList[k]); } } length = si.MeshRenderList.Count; //移除skindataobj下的物体 for (int k = 0; k < length; k++) { si.MeshRenderList[k].motionVectors = false; Transform t = si.MeshRenderList[k].transform; if (t.IsChildOf(SkinDataObj.transform)) { si.MeshRenderList.RemoveAt(k); } else { si.AllRenders.Add(si.MeshRenderList[k]); } } if (si.playEntityStaticEffect) { si.playEntityStaticEffect.Init(); } si.Init(); return; }