// 更新状态逻辑 public void Update() { if (!isOnThisState) { return; } MaxDeadTimeCounter += Time.deltaTime; if (MaxDeadTimeCounter > MaxDeadTime) { MaxDeadTimeCounter = 0; ReleaseEntity(); return; } if (m_pFSM.animator) { AnimatorStateInfo state = m_pFSM.animator.GetCurrentAnimatorStateInfo(0); AnimatorClipInfo[] clipinfo = m_pFSM.animator.GetCurrentAnimatorClipInfo(0); //可见 if (m_pFSM.GetVisible()) { //死亡动画播放完,删除 if (state.IsName("Dead")) { if (state.normalizedTime > 1.1f) { ReleaseEntity(); } else { if (clipinfo.Length <= 0 || !clipinfo[0].clip) { ReleaseEntity(); } } } } else { ReleaseEntity(); } } else { ReleaseEntity(); } }
// 更新状态逻辑 public void Update() { if (!isOnThisState) { return; } if (m_pFSM.bIsForceMoving || m_pFSM.m_bForceFlighting || m_pFSM.bPauseMachineUpdate) { return; } if (!m_pFSM.creaturePropety) { return; } //建筑不会移动 if (m_pFSM.creaturePropety.GetNumProp(ENTITY_PROPERTY.PROPERTY_SEX) == (int)MONSTER_TYPE.MONSTER_TYPE_TOWER) { return; } Vector3 deltapos = m_pFSM.syncPosition - m_pFSM.transform.position; float deltadis = deltapos.magnitude; if (deltadis < 0.01f) { return; } float deltatime = Time.deltaTime; int smoothlevel = EntityFactory.Instance.smoothlevel; float apprfactor1 = EntityFactory.Instance.apprfactor1; float apprfactor2 = EntityFactory.Instance.apprfactor2; Vector3 curPos; if (smoothlevel == 2) { int vavyingframe = EntityFactory.Instance.vavyingFrame; Vector3 advance = m_pFSM.syncVelocity.magnitude * deltapos.normalized * deltatime; float advancedis = advance.magnitude; bool bRun = advancedis > 0.001f && m_pFSM.GetAnimatorBool("isRun"); if (bRun) { if (runframecount < 0) { runframecount = 0; } runframecount++; if (runframecount > 9999) { runframecount = 9999; } } else { if (runframecount > 0) { runframecount = 0; } runframecount--; if (runframecount < -9999) { runframecount = -9999; } } int absrunframecount = Mathf.Abs(runframecount); if (deltadis > 10.0f || deltadis < 0.1f) //太远或者太近直接拉 { curPos = m_pFSM.syncPosition; } else if (runframecount < -vavyingframe) //稳定静止状态,已经停下来有vavyingframe帧,没走路情况只能直接拉 { curPos = m_pFSM.syncPosition; currappfactor = apprfactor2; } else if (runframecount >= -vavyingframe && runframecount < 0) //正在停下来的情况都用逼近公式2,apprfactor2趋于极限(同步点)时收敛速度更快 { float deltafactor = Mathf.Abs(apprfactor2 - apprfactor1) / (float)vavyingframe; currappfactor += deltafactor; currappfactor = Mathf.Clamp(currappfactor, apprfactor1, apprfactor2); curPos = m_pFSM.syncPosition * currappfactor + m_pFSM.transform.position * (1 - currappfactor); } else if (runframecount > 0 && runframecount <= vavyingframe) //正在起步情况都用逼近公式2,apprfactor2趋于极限(同步点)时收敛速度更快 { float deltafactor = Mathf.Abs(apprfactor2 - apprfactor1) / (float)vavyingframe; currappfactor -= deltafactor; currappfactor = Mathf.Clamp(currappfactor, apprfactor1, apprfactor2); curPos = m_pFSM.syncPosition * currappfactor + m_pFSM.transform.position * (1 - currappfactor); } else //稳定走路情况或临时停下来情况 { if (advancedis * 0.5f > deltadis) //走路的最后一步,不足半个步长 { curPos = m_pFSM.syncPosition; } else if (advancedis * 3.0f > deltadis && advancedis < deltadis) //处于走路动作且3个步长内能走远到同步位置的距离,用普通走路公式 { curPos = m_pFSM.transform.position + advance; } else //否则,存在较大误差,比如时间轴缩放了,余下情况都用逼近公式1 { curPos = m_pFSM.syncPosition * apprfactor1 + m_pFSM.transform.position * (1 - apprfactor1); } currappfactor = apprfactor1; } } else if (smoothlevel == 1) { if (deltadis > 10.0f || deltadis < 0.1f) //太远或者太近直接拉 { curPos = m_pFSM.syncPosition; } else { curPos = m_pFSM.syncPosition * apprfactor2 + m_pFSM.transform.position * (1 - apprfactor2); } } else { curPos = m_pFSM.syncPosition; } if (m_pFSM.GetVisible()) { curPos = MonsterStateMachine.CorrectPosFromPhysic(curPos, m_pFSM.creaturePropety.CreatureHeightInMeters + 2, GroundedCheckDistance); } m_pFSM.SetPosition(curPos); Quaternion ate = Quaternion.Euler(m_pFSM.syncAngles); Vector3 movDir = ate * Vector3.forward; Vector3 ptTarget = curPos + movDir * 10; m_pFSM.LookAtPoint(m_pFSM.CorrectLookAtPoint(ptTarget)); return; }