Exemple #1
0
    //游荡状态处理函数
    void UpdateWanderState()
    {
        //感知到周围有活着的玩家,进入追踪状态
        if (GameManager.gm.getCurStateName() != "end")
        {
            targetPlayer = zombieSensor.getNearbyPlayer();
            if (targetPlayer != null)
            {
                currentState = FSMState.Chase;
                agent.ResetPath();
                return;
            }

            //如果受到伤害,那么进入搜索状态
            if (zombieHealth.getDamaged)
            {
                currentState = FSMState.Seek;
                agent.ResetPath();
                return;
            }
        }

        //如果没有目标位置,那么随机选择一个目标位置
        if (AgentDone())
        {
            Vector3 randomRange = new Vector3((Random.value - 0.5f) * 2 * wanderScope,
                                              0, (Random.value - 0.5f) * 2 * wanderScope);
            Vector3 nextDestination = zombieTransform.position + randomRange;
            agent.destination = nextDestination;
        }
        //限制游荡的速度
        setMaxAgentSpeed(wanderSpeed);

        //统计僵尸在当前位置附近的停留时间
        caculateStopTime();

        // 如果在一个地方停留太久(各种原因导致僵尸卡住)
        // 那么选择僵尸背后的一个位置当做下一个目标
        if (stopTime > 1.0f)
        {
            Vector3 nextDestination = zombieTransform.position
                                      - zombieTransform.forward * (Random.value) * wanderScope;
            agent.destination = nextDestination;
        }

        //进入普通状态
        if (zombieRender != null)
        {
            zombieRender.SetNormal();
        }
    }
 void ZombieSetNormal()
 {
     zombieRender.SetNormal();
 }