示例#1
0
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// 注册动作事件
        /// </summary>
        /// <param name="pHandle"></param>
        public void registerAnimationEvent(ModelObjectBehaviour.animationEventDelegate pHandle)
        {
            if (pHandle != null && _pModelRoot != null)
            {
                ModelObjectBehaviour csModelObjBhv = _pModelRoot.GetComponent <ModelObjectBehaviour>();
                if (csModelObjBhv != null)
                {
                    csModelObjBhv.onAnimationEvent = pHandle;
                }
            }
        }
示例#2
0
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// 创建模型
        /// </summary>
        public void createModel()
        {
            if (_pModelRoot == null)
            {
                return;
            }

            //合并网格
            List <CombineInstance> combineInstances = new List <CombineInstance>();
            List <Transform>       bones            = new List <Transform>();

            materials = new List <Material>();
            Bounds localBounds = new Bounds(new Vector3(0, 1.0f, 0), new Vector3(2, 2, 2));

            Transform[] transforms = _pModelRoot.GetComponentsInChildren <Transform>();

            if (true)
            {
                foreach (ModelElement element in _listElement)
                {
                    if (element == null)
                    {
                        continue;
                    }

                    SkinnedMeshRenderer smr = element.getSkinnedMeshRender();
                    if (smr == null)
                    {
                        continue;
                    }

                    materials.AddRange(smr.materials);

                    //保存主体部件的AABB盒
                    if (element.isMainBody())
                    {
                        //localBounds = smr.bounds;
                    }

                    //合并网格
                    for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
                    {
                        CombineInstance ci = new CombineInstance();
                        ci.mesh         = smr.sharedMesh;
                        ci.subMeshIndex = sub;
                        combineInstances.Add(ci);
                    }

                    // As the SkinnedMeshRenders are stored in assetbundles that do not
                    // contain their bones (those are stored in the characterbase assetbundles)
                    // we need to collect references to the bones we are using
                    foreach (string bone in element.getBones())
                    {
                        foreach (Transform transform in transforms)
                        {
                            if (transform.name != bone)
                            {
                                continue;
                            }
                            bones.Add(transform);
                            break;
                        }
                    }

                    UnityEngine.Object.Destroy(smr.gameObject);
                }

                SkinnedMeshRenderer skmr = _pModelRoot.GetComponent <SkinnedMeshRenderer>();
                skmr.sharedMesh = new Mesh();
                skmr.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);
                skmr.bones       = bones.ToArray();
                skmr.materials   = materials.ToArray();
                skmr.localBounds = localBounds;
            }

            //AABB盒设置和element_body的相同
            //武器不包含在内
            //if (!localBounds.size.Equals(new Vector3(-1, -1, -1)))
            //{
            //    skmr.localBounds =  localBounds;
            //}

            rotate(0, 180, 0);

            //保存绑点信息(查找优化)
            List <string> _listBps = new List <string>()
            {
                "bp_head", "bp_l_shoulder", "bp_r_shoulder", "bp_body", "bp_l_hand", "bp_r_hand", "bp_l_foot", "bp_r_foot", "bp_root", "bp_primary_weapon", "bp_sub_weapon", "bp_overhead"
            };

            foreach (Transform tf in _pModelRoot.GetComponentsInChildren <Transform>())
            {
                if (_listBps.Contains(tf.name))
                {
                    _dictAuxBps[tf.name] = tf;
                }
            }

            //添加模型对象行为控制脚本
            ModelObjectBehaviour csModelObjBhv = _pModelRoot.AddComponent <ModelObjectBehaviour>();

            if (csModelObjBhv != null)
            {
                csModelObjBhv._objModel = this;
            }

            //完成回调
            if (_onCreateComplete != null)
            {
                _onCreateComplete(this);
            }
            else
            {
                Utils.LogSys.Log("创建模型:---------------->destroy");
                destroy();
                return;
            }

            //武器专属特效
            if (_nWeaponLev > 1)
            {
                //双武器
                if (_dictAuxBps.ContainsKey("bp_primary_weapon") && _dictAuxBps.ContainsKey("bp_sub_weapon"))
                {
//                     GameObject objPrim = Resources.Load("Effects/juesewuqi/" + _strModelID + "_wuqi01") as GameObject;
//                     GameObject objSub = Resources.Load("Effects/juesewuqi/" + _strModelID + "_wuqi02") as GameObject;
                    GameObject objPrim = asset.AssetManager.getInstance().loadAsset <GameObject>("Effects/juesewuqi/" + _strModelID + "_wuqi01.prefab"); //同步加载资源
                    GameObject objSub  = asset.AssetManager.getInstance().loadAsset <GameObject>("Effects/juesewuqi/" + _strModelID + "_wuqi02.prefab"); //同步加载资源
                    if (objPrim != null && objSub != null)
                    {
                        var effectPrim = GameObject.Instantiate <GameObject>(objPrim);
                        if (effectPrim != null)
                        {
                            effectPrim.transform.parent = _dictAuxBps["bp_primary_weapon"];
                            UtilTools.SetLayerRecursive(effectPrim.transform.gameObject, _pModelRoot.layer);
                            effectPrim.transform.localPosition    = new Vector3(0.0f, 0.0f, 0.0f);
                            effectPrim.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                            effectPrim.transform.localScale       = new Vector3(1.0f, 1.0f, 1.0f);
                        }

                        var effectSub = GameObject.Instantiate <GameObject>(objSub);
                        if (effectSub != null)
                        {
                            effectSub.transform.parent = _dictAuxBps["bp_sub_weapon"];
                            UtilTools.SetLayerRecursive(effectSub.transform.gameObject, _pModelRoot.layer);
                            effectSub.transform.localPosition    = new Vector3(0.0f, 0.0f, 0.0f);
                            effectSub.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                            effectSub.transform.localScale       = new Vector3(1.0f, 1.0f, 1.0f);
                        }
                    }

                    //GameObject __objPrim = Resources.Load("Effects/juesewuqi/" + _strModelID + "_wuqi") as GameObject;
                    GameObject __objPrim = asset.AssetManager.getInstance().loadAsset <GameObject>("Effects/juesewuqi/" + _strModelID + "_wuqi.prefab");//同步加载资源
                    if (__objPrim == null)
                    {
                        __objPrim = objPrim;
                    }

                    if (__objPrim != null)
                    {
                        var __effectPrim = GameObject.Instantiate <GameObject>(__objPrim);
                        if (__effectPrim != null)
                        {
                            __effectPrim.transform.parent = _dictAuxBps["bp_primary_weapon"];
                            UtilTools.SetLayerRecursive(__effectPrim.transform.gameObject, _pModelRoot.layer);
                            __effectPrim.transform.localPosition    = new Vector3(0.0f, 0.0f, 0.0f);
                            __effectPrim.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                            __effectPrim.transform.localScale       = new Vector3(1.0f, 1.0f, 1.0f);
                        }

                        var __effectSub = GameObject.Instantiate <GameObject>(__objPrim);
                        if (__effectSub != null)
                        {
                            __effectSub.transform.parent = _dictAuxBps["bp_sub_weapon"];
                            UtilTools.SetLayerRecursive(__effectSub.transform.gameObject, _pModelRoot.layer);
                            __effectSub.transform.localPosition    = new Vector3(0.0f, 0.0f, 0.0f);
                            __effectSub.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                            __effectSub.transform.localScale       = new Vector3(1.0f, 1.0f, 1.0f);
                        }
                    }
                }
                else if (_dictAuxBps.ContainsKey("bp_primary_weapon") && !_dictAuxBps.ContainsKey("bp_sub_weapon"))
                {
                    //GameObject objPrim = Resources.Load("Effects/juesewuqi/" + _strModelID + "_wuqi") as GameObject;
                    GameObject objPrim = asset.AssetManager.getInstance().loadAsset <GameObject>("Effects/juesewuqi/" + _strModelID + "_wuqi.prefab");//同步加载资源
                    if (objPrim != null)
                    {
                        var effectPrim = GameObject.Instantiate <GameObject>(objPrim);
                        if (effectPrim != null)
                        {
                            effectPrim.transform.parent = _dictAuxBps["bp_primary_weapon"];
                            UtilTools.SetLayerRecursive(effectPrim.transform.gameObject, _pModelRoot.layer);
                            effectPrim.transform.localPosition    = new Vector3(0.0f, 0.0f, 0.0f);
                            effectPrim.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 0.0f);
                            effectPrim.transform.localScale       = new Vector3(1.0f, 1.0f, 1.0f);
                        }
                    }
                }
            }
        }