Esempio n. 1
0
        /// <summary>
        /// 设置套装特效
        /// </summary>
        /// <param name="effect_id_list"></param>
        /// <returns></returns>
        private static IEnumerator SetSuitEffect(GameObject model, AvatarProperty ap, bool isLocalPlayer = true)
        {
            List <uint> effect_id_list = ap.SuitEffectIds;

            if (effect_id_list == null || effect_id_list.Count == 0 || model == null)
            {
                yield break;
            }

            // 屏蔽特效显示

            /*if (!EnableEffect)
             * {
             *  if (mOwner == null || !mOwner.UID.Equals(Game.GetInstance().LocalPlayerID))
             *      yield return null;
             * }*/

            //var avartaPartData = DBManager.GetInstance().GetDB<DBAvatarPart>().mData;

            foreach (var id in effect_id_list)
            {
                var effect_id = id;
                if (id == 1 || id == 2)
                {
                    effect_id = id == 1 ? ap.BodyId : ap.WeaponId;
                }

                var effect_info = DBManager.Instance.GetDB <DBSuitEffect>().GetEffectInfo(effect_id);
                if (effect_info == null)
                {
                    GameDebug.Log("Cannot find suit effect info, id: " + effect_id);
                    continue;
                }

                // 检查特效id是否与当前的装备或武器匹配
                if (effect_info.effect_type == 1)
                {
                    if (effect_id != ap.BodyId)
                    {
                        continue;
                    }
                }
                else if (effect_info.effect_type == 2)
                {
                    if (effect_id != ap.WeaponId)
                    {
                        continue;
                    }
                }

                bool is_local_player_model = isLocalPlayer;
                foreach (var bind_info in effect_info.bind_infos)
                {
                    // 本地玩家才使用高配的特效
                    string res_path = "";

                    if (is_local_player_model)                // 本地玩家
                    {
                        if (QualitySetting.GraphicLevel == 2) // 低配也使用低配特效
                        {
                            res_path = ModelHelper.GetModelPrefab(bind_info.low_model_id);
                        }
                        else
                        {
                            res_path = ModelHelper.GetModelPrefab(bind_info.model_id);
                        }
                    }
                    else// 其他玩家
                    {
                        res_path = ModelHelper.GetModelPrefab(bind_info.low_model_id);
                    }

                    if (string.IsNullOrEmpty(res_path))
                    {
                        GameDebug.LogError("Cannot find suit res info, model_id: " + bind_info.model_id);
                        continue;
                    }

                    var mount_point = CommonTool.FindChildInHierarchy(model.transform, bind_info.bind_node);
                    if (mount_point == null)
                    {
                        GameDebug.LogError("Cannot find suit mount point, bind_node: " + bind_info.bind_node);
                        continue;
                    }

                    ObjectWrapper ow = new ObjectWrapper();
                    yield return(ResourceLoader.Instance.StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(res_path, ObjCachePoolType.SFX, res_path, ow)));

                    GameObject effect_object = ow.obj as GameObject;

                    if (effect_object == null)
                    {
                        GameDebug.LogError("Cannot load suit effect point, res_path: " + res_path);
                        continue;
                    }

                    GameObject.DontDestroyOnLoad(effect_object);
                    if (model == null)
                    {
                        ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, res_path);
                        break;
                    }

                    //int layer = 0;
                    //if (mModelParent != null)
                    //    layer = mModelParent.layer;
                    //SetRenderLayer(effect_object, layer, false, false);
                    //m_EffectObjs[res_path] = effect_object;

                    var trans = effect_object.transform;
                    trans.parent        = mount_point;
                    trans.localPosition = Vector3.zero;
                    trans.localRotation = Quaternion.identity;
                    trans.localScale    = Vector3.one;

                    ListTrailRenderer trail_render_list = effect_object.GetComponent <ListTrailRenderer>();
                    if (trail_render_list == null)
                    {
                        trail_render_list = effect_object.AddComponent <ListTrailRenderer>();
                    }
                    if (trail_render_list != null)
                    {
                        trail_render_list.ResetPos();
                    }

                    // 设置层级
                    xc.ui.ugui.UIHelper.SetLayer(effect_object.transform, model.layer);
                }
            }
        }
Esempio n. 2
0
        private static IEnumerator ChangePart(GameObject model, uint partId, bool isLocalPlayer = true)
        {
            if (model == null)
            {
                yield break;
            }

            DBAvatarPart.Data data      = DBManager.Instance.GetDB <DBAvatarPart>().mData[partId];
            string            part_name = data.part == DBAvatarPart.BODY_PART.BODY ? xc.AvatarCtrl.BODY_NAME : xc.AvatarCtrl.WEAPON_NAME;

            // 查找旧资源中的换装节点
            Transform old_part = CommonTool.FindChildInHierarchy(model.transform, part_name);

            if (old_part == null)
            {
                Debug.LogError(string.Format("the model {0} does not have a part named {1}", model.name, part_name));
                yield break;
            }
            string path = data.SuitablePath(isLocalPlayer);
            // 加载换装部件的模型
            AssetResource ar = new AssetResource();

            yield return(ResourceLoader.Instance.StartCoroutine(ResourceLoader.Instance.load_asset(string.Format("{0}/{1}.prefab", xc.AvatarCtrl.AVATAR_PATH_PREFIX, path), typeof(GameObject), ar)));

            GameObject gameObjectAsset = ar.asset_ as GameObject;

            if (gameObjectAsset == null)
            {
                Debug.LogError(string.Format("the res {0} does not exist", path));
                yield break;
            }

            if (model == null)
            {
                ar.destroy();
                yield break;
            }

            old_part = CommonTool.FindChildInHierarchy(model.transform, part_name);
            if (old_part == null)
            {
                Debug.LogError(string.Format("the model {0} does not have a part named {1}", model.name, part_name));
                ar.destroy();
                yield break;
            }

            // 将asset资源的生命周期与角色GameObject关联起来
            ResourceUtilEx.Instance.host_res_to_gameobj(model, ar);

            // 查找新资源的换装节点
            Transform new_part = CommonTool.FindChildInHierarchy(gameObjectAsset.transform, part_name);

            if (new_part == null)
            {
                Debug.LogError(string.Format("the model {0} does not have a part named {1}", gameObjectAsset.name, part_name));
                yield break;
            }

            SkinnedMeshRenderer new_mesh_renderer = new_part.GetComponent <SkinnedMeshRenderer>();
            SkinnedMeshRenderer old_mesh_renderer = old_part.GetComponent <SkinnedMeshRenderer>();

            Transform[] old_bones = (Transform[])old_part.GetComponent <SkinnedMeshRenderer>().bones.Clone();
            ReplaceSkinnedMesh(old_bones, model, old_mesh_renderer, new_mesh_renderer);
        }
Esempio n. 3
0
        IEnumerator LoadStandEffect(string fileName)
        {
            GameObject model = mOwner.mAvatarCtrl.GetModel();

            if (model == null)
            {
                yield break;
            }

            RemoveStandEffect();
            Transform pos = CommonTool.FindChildInHierarchy(model.transform, AvatarCtrl.ROOT_NODE);

            if (pos == null)
            {
                Debug.LogError(string.Format("not found footprint point on {0}", model.name));
                yield break;
            }
            ObjectWrapper ow = new ObjectWrapper();

            yield return(ResourceLoader.Instance.StartCoroutine(ObjCachePoolMgr.Instance.LoadPrefab(fileName, ObjCachePoolType.SFX, fileName, ow)));

            GameObject effect_object = ow.obj as GameObject;

            if (effect_object == null)
            {
                yield break;
            }

            GameObject.DontDestroyOnLoad(effect_object);

            if (mIsDestroy || fileName != mStandEffectFile)
            {
                ObjCachePoolMgr.Instance.RecyclePrefab(effect_object, ObjCachePoolType.SFX, fileName);
                yield break;
            }
            RemoveStandEffect();

            if (mStandEffectContainer == null)
            {
                mStandEffectContainer = new GameObject("FootprintContainer");
            }
            mStandEffectContainer.transform.parent           = pos;
            mStandEffectContainer.transform.localPosition    = Vector3.zero;
            mStandEffectContainer.transform.localEulerAngles = new Vector3(0, 0, 0);
            mStandEffectContainer.transform.localScale       = Vector3.one;

            effect_object.transform.parent           = mStandEffectContainer.transform;
            effect_object.transform.localPosition    = Vector3.zero;
            effect_object.transform.localEulerAngles = new Vector3(0, 0, 0);
            effect_object.transform.localScale       = Vector3.one;

            int layer = 0;

            if (mOwner.mAvatarCtrl.GetModelParent() != null)
            {
                layer = mOwner.mAvatarCtrl.GetModelParent().layer;
            }
            mOwner.mAvatarCtrl.SetRenderLayer(effect_object, layer, false, false);

            mStandEffectInfo = new SceneEffectInfo(fileName, 0, effect_object);
        }