コード例 #1
0
        private void Update()
        {
            if (!circuit)
            {
                return;
            }

            if (progressStyle == ProgressStyle.SmoothAlongRoute)
            {
                // determine the position we should currently be aiming for
                // (this is different to the current progress position, it is a a certain amount ahead along the route)
                // we use lerp as a simple way of smoothing out the speed over time.
                if (Time.deltaTime > 0)
                {
                    speed = Mathf.Lerp(speed, (lastPosition - transform.position).magnitude / Time.deltaTime,
                                       Time.deltaTime);
                }
                target.position =
                    circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset + lookAheadForTargetFactor * speed)
                    .position;
                target.rotation =
                    Quaternion.LookRotation(
                        circuit.GetRoutePoint(progressDistance + lookAheadForSpeedOffset + lookAheadForSpeedFactor * speed)
                        .direction);


                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude * 0.5f;
                }

                lastPosition = transform.position;
            }
            else
            {
                // point to point mode. Just increase the waypoint if we're close enough:

                Vector3 targetDelta = target.position - transform.position;
                if (targetDelta.magnitude < pointToPointThreshold)
                {
                    progressNum = (progressNum + 1) % circuit.Waypoints.Length;
                }


                target.position = circuit.Waypoints[progressNum].position;
                target.rotation = circuit.Waypoints[progressNum].rotation;

                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude;
                }
                lastPosition = transform.position;
            }
        }
コード例 #2
0
ファイル: CarPathFollow.cs プロジェクト: kabirules/minicar
    void Update()
    {
        if (Track != null && target != null && pathExist)
        {
            target.position = Track.GetRoutePoint(progressDistance + 1.45f).position;                                                           // find the next position for the target
            target.rotation = Quaternion.LookRotation(Track.GetRoutePoint(progressDistance).direction);                                         // find the new rotation for the target


            progressPoint = Track.GetRoutePoint(progressDistance);                                                                                                              // --> Get the progressPoint position
            Vector3 progressDelta = progressPoint.position - transform.position;
            if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)                                                                                                        // if progress point position is behind the car
            {
                progressDistance += progressDelta.magnitude * 0.5f;                                                                                                             // change the progress point position
            }
        }

        if (Track != null && progressDistance / Track.Length > 1)
        {
            //Debug.Log ("Lap");
            iLapCounter++;
            if (sLapCounter)
            {
                sLapCounter.displayLap(carPathFollow);
            }
            progressDistance = progressDistance % Track.Length;
        }
    }
コード例 #3
0
        private void Update()
        {
            if (progressStyle == ProgressStyle.SmoothAlongRoute)
            {
                var targetPosition =
                    circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset)
                    .position;

                projectedDistance = (transform.position - targetPosition).magnitude;

                transform.position =
                    Vector3.Lerp(
                        transform.position,
                        circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset + lookAheadForTargetFactor * projectedDistance).position,
                        Time.deltaTime);

                transform.rotation =
                    Quaternion.Lerp(
                        transform.rotation,
                        Quaternion.LookRotation(
                            circuit.GetRoutePoint(progressDistance + lookAheadForSpeedOffset + lookAheadForSpeedFactor * projectedDistance)
                            .direction),
                        Time.deltaTime);

                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - target.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude * 0.5f;
                }
            }
            else
            {
                // point to point mode. Just increase the waypoint if we're close enough:

                Vector3 targetDelta = target.position - transform.position;
                if (targetDelta.magnitude < pointToPointThreshold)
                {
                    progressNum = (progressNum + 1) % circuit.Waypoints.Length;
                }


                target.position = circuit.Waypoints[progressNum].position;
                target.rotation = circuit.Waypoints[progressNum].rotation;

                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude;
                }
            }
        }
コード例 #4
0
//		public void SetIsStopMoveTarget(bool isStop)
//		{
//			IsStopMoveTarget = isStop;
//		}

        private void Update()
        {
            /*if (Input.GetKeyUp(KeyCode.P)) {
             *      SetCarPathInfo(circuit); //test
             * }*/

            if (IsStopMoveTarget)
            {
                return;
            }

            if (progressStyle == ProgressStyle.SmoothAlongRoute)
            {
                Vector3 vecA = circuit.Waypoints[progressNum].position - transform.position;
                Vector3 vecB = transform.forward;
                if (vecA.magnitude < 15f)
                {
                    vecA.y = vecB.y = 0f;
                    if (Vector3.Dot(vecA, vecB) < 0f)
                    {
                        NpcMark markScript = circuit.Waypoints[progressNum].GetComponent <NpcMark>();
                        if (markScript != null)
                        {
                            AiCarCom.SetAiCarTopMoveSpeed(markScript.MvSpeed);
                        }

                        progressNum++;
                        if (progressNum >= circuit.Waypoints.Length)
                        {
                            progressNum      = 0;
                            IsStopMoveTarget = true;
                            //stop move AiCar.
                            AiCarCom.SetIsStopMoveCar(true);
                            return;
                        }
                        //Debug.Log("Unity:"+"progressNum "+progressNum);
                    }
                }

                // determine the position we should currently be aiming for
                // (this is different to the current progress position, it is a a certain amount ahead along the route)
                // we use lerp as a simple way of smoothing out the speed over time.
                if (Time.deltaTime > 0)
                {
                    speed = Mathf.Lerp(speed, (lastPosition - transform.position).magnitude / Time.deltaTime,
                                       Time.deltaTime);
                }
                target.position =
                    circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset + lookAheadForTargetFactor * speed)
                    .position;
                target.rotation =
                    Quaternion.LookRotation(
                        circuit.GetRoutePoint(progressDistance + lookAheadForSpeedOffset + lookAheadForSpeedFactor * speed)
                        .direction);


                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude * 0.5f;
                }

                lastPosition = transform.position;
            }
            else
            {
                // point to point mode. Just increase the waypoint if we're close enough:

                Vector3 targetDelta = target.position - transform.position;
                if (targetDelta.magnitude < pointToPointThreshold)
                {
                    progressNum = (progressNum + 1) % circuit.Waypoints.Length;
                }

                target.position = circuit.Waypoints[progressNum].position;
                target.rotation = circuit.Waypoints[progressNum].rotation;

                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude;
                }
                lastPosition = transform.position;
            }
        }
コード例 #5
0
        private void Update()
        {
            float driveAxis = CrossPlatformInputManager.GetAxis("Vertical");

            if (driveAxis < 0 && lookAheadForTargetOffset > 0.0f)
            {
                lookAheadForTargetOffset += (driveAxis * 0.003f);
            }
            else if (driveAxis > 0 && lookAheadForTargetOffset < 1.1f)
            {
                lookAheadForTargetOffset += (driveAxis * 0.002f);
            }


            if (Input.GetButton("Fire2") && lookAheadForTargetOffset < 1.1f)
            {
                Debug.Log(Input.mousePosition);

                lookAheadForTargetOffset += 0.002f;
            }
            if (Input.GetButton("Fire1") && lookAheadForTargetOffset > 0.0f)
            {
                lookAheadForTargetOffset -= 0.003f;
            }
            else if (lookAheadForTargetOffset < 0.0f)
            {
                lookAheadForTargetOffset = 0.0f;
            }

            if (lookAheadForTargetOffset > 0.03f)
            {
                lookAheadForTargetOffset -= (lookAheadForTargetOffset * 0.0025f);
            }

            if (progressStyle == ProgressStyle.SmoothAlongRoute)
            {
                // determine the position we should currently be aiming for
                // (this is different to the current progress position, it is a a certain amount ahead along the route)
                // we use lerp as a simple way of smoothing out the speed over time.
                if (Time.deltaTime > 0)
                {
                    speed = Mathf.Lerp(speed, (lastPosition - transform.position).magnitude / Time.deltaTime,
                                       Time.deltaTime);
                }
                target.position =
                    circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset + lookAheadForTargetFactor * speed)
                    .position;
                target.rotation =
                    Quaternion.LookRotation(
                        circuit.GetRoutePoint(progressDistance + lookAheadForSpeedOffset + lookAheadForSpeedFactor * speed)
                        .direction);


                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude * 0.5f;
                }

                lastPosition = transform.position;
            }
            else
            {
                // point to point mode. Just increase the waypoint if we're close enough:

                Vector3 targetDelta = target.position - transform.position;
                if (targetDelta.magnitude < pointToPointThreshold)
                {
                    progressNum = (progressNum + 1) % circuit.Waypoints.Length;
                }


                target.position = circuit.Waypoints[progressNum].position;
                target.rotation = circuit.Waypoints[progressNum].rotation;

                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude;
                }
                lastPosition = transform.position;
            }
        }
        private void Update()
        {
            if (progressStyle == ProgressStyle.SmoothAlongRoute)
            {
                // 平滑路径点模式

                // 确定我们应当瞄准的位置
                // 这与当前的进度位置不同,这是两个路近的中间量
                // 我们使用插值来简单地平滑速度
                // determine the position we should currently be aiming for
                // (this is different to the current progress position, it is a a certain amount ahead along the route)
                // we use lerp as a simple way of smoothing out the speed over time.
                if (Time.deltaTime > 0)
                {
                    speed = Mathf.Lerp(speed, (lastPosition - transform.position).magnitude / Time.deltaTime,
                                       Time.deltaTime);
                }
                // 根据路程向前偏移一定距离,获取路径点
                target.position =
                    circuit.GetRoutePoint(progressDistance + lookAheadForTargetOffset + lookAheadForTargetFactor * speed)
                    .position;
                // 路径点方向调整。这里重复计算了,为什么不缓存?
                target.rotation =
                    Quaternion.LookRotation(
                        circuit.GetRoutePoint(progressDistance + lookAheadForSpeedOffset + lookAheadForSpeedFactor * speed)
                        .direction);

                // 获取未偏移的路径点
                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                // 车辆的移动超过路径点的话,将路径点前移
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude * 0.5f;
                }

                // 记录位置
                lastPosition = transform.position;
            }
            else
            {
                // 点对点模式,如果足够近的话就增加路程
                // point to point mode. Just increase the waypoint if we're close enough:

                // 距离小于阈值,就将路径点移动到下一个
                Vector3 targetDelta = target.position - transform.position;
                if (targetDelta.magnitude < pointToPointThreshold)
                {
                    progressNum = (progressNum + 1) % circuit.Waypoints.Length;
                }

                // 设置路径对象的位置和旋转方向
                target.position = circuit.Waypoints[progressNum].position;
                target.rotation = circuit.Waypoints[progressNum].rotation;

                // 同平滑路径点模式一样进行路程计算
                // get our current progress along the route
                progressPoint = circuit.GetRoutePoint(progressDistance);
                Vector3 progressDelta = progressPoint.position - transform.position;
                if (Vector3.Dot(progressDelta, progressPoint.direction) < 0)
                {
                    progressDistance += progressDelta.magnitude;
                }
                lastPosition = transform.position;
            }
        }