예제 #1
0
    public static DiscTrajectoryParameters GetTrajectory(CompetenceDisc competence, Vector3 startPosition, Vector3 targetPosition, List <DiscScript> throwedDiscs, List <DiscScript> inRangeDiscs, DiscScript currentDisc)
    {
        DiscTrajectoryParameters discTrajectoryParameters = new DiscTrajectoryParameters();

        discTrajectoryParameters.disc = currentDisc;
        List <Vector3> trajectoryPositions = new List <Vector3>();
        Vector3        totalDirection      = (targetPosition - startPosition).normalized;

        List <TrajectoryModifier> trajectoryModifiers = competence.GetTrajectoryModifiers;
        DiscsOrder linkedDiscsTrajectory        = DiscsOrder.None;
        TrajectoryModifierCurved curvedModifier = null;

        foreach (TrajectoryModifier modifier in trajectoryModifiers)
        {
            if (linkedDiscsTrajectory == DiscsOrder.None)
            {
                TrajectoryModifierLinkedDiscs linkedDiscModifier = modifier as TrajectoryModifierLinkedDiscs;
                if (linkedDiscModifier != null)
                {
                    linkedDiscsTrajectory = linkedDiscModifier.GetLinkedDiscTrajectoryType;
                }
            }

            if (curvedModifier == null)
            {
                TrajectoryModifierCurved foundCurvedModifier = modifier as TrajectoryModifierCurved;
                if (foundCurvedModifier != null)
                {
                    curvedModifier = foundCurvedModifier;
                }
            }
        }

        trajectoryPositions.Add(startPosition);

        #region Discs Link
        switch (linkedDiscsTrajectory)
        {
        case DiscsOrder.FromOldestToNewest:
            for (int i = 0; i < throwedDiscs.Count; i++)
            {
                DiscScript linkDisc = throwedDiscs[i];
                if (linkDisc != currentDisc)
                {
                    if (inRangeDiscs.Contains(linkDisc))
                    {
                        trajectoryPositions.Add(linkDisc.transform.position);
                    }
                }
            }
            break;

        case DiscsOrder.FromNewestToOldest:

            for (int i = throwedDiscs.Count - 1; i >= 0; i--)
            {
                DiscScript linkDisc = throwedDiscs[i];
                if (linkDisc != currentDisc)
                {
                    if (inRangeDiscs.Contains(linkDisc))
                    {
                        trajectoryPositions.Add(linkDisc.transform.position);
                    }
                }
            }
            break;
        }
        #endregion

        #region
        if (curvedModifier != null)
        {
            trajectoryPositions.Add(targetPosition);
            List <Vector3> curvedTrajectoryPositions = new List <Vector3>();

            for (int i = 0; i < trajectoryPositions.Count - 1; i++)
            {
                curvedTrajectoryPositions.Add(trajectoryPositions[i]);
                AddCurvedTrajectoryBetweenTwoPoints(ref curvedTrajectoryPositions, trajectoryPositions[i], trajectoryPositions[i + 1], curvedModifier);
            }

            trajectoryPositions = curvedTrajectoryPositions;
        }
        #endregion

        trajectoryPositions.Add(targetPosition);

        discTrajectoryParameters.trajectoryPositions = trajectoryPositions;

        return(discTrajectoryParameters);
    }
예제 #2
0
    //Zig Zags funs

    /*Vector3 testPos1 = Vector3.Lerp(startPosition, targetPosition, 0.2f);
     * testPos1 += new Vector3(totalDirection.z, 0, -totalDirection.x).normalized * 1f;
     * Vector3 testPos2 = Vector3.Lerp(startPosition, targetPosition, 0.4f);
     * testPos2 += new Vector3(-totalDirection.z, 0, totalDirection.x).normalized * 1f;
     *
     * Vector3 testPos3 = Vector3.Lerp(startPosition, targetPosition, 0.6f);
     * testPos3 += new Vector3(totalDirection.z, 0, -totalDirection.x).normalized * 1f;
     * Vector3 testPos4 = Vector3.Lerp(startPosition, targetPosition, 0.8f);
     * testPos4 += new Vector3(-totalDirection.z, 0, totalDirection.x).normalized * 1f;
     *
     * discTrajectoryParameters.trajectoryPositions.Add(testPos1);
     * discTrajectoryParameters.trajectoryPositions.Add(testPos2);
     * discTrajectoryParameters.trajectoryPositions.Add(testPos3);
     * discTrajectoryParameters.trajectoryPositions.Add(testPos4);*/
    #endregion
    public static void AddCurvedTrajectoryBetweenTwoPoints(ref List <Vector3> listToModify, Vector3 startPos, Vector3 endPos, TrajectoryModifierCurved modifier)
    {
        float   totalDistance          = Vector3.Distance(startPos, endPos);
        int     numberOfInterpolations = modifier.GetNumberOfInterpolations(totalDistance);
        Vector3 directionVector        = (endPos - startPos).normalized;
        Vector3 rightVector            = new Vector3(directionVector.z, 0, -directionVector.x);

        for (int i = 1; i < numberOfInterpolations; i++)
        {
            float   coeff  = (float)i / (float)numberOfInterpolations;
            Vector3 newPos = Vector3.Lerp(startPos, endPos, coeff);

            newPos += rightVector * modifier.GetLateralOffsetAtCoeff(totalDistance, coeff);
            listToModify.Add(newPos);
        }
    }