コード例 #1
0
        public override bool Update(Unit unit, int deltaTime)
        {
            bool cantMove = unit.HasAnyState(UnitControlState.Root | UnitControlState.Stunned | UnitControlState.Distracted);

            unit.AI.UpdateRotation = !cantMove;

            if (cantMove)
            {
                unit.AI.NextPosition = unit.Position;
                unit.SetMovementFlag(MovementFlags.MaskMoving, false);
            }
            else if (unit.AI.HasPath)
            {
                Vector3 localDirection = unit.transform.TransformDirection(unit.AI.NextPosition - unit.Position);

                unit.SetMovementFlag(MovementFlags.Forward, localDirection.z > MovementUtils.DirectionalMovementThreshold);
                unit.SetMovementFlag(MovementFlags.Backward, localDirection.z < -MovementUtils.DirectionalMovementThreshold);
                unit.SetMovementFlag(MovementFlags.StrafeLeft, localDirection.x < -MovementUtils.DirectionalMovementThreshold);
                unit.SetMovementFlag(MovementFlags.StrafeRight, localDirection.x > MovementUtils.DirectionalMovementThreshold);

                unit.Position = unit.AI.NextPosition;
            }

            if (cantMove)
            {
                return(true);
            }

            if (nextMoveTime.Passed)
            {
                nextMoveTime.Reset(RandomUtils.Next(1000, 3000));
            }
            else
            {
                nextMoveTime.Update(deltaTime);
                if (nextMoveTime.Passed)
                {
                    unit.AddState(UnitControlState.ConfusedMove);

                    Vector2 randomCircle   = Random.insideUnitCircle * 4;
                    Vector3 randomPosition = unit.Position + new Vector3(randomCircle.x, 0, randomCircle.y);
                    if (!NavMesh.SamplePosition(randomPosition, out NavMeshHit hit, MovementUtils.MaxNavMeshSampleRange, MovementUtils.WalkableAreaMask))
                    {
                        return(TryAgainSoon());
                    }

                    randomPosition = hit.position;
                    if (!NavMesh.CalculatePath(unit.Position, randomPosition, MovementUtils.WalkableAreaMask, confusedNavMeshPath))
                    {
                        return(TryAgainSoon());
                    }

                    if (!unit.AI.SetPath(confusedNavMeshPath))
                    {
                        return(TryAgainSoon());
                    }

                    if (unit.AI.RemainingDistance > MovementUtils.MaxConfusedPath)
                    {
                        return(TryAgainSoon());
                    }
                }
            }

            return(true);

            bool TryAgainSoon()
            {
                nextMoveTime.Reset(100);
                return(true);
            }
        }