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