Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
    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);
    }
Ejemplo n.º 4
0
    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;
    }