//每一帧有且只有一次被更新 //frame 当前帧 //loopCount 当前第几次动作循环 //trueframe 真实达到第几帧的 //end 真实是不是结束 //root 用于创建的时候计算位置用 public void UpdateFrame(int frame, int loop, bool isEnd, Transform root) { //检查销毁 if (endFrame > 0 && beginFrame + endFrame == frame && fxs.Count != 0) { Destroy(); } if (frame != beginFrame) { return; //不是这一帧 } if (prefab == null) { return; } if (loop > 0 && !loopCreate) { return; //已经循环过一次就不用创建了 } if (isEnd && (destroyIfAniEnd)) { return; //如果是动作结束销毁的,那么就不用创建了 } #if !ART_DEBUG //调试 if (onRuntimeCreate == null && canHide && !QualityMgr.instance.roleAniFx) { return; } #endif //不同元素属性创建不同特效 GameObject curPrefab = prefab; switch (this.parent.RuntimeElement) { case enAniFxElement.none: curPrefab = prefab; break; case enAniFxElement.fire: curPrefab = prefabFire; break; case enAniFxElement.ice: curPrefab = prefabIce; break; case enAniFxElement.thunder: curPrefab = prefabThunder; break; case enAniFxElement.dark: curPrefab = prefabDark; break; default: Debuger.LogError("动作特效 未知的元素类型:{0}", this.parent.RuntimeElement); break; } if (curPrefab == null) { curPrefab = prefab; } //1 创建特效 GameObject go = GameObjectPool.GetPool(GameObjectPool.enPool.Fx).GetImmediately(curPrefab.name, false); if (go == null) { //Debuger.LogError("逻辑错误动作绑定特效加载后为空");//这里只支持预加载,不支持异步加载,没有预加载过报错 return; } //2 设置位置和方向 Transform t = go.transform; if (type == enCreateType.bone)//绑定骨骼 { Transform target = GetTarget(root); if (follow) { t.SetParent(target, false); //t.localScale = Vector3.one; t.localPosition = offset; t.localEulerAngles = euler; } else { t.position = target.TransformPoint(offset); t.rotation = target.rotation * Quaternion.Euler(euler); } } else if (type == enCreateType.matrial)//绑定材质 { Transform target = root.Find("model/body_mesh"); if (target != null) { t.SetParent(target, false); //t.localScale = Vector3.one; t.localPosition = Vector3.zero; t.localEulerAngles = Vector3.zero; } target = root.Find("model/weapon_mesh"); if (target != null) { GameObject go2 = GameObjectPool.GetPool(GameObjectPool.enPool.Fx).GetImmediately(prefab.name, false); Transform t2 = go2.transform; t2.SetParent(target, false); t2.localPosition = Vector3.zero; t2.localEulerAngles = Vector3.zero; go2.SetActive(true);//设好了父节点了,这个时候再SetActive fxs.Add(go2); } } else { Debuger.LogError("未知的类型:{0}", type); } go.SetActive(true);//设好了父节点了,这个时候再SetActive //如果飞出物上没有任何销毁的脚本,那么提示下 if (!destroyIfAniEnd && endFrame <= 0 && !FxDestroy.HasDelay(go)) { Debuger.LogError("动作特效上没有绑销毁脚本,动作上也没有指定结束帧.特效名:{0}", go.name); } //加到列表中,方便管理 fxs.Add(go); //运行时创建回调 if (onRuntimeCreate != null) { onRuntimeCreate(go, onRuntimeCreateParam); } }