예제 #1
0
        v2_5DPathPoint GetStartPoint(Vector3 position)
        {
            var            distance = Mathf.Infinity;
            v2_5DPathPoint point    = new v2_5DPathPoint();

            for (int i = 0; i < points.Length; i++)
            {
                var _distance = Vector3.Distance(points[i].position, position);
                if (_distance < distance)
                {
                    distance     = _distance;
                    point.center = points[i];
                    if (i + 1 < points.Length)
                    {
                        point.forward = points[i + 1];
                    }
                    else if (i == points.Length - 1 && loopPath)
                    {
                        point.forward = points[0];
                    }
                    if (i - 1 > -1)
                    {
                        point.backward = points[i - 1];
                    }
                    else if (i == 0 && loopPath)
                    {
                        point.backward = points[points.Length - 1];
                    }
                }
            }
            return(point);
        }
예제 #2
0
        v2_5DPathPoint GetNextPoint(Transform center)
        {
            v2_5DPathPoint point = new v2_5DPathPoint();

            point.center = center;
            var pointIndex = System.Array.IndexOf(points, center);

            if (pointIndex + 1 < points.Length)
            {
                point.forward = points[pointIndex + 1];
            }
            else if (pointIndex == points.Length - 1 && loopPath)
            {
                point.forward = points[0];
            }
            if (pointIndex - 1 > -1)
            {
                point.backward = points[pointIndex - 1];
            }
            else if (pointIndex == 0 && loopPath)
            {
                point.backward = points[points.Length - 1];
            }
            return(point);
        }
예제 #3
0
        public Vector3 ConstraintPosition(Vector3 pos, bool checkChangePoint = true)
        {
            var position = pos;

            if (currentPoint == null)
            {
                currentPoint = GetStartPoint(pos);
            }
            if (currentPoint.center)
            {
                if (!reference)
                {
                    var obj = new GameObject("Reference");
                    reference = obj.transform;
                }
                position.y = currentPoint.center.position.y;
                if (checkChangePoint)
                {
                    if (isNearBackward(position))
                    {
                        currentPoint = GetNextPoint(currentPoint.backward);
                    }
                    if (isNearForward(position))
                    {
                        currentPoint = GetNextPoint(currentPoint.forward);
                    }
                }

                if (currentPoint.forward != null)
                {
                    var dirA = (currentPoint.backward) ? currentPoint.backward.position - currentPoint.center.position : -reference.right;
                    var pA   = currentPoint.center.position + dirA;
                    var dirB = (currentPoint.forward) ? currentPoint.forward.position - currentPoint.center.position : reference.right;
                    var pB   = currentPoint.center.position + dirB;

                    reference.position = currentPoint.center.position;
                    var distanceA = currentPoint.backward ? Vector3.Distance(currentPoint.center.position, currentPoint.backward.position) : Mathf.Infinity;
                    var distanceB = currentPoint.forward ? Vector3.Distance(currentPoint.center.position, currentPoint.forward.position) : Mathf.Infinity;
                    if (Vector3.Distance(pA, position) > distanceA + 0.1f)
                    {
                        reference.right = dirB;
                    }
                    else if (Vector3.Distance(pB, position) > distanceB + 0.1f)
                    {
                        reference.right = -dirA;
                    }
                }

                if (autoUpdateCameraAngle && vThirdPersonCamera.instance)
                {
                    var rot   = Quaternion.LookRotation(reference.forward, Vector3.up);
                    var angle = rot.eulerAngles.NormalizeAngle().y;
                    vThirdPersonCamera.instance.lerpState.fixedAngle.x = angle;
                }
                var localPosition = reference.InverseTransformPoint(pos);
                localPosition.z = 0;

                return(reference.TransformPoint(localPosition));
            }
            return(position);
        }
예제 #4
0
 public void Init()
 {
     currentPoint = null;
 }