public bool Update(float dTime) { if (m_Prop == null) { bPlayFinish = false; return(false); } if (m_Atttacker != null) { if (!m_Atttacker.IsLive()) { bPlayFinish = false; return(false); } } float fTime = m_fCurrentTime + dTime; // Log.Error("dttime is {0} ftime is {1}", dTime,fTime); float maxtime = 0; bool bAlive = false; if (!bPlayFinish) {//bPlayFinish 标志所有节点是否全部播放过 减少SortedDictionary 迭代gc分配 SortedDictionary <float, List <EffectNode> > .Enumerator iter = m_EffectNodes.GetEnumerator(); while (iter.MoveNext()) { var parieffect = iter.Current; float fNodeTime = parieffect.Key;// *0.001f; maxtime = fNodeTime > maxtime ? fNodeTime : maxtime; if (fNodeTime > fTime) { bAlive = true; break; } if (fNodeTime < m_fCurrentTime) { for (int i = 0; i < parieffect.Value.Count; ++i) { parieffect.Value[i].Update(dTime); } continue; } for (int i = 0; i < parieffect.Value.Count; ++i) { if (parieffect.Value[i] == null) { continue; } if (parieffect.Value[i].prop == null) { continue; } if (fTime > parieffect.Value[i].prop.time && m_fCurrentTime <= parieffect.Value[i].prop.time) { if (!bStop) {//技能停止后 未播放的动作和特效节点不再播放 if (IsHideFx()) { EF_NODE_TYPE t = parieffect.Value[i].type; if (t == EF_NODE_TYPE.ARROW_FX || t == EF_NODE_TYPE.ATTACH_FX || t == EF_NODE_TYPE.FOLLOW_FX || t == EF_NODE_TYPE.PLACE_FX) { continue; } } // PlaySkillNode(parieffect.Value[i]); parieffect.Value[i].Play(m_Atttacker, this); bAlive = true; } } } } } m_fCurrentTime = fTime; m_bAlive = bAlive; maxtime *= 1000; maxtime = maxtime > m_uSkillLen ? maxtime : m_uSkillLen; if (fTime * 1000 >= maxtime) { bPlayFinish = true; } return(bAlive); }
void Update() { if (!bStart) { return; } if (bDestory) { return; } if (Time.time - m_startTime > m_len) { //超过最长时间 DestroyFx(); return; } if (m_targetObj != null) { if (m_attacker == null) { DestroyFx(); return; } //目标已经死亡 if (m_attacker.IsLive() == false) { DestroyFx(); return; } } Vector3 targetPos = m_attacker.GetTargetHitNodePos(m_SkillTarget, targetHitNode); if (targetPos == Vector3.zero) { targetPos = castPos; // Log.Error("use cast pos"); } else { float dis = GetVectorDistance(transform.position, targetPos); totalTime -= Time.deltaTime; if (totalTime >= 0) { m_speed = dis / totalTime; } else { DestroyFx(); return; } } // m_speed += m_acce * Time.deltaTime; float deltaMove = m_speed * Time.deltaTime; // Log.Error("speed is " + m_speed + " delta move is " + deltaMove); if (m_targetObj != null) { Vector3 dist = targetPos - transform.position; Vector3 dir = dist.normalized; transform.LookAt(targetPos); float distance = GetVectorDistance(targetPos, transform.position); // if (distance <= deltaMove * deltaMove) if (distance <= 0.2f) { //击中目标, if (m_attacker != null) { // m_hitNode.m_uDamageID = m_attacker.GetDamageID(); //Log.Error("follow hit"); m_attacker.OnComputeHit(m_targetObj, m_hitNode); DestroyFx(); return; } //已经到达 transform.position = targetPos; } else { transform.position += dir * deltaMove; } // Log.Error("dir is " + dir + " pos is " + transform.position+" targetpos is "+targetPos); } else { DestroyFx(); //transform.position += transform.forward * deltaMove; } }