示例#1
0
    // 更新状态逻辑
    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();
        }
    }
示例#2
0
    // 更新状态逻辑
    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;
    }