///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <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; } } }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <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); } } } } }