public override void OnInspectorGUI() { ; base.OnInspectorGUI(); MonsterSkinConfig pa = target as MonsterSkinConfig; pa.ColliderShape = (Collider)EditorGUILayout.ObjectField("人物碰撞盒:", pa.ColliderShape, typeof(Collider), true); pa.OcclusCollider = (Collider)EditorGUILayout.ObjectField("遮挡碰撞盒:", pa.OcclusCollider, typeof(Collider), true); EditorGUILayout.HelpBox("必须根据实际情况拖拽RightWeaponRender、" + "LeftWeraponRender、BodyRnder!" + "必须根据实际情况填写CacheCout,比如弓兵,同时存在" + "的数目大概会达到30个,这个值要填30!", MessageType.Info); }
private void ApplyMonsterSkinDataToMachine(MonsterStateMachine machine, SkinInstance instance) { MonsterSkinConfig SkinConfig = instance.entitySkinConfig as MonsterSkinConfig; if (null == SkinConfig) { Debug.LogError("切换皮肤重大错误-ApplyMonsterSkinDataToMachine"); return; } machine.animator = instance.MainAnimator; machine.RefershAnimatorDataWhenSkinChangedFinish(); instance.ReferencedSkinCtrl = this; }
private static bool CheckMonsterSkin(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("CheckMonsterSkin:skin.SkinObj 为 null!!"); return(false); } if (skin.SkinType != ENTITY_TYPE.TYPE_MONSTER) { 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_MONSTER.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); } MonsterSkinConfig msp = SkinDataObj.GetComponent <MonsterSkinConfig>(); if (!msp) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "对应的皮肤上的SkinDataObj没有MonsterSkinConfig组件,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } skin.skinConfig = msp; Animator HostAnimator = null; if (!skin.isStaticSkin) { HostAnimator = go.GetComponent <Animator>(); if (!HostAnimator) { skin.bChecked = true; skin.CheckedReslut = false; skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.SkinCheckObj = null; Debug.LogWarning("皮肤错误:" + "对应的皮肤上的MonsterStateMachineParams的HostAnimator成员为null,ID:" + skin.nSkinID + ",名字:" + go.name + ",请请[--策划--]在Unity中检查对应的皮肤预制"); return(false); } if (HostAnimator.runtimeAnimatorController == null || HostAnimator.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); } } //Editor模式下检查资源 if (Application.isEditor) { SkinnedMeshRenderer[] renders = skin.SkinCheckObj.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (SkinnedMeshRenderer r in renders) { if (!r.sharedMesh) { Debug.LogWarning(skin.ResSkinObj.AssetName + "Mesh资源丢失!请请[--策划--]检查资源或预制体"); } if (!r.sharedMaterial) { Debug.LogWarning(skin.ResSkinObj.AssetName + "材质资源丢失!请请[--策划--]检查资源或预制体"); } } } skin.ResSkinObj.DestroyInstanceRes(ref skin.SkinCheckObj); skin.bChecked = true; skin.CheckedReslut = true; skin.SkinCheckObj = null; return(true); }
private static void BuildMonsterSkinInstance(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; MonsterSkinConfig msp = SkinDataObj.GetComponent <MonsterSkinConfig>(); si.m_SkinDataObj = SkinDataObj; if (msp.ColliderShape) { msp.StandradColliderShapeSize = msp.ColliderShape.transform.localScale; } if (msp.OcclusCollider) { msp.OcclusCollider.isTrigger = true; msp.gameObject.layer = LayerMask.NameToLayer(Config.LayerWater); } si.m_entitySkinConfig = msp; si.m_SkinObj = instanceSkin; si.m_creatureProperty = SkinDataObj.GetComponent <CreatureProperty>(); si.m_ConfigScale = skin.fSkinScale; si.m_PrefabScale = instanceSkin.transform.localScale; if (!skin.isStaticSkin) { si.m_MainAnimator = instanceSkin.GetComponent <Animator>(); } bool enableAnimator = true; if (msp.BodyNeedToBakeMesh) { SkinnedMeshRenderer smr = msp.BodyRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); msp.BodyRender = MakeBakeMeshRender(smr, nod); enableAnimator = false; } } if (msp.RightWeaponNeedToBakeMesh) { SkinnedMeshRenderer smr = msp.RightWeaponRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); msp.RightWeaponRender = MakeBakeMeshRender(smr, nod); enableAnimator = false; } } if (msp.LeftWeaponNeedToBakeMesh) { SkinnedMeshRenderer smr = msp.LeftWeaponRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); msp.LeftWeaponRender = MakeBakeMeshRender(smr, nod); enableAnimator = false; } } if (msp.BackBodyNeedToBakeMesh) { SkinnedMeshRenderer smr = msp.BackBodyRender as SkinnedMeshRenderer; BakeMeshNode nod = BakeMesh(smr); if (null != nod) { skin.AllBakeMesh.Add(nod); msp.BackBodyRender = MakeBakeMeshRender(smr, nod); enableAnimator = false; } } if (!skin.isStaticSkin) { if (!enableAnimator) { si.MainAnimator.enabled = false; si.m_MainAnimator = null; } } 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>()); 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; }