コード例 #1
0
    public void ComputePositions()
    {
        positions.Clear();
        directions.Clear();

        if (!HasFormation())
        {
            return;
        }

        Vector3 right    = transform.right;
        Vector3 forward  = transform.forward;
        Vector3 up       = transform.up;
        Vector3 position = transform.position;

        for (int i = 0; i < members.Count; i++)
        {
            var member = members [i];

            if (member.IsNewPath(firstPath))
            {
                member.ResetProgress();
            }

            float   currentProgress = member.GetCurrentPathProgress();
            Vector3 pathPosition    = firstPath.GetPoint(currentProgress);
            Vector3 pathDirection   = firstPath.GetDirection(currentProgress);

            right   = Vector3.Cross(Vector3.up, pathDirection);
            up      = Vector3.Cross(pathDirection, right.normalized);
            forward = pathDirection;

            Vector3 formationTranslation = currentFormation.GetMemberPosition(member.Index, forward, right, up);

            groupRotation       *= Quaternion.AngleAxis(Time.deltaTime * rotationSpeed, pathDirection);
            formationTranslation = groupRotation * formationTranslation;

            Vector3 finalPosition = pathPosition + formationTranslation;

            Debug.DrawRay(finalPosition, right * 2f, Color.green);
            Debug.DrawRay(finalPosition, up * 2f, Color.red);
            Debug.DrawRay(finalPosition, forward * 2f, Color.blue);

            member.IncreasePathProgress(firstPath);
            positions.Add(finalPosition);
            directions.Add(forward);
        }
    }