コード例 #1
0
    IEnumerator ProcessSpawnOnDeath()
    {
        bool hasSpawned = false;

        while (!hasSpawned)
        {
            Collider[] colliderHit = Physics.OverlapSphere(transform.position, m_spawnCheckRadius);

            bool hitObj = false;
            for (int hIndex = 0; hIndex < colliderHit.Length; hIndex++)
            {
                if (colliderHit[hIndex].transform.GetComponent <TrafficSystemVehicle>())
                {
                    hitObj = true;
                }
            }

            if (!hitObj)
            {
                TrafficSystemVehicle vehicle = SpawnRandomVehicle();

//				if(TrafficSystem.Instance && vehicle)
//					TrafficSystem.Instance.RegisterVehicle( vehicle );

                hasSpawned = true;
            }

            if (!hasSpawned)
            {
                yield return(new WaitForSeconds(m_spawnDelayBetweenTries));
            }
        }

        yield return(null);
    }
コード例 #2
0
 public void AssignVehicleToFollow( TrafficSystemVehicle a_vehicle )
 {
     #if WEB_DEMO_ENABLED
     if(m_camera && m_TBOrbit && !m_TBOrbit.target && a_vehicle.name.Contains("Full Test Car"))
         m_TBOrbit.target = a_vehicle.transform;
     #endif
 }
コード例 #3
0
    public TrafficSystemVehicle SpawnRandomVehicle(bool a_ignoreChangeOfSpawning = false)
    {
        if (m_vehiclePrefabs.Count <= 0)
        {
            return(null);
        }

        if (TrafficSystem.Instance && !TrafficSystem.Instance.CanSpawn())
        {
            return(null);
        }

        float chanceOfSpawn = Random.Range(0.0f, 1.0f);

        if (!a_ignoreChangeOfSpawning && chanceOfSpawn > m_nodeVehicleSpawnChance)
        {
            return(null);
        }

        int randIndex = Random.Range(0, m_vehiclePrefabs.Count);

        TrafficSystemVehicle vehicle = Instantiate(m_vehiclePrefabs[randIndex], transform.position, transform.rotation) as TrafficSystemVehicle;

        vehicle.m_nextNode    = m_startNode;
        vehicle.m_velocityMax = Random.Range(m_randVelocityMin, m_randVelocityMax);
        return(vehicle);
    }
コード例 #4
0
    public void AttachVehicleCameraToPreviousVehicle()
    {
        if (!TrafficSystem.Instance)
        {
            return;
        }

        if (TrafficSystem.Instance.GetSpawnedVehicles().Count <= 0)
        {
            return;
        }

        if (!m_vehicleCamera)
        {
            return;
        }

        m_vehicleCameraIndex--;
        if (m_vehicleCameraIndex < 0)
        {
            m_vehicleCameraIndex = TrafficSystem.Instance.GetSpawnedVehicles().Count - 1;
        }

        m_vehicleToFollow = TrafficSystem.Instance.GetSpawnedVehicles()[m_vehicleCameraIndex];
    }
コード例 #5
0
ファイル: TrafficSystemUI.cs プロジェクト: farizekber/Test
    void Update()
    {
        if (Instance != this)
        {
            return;
        }

        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Application.Quit();
        }

                #if WEB_DEMO_ENABLED
        if (Input.GetMouseButtonDown(0))
        {
            if (m_camera && m_TBOrbit)
            {
                Ray          ray  = m_camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit[] rays = Physics.RaycastAll(ray);

                for (int hIndex = 0; hIndex < rays.Length; hIndex++)
                {
                    TrafficSystemVehicle vehicle = rays[hIndex].transform.GetComponent <TrafficSystemVehicle>();
                    if (vehicle)
                    {
                        m_TBOrbit.target = vehicle.transform;
                        break;
                    }
                }
            }
        }
                #endif
    }
コード例 #6
0
    void OnTriggerExit(Collider a_obj)
    {
        if (a_obj.GetComponent <TrafficSystemVehicle>())
        {
            TrafficSystemVehicle vehicle = a_obj.GetComponent <TrafficSystemVehicle>();

            if (m_vehiclesInTrigger.Count > 0)
            {
                if (m_linkedTriggers.Count > 0)
                {
                    bool foundVehicle = false;
                    for (int lIndex = 0; lIndex < m_linkedTriggers.Count; lIndex++)
                    {
                        if (m_linkedTriggers[lIndex].m_vehiclesInTrigger.Count > 0)
                        {
                            m_linkedTriggers[lIndex].m_vehiclesInTrigger[0].StopMoving = false;
                            foundVehicle = true;
                        }
                    }

                    if (!foundVehicle)
                    {
                        m_vehiclesInTrigger[0].StopMoving = false;
                    }
                }
                else
                {
                    m_vehiclesInTrigger[0].StopMoving = false;
                }
            }

            m_vehiclesInTrigger.Remove(vehicle);
        }
    }
コード例 #7
0
    void OnTriggerEnter(Collider a_obj)
    {
        if (a_obj.GetComponent <TrafficSystemVehicle>())
        {
            TrafficSystemVehicle vehicle = a_obj.GetComponent <TrafficSystemVehicle>();

            if (m_vehiclesInTrigger.Count > 0)
            {
                if (IsAnyVehicleStopped(vehicle))
                {
                    vehicle.StopMoving = true;
                }
            }

            for (int lIndex = 0; lIndex < m_linkedTriggers.Count; lIndex++)
            {
                if (m_linkedTriggers[lIndex].m_vehiclesInTrigger.Count > 0)
                {
                    for (int vIndex = 0; vIndex < m_linkedTriggers[lIndex].m_vehiclesInTrigger.Count; vIndex++)
                    {
                        if (m_linkedTriggers[lIndex].m_vehiclesInTrigger[vIndex].IsStopped() && vehicle != m_linkedTriggers[lIndex].m_vehiclesInTrigger[vIndex])
                        {
                            vehicle.StopMoving = true;
                            break;
                        }
                    }
                }
            }

            m_vehiclesInTrigger.Add(vehicle);
        }
    }
コード例 #8
0
    void OnTriggerExit(Collider a_obj)
    {
        if (!m_node)
        {
            return;
        }

                #if TRAFFIC_SYSTEM
        TrafficSystemVehicle vehicle = null;

        if (a_obj.transform.GetComponent <TrafficSystemVehicle>())
        {
            vehicle = a_obj.transform.GetComponent <TrafficSystemVehicle>();
        }

        if (vehicle)
        {
            m_vehiclesWithinReach--;
        }

        if (m_vehiclesWithinReach <= 0)
        {
            m_node.m_waitAtNode = false;
        }
                #endif
    }
コード例 #9
0
    public void AttachVehicleCameraToNextVehicle()
    {
        if (TrafficSystem.Instance.GetSpawnedVehicles().Count <= 0)
        {
            return;
        }

        if (!m_vehicleCamera)
        {
            return;
        }

        if (!m_vehicleCamera)
        {
            return;
        }

        m_vehicleCameraIndex++;
        if (m_vehicleCameraIndex >= TrafficSystem.Instance.GetSpawnedVehicles().Count)
        {
            m_vehicleCameraIndex = 0;
        }

        m_vehicleToFollow = TrafficSystem.Instance.GetSpawnedVehicles()[m_vehicleCameraIndex];
    }
コード例 #10
0
ファイル: TrafficSystem.cs プロジェクト: farizekber/Test
    public void RegisterVehicle(TrafficSystemVehicle a_vehicle)
    {
        if (TrafficSystemUI.Instance)
        {
            TrafficSystemUI.Instance.AssignVehicleToFollow(a_vehicle);
        }

        m_spawnedVehicles.Add(a_vehicle);
    }
コード例 #11
0
ファイル: TrafficSystemUI.cs プロジェクト: farizekber/Test
 public void AssignVehicleToFollow(TrafficSystemVehicle a_vehicle)
 {
             #if WEB_DEMO_ENABLED
     if (m_camera && m_TBOrbit && !m_TBOrbit.target && a_vehicle.name.Contains("Full Test Car"))
     {
         m_TBOrbit.target = a_vehicle.transform;
     }
             #endif
 }
コード例 #12
0
    void OnTriggerEnter(Collider a_obj)
    {
        TrafficSystemVehicle vehicle = null;

        if (a_obj.transform.GetComponent <TrafficSystemVehicle>())
        {
            vehicle = a_obj.transform.GetComponent <TrafficSystemVehicle>();
        }

        if (vehicle)
        {
//			if(m_status == Status.RED)
//			{
//				vehicle.TrafficLight         = this;
//			}
//			else
//			{
//				if(vehicle.CanSeeVehicle( true ))
            vehicle.AssignTrafficLight(this);

            if (vehicle.IsTurningIntoIncomingTraffic() && !m_turnLeftAnytime)
            {
                m_intersection.AddToPriorityLightQueue(this);
            }

//			if(!m_checkStarted && m_turnLeftAnytime)
//			{
//				m_checkStarted = true;
//				StartCoroutine( ProcessCheck( vehicle ) );
//			}
//			}
        }

        if (a_obj.transform.GetComponent <TrafficSystemVehiclePlayer>())
        {
            TrafficSystemVehiclePlayer playerVehicle = null;
            playerVehicle = a_obj.transform.GetComponent <TrafficSystemVehiclePlayer>();

            if (playerVehicle)
            {
//				playerVehicle.AssignTrafficLight(this);

                if (playerVehicle.IsTurningIntoIncomingTraffic() && !m_turnLeftAnytime)
                {
                    m_intersection.AddToPriorityLightQueue(this);
                }

                playerVehicle.ProcessHasEnteredTrafficLightTrigger(this);
            }

//			if(!m_checkStarted && m_turnLeftAnytime)
//			{
//				m_checkStarted = true;
//				StartCoroutine( ProcessCheck( vehicle ) );
//			}
        }
    }
コード例 #13
0
    IEnumerator ProcessCheck(TrafficSystemVehicle a_vehicle)
    {
        bool stillWaiting = true;

        while (stillWaiting)
        {
            Collider[] hitColliders = Physics.OverlapSphere(m_checkPos.position, m_checkRadius);
            stillWaiting = false;
            int i = 0;
            while (i < hitColliders.Length)
            {
                if (hitColliders[i].gameObject.GetComponent <TrafficSystemVehicle>())
                {
                    stillWaiting = true;
                    break;
                }
                i++;
            }

            /*
             * RaycastHit[] hitInfo = Physics.SphereCastAll( m_checkPos.position, 10.0f, m_checkPos.transform.up );
             *
             * stillWaiting = false;
             * for(int hIndex = 0; hIndex < hitInfo.Length; hIndex++)
             * {
             *      TrafficSystemVehicle vehicle = hitInfo[hIndex].transform.GetComponent<TrafficSystemVehicle>();
             *      if(vehicle)
             *              stillWaiting = true;
             * }
             */

            if (stillWaiting)
            {
                if (a_vehicle)
                {
                    a_vehicle.WaitingForTraffic = true;
                }

                yield return(new WaitForSeconds(m_timeToWaitBetweenCheckes));
            }
            else
            {
                if (a_vehicle)
                {
                    a_vehicle.WaitingForTraffic = false;
                }

                yield return(null);
            }
        }

        m_checkStarted = false;
    }
コード例 #14
0
ファイル: TrafficSystem.cs プロジェクト: farizekber/Test
    public bool VehicleHasFocus(TrafficSystemVehicle a_vehicle)
    {
        if (m_followCameraScript)
        {
            if (m_followCameraScript.m_vehicleToFollow == a_vehicle)
            {
                return(true);
            }
        }

        return(false);
    }
コード例 #15
0
    IEnumerator Start()
    {
        if (TrafficSystem.Instance)
        {
            TrafficSystem.Instance.RegisterVehicleSpawner(this);
        }

        if (m_totalToSpawn <= 0)
        {
            yield break;
        }

        for (int sIndex = 0; sIndex < m_totalToSpawn; sIndex++)
        {
            TrafficSystemVehicle vehicle = SpawnRandomVehicle(true);
            vehicle.gameObject.SetActive(false);
            m_vehiclePool.Add(vehicle);
        }

        yield return(new WaitForSeconds(m_onStartDelay));


        while (m_totalSpawned < m_totalToSpawn)
        {
            Collider[] colliderHit = Physics.OverlapSphere(transform.position, m_spawnCheckRadius);

            bool hitObj = false;
            for (int hIndex = 0; hIndex < colliderHit.Length; hIndex++)
            {
                if (colliderHit[hIndex].transform.GetComponent <TrafficSystemVehicle>())
                {
                    hitObj = true;
                }
            }

            if (!hitObj)
            {
                if (m_totalSpawned < m_vehiclePool.Count)
                {
                    TrafficSystemVehicle vehicle = m_vehiclePool[m_totalSpawned];
                    vehicle.gameObject.SetActive(true);

//					if(TrafficSystem.Instance && vehicle)
//						TrafficSystem.Instance.RegisterVehicle( vehicle );
                }

                m_totalSpawned++;
            }

            yield return(new WaitForSeconds(m_spawnDelayBetweenTries));
        }
    }
コード例 #16
0
    public bool IsAnyVehicleStopped( TrafficSystemVehicle a_vehicle )
    {
        for(int vIndex = 0; vIndex < m_vehiclesInTrigger.Count; vIndex++)
        {
            if(m_vehiclesInTrigger[vIndex].IsStopped() && a_vehicle != m_vehiclesInTrigger[vIndex])
            {
                return true;
                break;
            }
        }

        return false;
    }
コード例 #17
0
    public bool IsAnyVehicleStopped(TrafficSystemVehicle a_vehicle)
    {
        for (int vIndex = 0; vIndex < m_vehiclesInTrigger.Count; vIndex++)
        {
            if (m_vehiclesInTrigger[vIndex].IsStopped() && a_vehicle != m_vehiclesInTrigger[vIndex])
            {
                return(true);

                break;
            }
        }

        return(false);
    }
コード例 #18
0
    IEnumerator ProcessCheck( TrafficSystemVehicle a_vehicle )
    {
        bool stillWaiting = true;
        while(stillWaiting)
        {
            Collider[] hitColliders = Physics.OverlapSphere(m_checkPos.position, m_checkRadius);
            stillWaiting = false;
            int i = 0;
            while ( i < hitColliders.Length )
            {
                if(hitColliders[i].gameObject.GetComponent<TrafficSystemVehicle>())
                {
                    stillWaiting = true;
                    break;
                }
                i++;
            }

            /*
            RaycastHit[] hitInfo = Physics.SphereCastAll( m_checkPos.position, 10.0f, m_checkPos.transform.up );

            stillWaiting = false;
            for(int hIndex = 0; hIndex < hitInfo.Length; hIndex++)
            {
                TrafficSystemVehicle vehicle = hitInfo[hIndex].transform.GetComponent<TrafficSystemVehicle>();
                if(vehicle)
                    stillWaiting = true;
            }
            */

            if(stillWaiting)
            {
                if(a_vehicle)
                    a_vehicle.WaitingForTraffic = true;

                yield return new WaitForSeconds(m_timeToWaitBetweenCheckes);
            }
            else
            {
                if(a_vehicle)
                    a_vehicle.WaitingForTraffic = false;

                yield return null;
            }
        }

        m_checkStarted = false;
    }
コード例 #19
0
    public void AttachVehicleCameraToPreviousVehicle()
    {
        if(!TrafficSystem.Instance)
            return;

        if(TrafficSystem.Instance.GetSpawnedVehicles().Count <= 0)
            return;

        if(!m_vehicleCamera)
            return;

        m_vehicleCameraIndex--;
        if(m_vehicleCameraIndex < 0)
            m_vehicleCameraIndex = TrafficSystem.Instance.GetSpawnedVehicles().Count - 1;

        m_vehicleToFollow = TrafficSystem.Instance.GetSpawnedVehicles()[m_vehicleCameraIndex];
    }
コード例 #20
0
    public void AttachVehicleCameraToNextVehicle()
    {
        if(TrafficSystem.Instance.GetSpawnedVehicles().Count <= 0)
            return;

        if(!m_vehicleCamera)
            return;

        if(!m_vehicleCamera)
            return;

        m_vehicleCameraIndex++;
        if(m_vehicleCameraIndex >= TrafficSystem.Instance.GetSpawnedVehicles().Count)
            m_vehicleCameraIndex = 0;

        m_vehicleToFollow = TrafficSystem.Instance.GetSpawnedVehicles()[m_vehicleCameraIndex];
    }
コード例 #21
0
    void OnTriggerEnter(Collider a_obj)
    {
        TrafficSystemVehicle vehicle = null;

        if (a_obj.transform.GetComponent <TrafficSystemVehicle>())
        {
            vehicle = a_obj.transform.GetComponent <TrafficSystemVehicle>();
        }

        if (vehicle)
        {
            if (!m_checkStarted)
            {
                m_checkStarted = true;
                StartCoroutine(ProcessCheck(vehicle));
            }
        }
    }
コード例 #22
0
    void Update()
    {
        if (Application.isPlaying && m_enableVehicleCamera)
        {
            if (m_enableVehicleChangeKeyboard)
            {
                if (Input.GetKeyDown(KeyCode.Comma))
                {
                    AttachVehicleCameraToPreviousVehicle();
                }
                else if (Input.GetKeyDown(KeyCode.Period))
                {
                    AttachVehicleCameraToNextVehicle();
                }
            }

            if (m_enableVehicleChangeMouse && Input.GetMouseButtonDown(0) && m_vehicleCamera)
            {
                Ray        ray = m_vehicleCamera.ScreenPointToRay(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f));
                RaycastHit raycastHit;
                if (Physics.Raycast(ray, out raycastHit))
                {
                    if (raycastHit.collider.GetComponent <TrafficSystemVehicle>())
                    {
                        m_vehicleToFollow = raycastHit.collider.GetComponent <TrafficSystemVehicle>();
                    }
                }
            }

            if (m_vehicleCamera && m_vehicleToFollow)
            {
                m_vehicleCamera.transform.position = m_vehicleToFollow.transform.position - (m_vehicleToFollow.transform.forward.normalized * m_vehicleCameraOffsetBehind) + new Vector3(0.0f, m_vehicleCameraOffsetAbove, 0.0f);
                m_vehicleCamera.transform.forward  = Vector3.Slerp(m_vehicleCamera.transform.forward, m_vehicleToFollow.transform.forward + m_vehicleCameraRotation, m_vehicleCameraFaceForwardDelay * Time.deltaTime);
            }
        }
    }
コード例 #23
0
    public void RegisterVehicle( TrafficSystemVehicle a_vehicle )
    {
        if(TrafficSystemUI.Instance)
            TrafficSystemUI.Instance.AssignVehicleToFollow( a_vehicle );

        m_spawnedVehicles.Add( a_vehicle );
    }
コード例 #24
0
 public void UnRegisterVehicle( TrafficSystemVehicle a_vehicle )
 {
     m_spawnedVehicles.Remove( a_vehicle );
     RespawnVehicle();
 }
コード例 #25
0
    public bool VehicleIsOnSameSide( TrafficSystemVehicle a_vehicle )
    {
        if(a_vehicle && a_vehicle.m_nextNode && a_vehicle.m_nextNode.m_driveSide == m_nextNode.m_driveSide)
            return true;

        return false;
    }
コード例 #26
0
    public TrafficSystemNode GetNextNode(TrafficSystemVehicle a_vehicle, bool a_checkLocalConnectedNode = true, List <TrafficSystemNode> a_blockedNodes = null)
    {
        if (m_connectedNodes.Count <= 0 && !m_connectedLocalNode && m_connectedChangeLaneNodes.Count <= 0)
        {
            return(null);
        }

        if (a_checkLocalConnectedNode && m_connectedLocalNode)
        {
            return(m_connectedLocalNode);
        }

        float randomChanceUseOfframp  = Random.Range(0.0f, 1.0f);
        float randomChanceOfDirChange = Random.Range(0.0f, 1.0f);

        if (m_connectedChangeLaneNodes.Count > 0)
        {
            if (randomChanceOfDirChange <= a_vehicle.m_chanceOfDirChange)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if (node)
                {
                    return(node);
                }
            }
            else if (m_connectedNodes.Count <= 0 && !m_connectedLocalNode)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if (node)
                {
                    return(node);
                }
            }
        }

        TrafficSystemNode offrampNode = null;

        for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];
            if (node && node.m_roadType == TrafficSystem.RoadType.OFFRAMP)
            {
                offrampNode = node;
                break;
            }
        }

        if (a_vehicle.m_randomLaneChange > 0.0f && m_connectedNodes.Count > 1)
        {
            float randomChance = Random.Range(0.0f, 1.0f);

            if (randomChance <= a_vehicle.m_randomLaneChange)
            {
                List <int> nodeIndex = new List <int>(m_connectedNodes.Count);
                for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    nodeIndex.Insert(nIndex, nIndex);
                }

                TrafficSystemNode sameLaneNode = null;
                int count = 0;
                while (count < m_connectedNodes.Count)
                {
                    int nIndex = Random.Range(0, nodeIndex.Count);
                    int lIndex = nodeIndex[nIndex];

                    TrafficSystemNode node = m_connectedNodes[lIndex];

                    if (node)
                    {
                        bool blockNode = false;
                        if (a_blockedNodes != null)
                        {
                            for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if (node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if (!blockNode)
                        {
                            if (node.m_lane != m_lane || (node.m_lane == m_lane && node.m_roadType == TrafficSystem.RoadType.OFFRAMP))
                            {
                                return(node);
                            }
                            else
                            {
                                sameLaneNode = node;
                            }
                        }
                    }

                    nodeIndex.Remove(nIndex);
                    count++;
                }

                if (sameLaneNode)
                {
                    return(sameLaneNode);
                }
            }
            else
            {
                for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    TrafficSystemNode node = m_connectedNodes[nIndex];

                    if (node && node.m_lane == m_lane)
                    {
                        bool blockNode = false;
                        if (a_blockedNodes != null)
                        {
                            for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if (node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if (!blockNode)
                        {
                            if (randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                            {
                                if (offrampNode)
                                {
                                    return(offrampNode);
                                }
                            }
                            else if (node.IsNormalRoad())
                            {
                                return(node);
                            }
                        }
                    }
                }
            }
        }

        TrafficSystemNode nextNodeInOurLane    = null;
        TrafficSystemNode nextNodeNotInOurLane = null;

        for (int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];

            if (node)
            {
                bool blockNode = false;
                if (a_blockedNodes != null && m_connectedNodes.Count > 1)
                {
                    for (int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                    {
                        if (node == a_blockedNodes[cIndex])
                        {
                            blockNode = true;
                            break;
                        }
                    }
                }

                if (!blockNode)
                {
                    if (node.m_lane == m_lane)
                    {
                        if (randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                        {
                            if (offrampNode)
                            {
                                return(offrampNode);
                            }
                            else if (node.IsNormalRoad())
                            {
                                return(node);
                            }
                            else
                            {
                                nextNodeInOurLane = node;
                            }
                        }
                        else if (node.IsNormalRoad())
                        {
                            return(node);
                        }
                        else
                        {
                            nextNodeNotInOurLane = node;
                        }
                    }
                    else
                    {
                        nextNodeNotInOurLane = node;
                    }
                }
            }
        }

        if (nextNodeInOurLane)
        {
            return(nextNodeInOurLane);
        }
        else
        {
            return(nextNodeNotInOurLane);
        }
    }
コード例 #27
0
ファイル: TrafficSystemPiece.cs プロジェクト: angryFlo/Test
    public void SpawnRandomVehicle( TrafficSystemVehicle a_vehiclePrefab )
    {
        if(!TrafficSystem.Instance)
            return;

        TrafficSystemNode node = null;

        int randomLane = Random.Range(0, 4);

        switch(randomLane)
        {
        case 0:
        {
            for(int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
            {
                if(m_primaryLeftLaneNodes[nIndex])
                {
                    node = m_primaryLeftLaneNodes[nIndex];
                    break;
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
                {
                    if(m_primaryRightLaneNodes[nIndex])
                    {
                        node = m_primaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
            break;
        case 1:
        {
            for(int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
            {
                if(m_primaryRightLaneNodes[nIndex])
                {
                    node = m_primaryRightLaneNodes[nIndex];
                    break;
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_primaryLeftLaneNodes[nIndex])
                    {
                        node = m_primaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
            break;
        case 2:
        {
            for(int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
            {
                if(m_primaryLeftLaneNodes[nIndex])
                {
                    node = m_primaryLeftLaneNodes[nIndex];
                    break;
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_primaryRightLaneNodes[nIndex])
                    {
                        node = m_primaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
            break;
        case 3:
        {
            for(int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
            {
                if(m_primaryRightLaneNodes[nIndex])
                {
                    node = m_primaryRightLaneNodes[nIndex];
                    break;
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_primaryLeftLaneNodes[nIndex])
                    {
                        node = m_primaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if(!node)
            {
                for(int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if(m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
            break;
        }

        if(node)
        {
            Vector3 pos = node.transform.position;
            pos -= a_vehiclePrefab.m_offsetPosVal;

            TrafficSystemVehicle vehicle = Instantiate( a_vehiclePrefab, pos, node.transform.rotation ) as TrafficSystemVehicle;
            vehicle.m_nextNode           = node;
            vehicle.m_velocityMax        = Random.Range(TrafficSystem.Instance.m_randVehicleVelocityMin, TrafficSystem.Instance.m_randVehicleVelocityMax);

            TrafficSystemNode nextNode = node.GetNextNode( vehicle, false );
            if(nextNode)
                vehicle.transform.forward = nextNode.transform.position - vehicle.transform.position;

        //			TrafficSystem.Instance.RegisterVehicle( vehicle );
        }
    }
コード例 #28
0
ファイル: TrafficSystemPiece.cs プロジェクト: farizekber/Test
    public void SpawnRandomVehicle(TrafficSystemVehicle a_vehiclePrefab)
    {
        if (!TrafficSystem.Instance)
        {
            return;
        }

        TrafficSystemNode node = null;

        int randomLane = Random.Range(0, 4);

        switch (randomLane)
        {
        case 0:
        {
            for (int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
            {
                if (m_primaryLeftLaneNodes[nIndex])
                {
                    node = m_primaryLeftLaneNodes[nIndex];
                    break;
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
                {
                    if (m_primaryRightLaneNodes[nIndex])
                    {
                        node = m_primaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
        break;

        case 1:
        {
            for (int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
            {
                if (m_primaryRightLaneNodes[nIndex])
                {
                    node = m_primaryRightLaneNodes[nIndex];
                    break;
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_primaryLeftLaneNodes[nIndex])
                    {
                        node = m_primaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
        break;

        case 2:
        {
            for (int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
            {
                if (m_primaryLeftLaneNodes[nIndex])
                {
                    node = m_primaryLeftLaneNodes[nIndex];
                    break;
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_primaryRightLaneNodes[nIndex])
                    {
                        node = m_primaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
        break;

        case 3:
        {
            for (int nIndex = 0; nIndex < m_primaryRightLaneNodes.Count; nIndex++)
            {
                if (m_primaryRightLaneNodes[nIndex])
                {
                    node = m_primaryRightLaneNodes[nIndex];
                    break;
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_primaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_primaryLeftLaneNodes[nIndex])
                    {
                        node = m_primaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryRightLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryRightLaneNodes[nIndex])
                    {
                        node = m_secondaryRightLaneNodes[nIndex];
                        break;
                    }
                }
            }

            if (!node)
            {
                for (int nIndex = 0; nIndex < m_secondaryLeftLaneNodes.Count; nIndex++)
                {
                    if (m_secondaryLeftLaneNodes[nIndex])
                    {
                        node = m_secondaryLeftLaneNodes[nIndex];
                        break;
                    }
                }
            }
        }
        break;
        }

        if (node)
        {
            Vector3 pos = node.transform.position;
            pos -= a_vehiclePrefab.m_offsetPosVal;

            TrafficSystemVehicle vehicle = Instantiate(a_vehiclePrefab, pos, node.transform.rotation) as TrafficSystemVehicle;
            vehicle.m_nextNode    = node;
            vehicle.m_velocityMax = Random.Range(TrafficSystem.Instance.m_randVehicleVelocityMin, TrafficSystem.Instance.m_randVehicleVelocityMax);

            TrafficSystemNode nextNode = node.GetNextNode(vehicle, false);
            if (nextNode)
            {
                vehicle.transform.forward = nextNode.transform.position - vehicle.transform.position;
            }

//			TrafficSystem.Instance.RegisterVehicle( vehicle );
        }
    }
コード例 #29
0
    public virtual void Update()
    {
        //		CanSeeVehicleViaSphere();

        if(!TrafficLight)
            m_trafficLightCoolDown += Time.deltaTime;

        StopMoving = false;

        if(WaitingForTraffic)
            StopMoving = true;

        if(CrashDetected)
        {
            m_timetoWaitAfterCrashTimer += Time.deltaTime;
            CrashOverCheck();
        }

        if(IsStuck())
        {
            m_stuckDestroyTimer += Time.deltaTime;
            if(m_stuckDestroyTimer >= m_stuckDestroyTimerMax)
            {
                if (Debug.isDebugBuild)
                    Debug.LogWarning("Vehicle Destroyed - m_stuckDestroyTimerMax - Vehicle had unusual behaviour");

                Kill();
            }
        }
        else if(IsStopped() && m_enableWaitingDestroyTimer)
        {
            m_waitingDestroyTimer += Time.deltaTime;
            if(m_waitingDestroyTimer >= m_waitingDestroyTimerMax)
            {
                if (Debug.isDebugBuild)
                    Debug.LogWarning("Vehicle Destroyed - m_waitingDestroyTimerMax - (m_enableWaitingDestroyTimer = true) - Vehicle was waiting too long in the one position");

                Kill();
            }
        }
        else
        {
            m_waitingDestroyTimer = 0.0f;
            m_stuckDestroyTimer   = 0.0f;
        }

        if(!m_useRoadSpeedLimits && m_velocityMaxOriginal != m_velocityMax)
        {
            m_returnToOriginalVelocityTimer += Time.deltaTime;
            if(m_returnToOriginalVelocityTimer >= m_returnToOriginalVelocityTimerMax)
            {
                m_velocityMax = m_velocityMaxOriginal;
                m_returnToOriginalVelocityTimer = 0.0f;
            }
        }

        if(VehicleHit) // if we are close to a car previously, wait before checking
        {
            m_waitTimer += Time.deltaTime;
            if(m_waitTimer < m_waitTime)
                return;
        }

        if(m_nextNode)
        {
            bool isOnHighway = false;
            if(m_nextNode.IsHighway() && m_nextNode.IsHighwayChangeLaneAccepted() && m_vehicleCheckOvertakeOnHighway && m_nodeHighwaySearch != m_nextNode)
                isOnHighway = true;

            if(isOnHighway)
            {
                RaycastHit hitInfo;
                VehicleHit  = null;
                if(Physics.SphereCast( (transform.position + m_vehicleCheckOffset), m_vehicleCheckRadiusOvertakeHighwayOnly, transform.forward, out hitInfo, m_vehicleCheckDistOvertakeHighwayOnly ))
                {
                    TrafficSystemVehicle vehicle = hitInfo.transform.GetComponent<TrafficSystemVehicle>();
                    if(vehicle)
                    {
                        if(vehicle != this && vehicle.VehicleHit != this && vehicle != m_previousVehicleToTryOvertaking)
                        {
                            float randChanceToOvertake = 0.0f;
                            randChanceToOvertake = Random.Range(0.0f, 1.0f);

                            m_previousVehicleToTryOvertaking = vehicle;

                            if(randChanceToOvertake <= m_randomChanceToOvertake)
                            {
                                TrafficSystemNode node = m_nextNode.GetNextNodeHighway();
                                if(node)
                                {
                                    SetNextNode( node );
                                    m_nodeHighwaySearch = m_nextNode;
                                }
                            }
                        }
                    }
                }

                RaycastHit[] hitInfoAll = Physics.SphereCastAll( (transform.position + m_vehicleCheckOffset), m_vehicleCheckRadius, transform.forward, m_vehicleCheckDist );
                VehicleHit  = null;
                for(int hIndex = 0; hIndex < hitInfoAll.Length; hIndex++)
                {
                    TrafficSystemVehicle vehicle = hitInfoAll[hIndex].transform.GetComponent<TrafficSystemVehicle>();
                    if(vehicle)
                    {
                        if(vehicle != this && vehicle.VehicleHit != this)
                        {
                            StopMoving = true;
                            VehicleHit = vehicle;
                            m_velocityMax = VehicleHit.m_velocityMax;
                            m_waitTimer = 0.0f;
                            m_waitTime = Random.Range(m_waitTimeMin, m_waitTimeMax);
                        }
                    }
                }
            }
            else
            {
                RaycastHit[] hitInfoAll = Physics.SphereCastAll( (transform.position + m_vehicleCheckOffset), m_vehicleCheckRadius, transform.forward, m_vehicleCheckDist );
                VehicleHit  = null;
                for(int hIndex = 0; hIndex < hitInfoAll.Length; hIndex++)
                {
                    TrafficSystemVehicle vehicle = hitInfoAll[hIndex].transform.GetComponent<TrafficSystemVehicle>();
                    if(vehicle)
                    {
                        if(vehicle != this && vehicle.VehicleHit != this)
                        {
                            StopMoving = true;
                            VehicleHit = vehicle;
                            m_velocityMax = VehicleHit.m_velocityMax;
                            m_waitTimer = 0.0f;
                            m_waitTime = Random.Range(m_waitTimeMin, m_waitTimeMax);
                        }
                    }
                }
            }

            if(!VehicleHit && m_enableVehicleCheckMid)
            {
                RaycastHit[] hitInfo = Physics.SphereCastAll( (transform.position + m_vehicleCheckOffset), (m_vehicleCheckRadius * m_vehicleCheckRadiusMid ), transform.forward, m_vehicleCheckDist - m_vehicleCheckDistMid );

                VehicleHit  = null;
                for(int hIndex = 0; hIndex < hitInfo.Length; hIndex++)
                {
                    TrafficSystemVehicle vehicle = hitInfo[hIndex].transform.GetComponent<TrafficSystemVehicle>();
                    if(vehicle)
                    {
                        if(vehicle != this && vehicle.VehicleHit != this )
                        {
                            StopMoving = true;
                            VehicleHit = vehicle;
                            m_velocityMax = VehicleHit.m_velocityMax;
                            m_waitTimer = 0.0f;
                            m_waitTime = Random.Range(m_waitTimeMin, m_waitTimeMax);
                        }
                    }
                }
            }
        }

        if(!StopMoving && TrafficLight && !CrashDetected) // determine if there is there is room to move throught the intersection
        {
            if(TrafficLight.m_status == TrafficSystemTrafficLight.Status.RED)
            {
                //print ("TrafficLight = RED");
                StopMoving = true;
            }
            else if(CanSeeVehicleViaSphere() && !TrafficLight.IgnoreCanFitAcrossIntersectionCheck())
            {
                //print ("CanSeeVehicleViaSphere: = TRUE");
                StopMoving = true;
            }
            else if(!CanFitAcrossIntersection() && !TrafficLight.IgnoreCanFitAcrossIntersectionCheck())
            {
                //print ("CanFitAcrossIntersection: = FALSE");
                StopMoving = true;
            }
            else if(TrafficLight.m_status == TrafficSystemTrafficLight.Status.YELLOW)
            {
                m_trafficLightYellowEnterDurationTimer += Time.deltaTime;
                if(m_trafficLightYellowEnterDurationTimer <= m_trafficLightYellowEnterDuration)
                {
                    DriveThroughLights();
                }
                else
                    //print ("TrafficLight = RED OR YELLOW");
                    StopMoving = true;
            }
            else if(TrafficLight.m_status == TrafficSystemTrafficLight.Status.GREEN)
            {
                DriveThroughLights();
            }

        //			print ("TrafficLight: " + TrafficLight);
        }

        if(!StopMoving && m_nextNode && !CrashDetected)// && !m_pathingStarted)
        {
            VehicleInSights = CanSeeVehicleViaRay();
            float ratio = 1.0f;
            if(VehicleInSights)
            {
                if(VehicleInSights.VehicleInSights && VehicleInSights.VehicleInSights == this)
                {
                    // do nothing as these two cars are facing eachother for unknown reasons so none of them should slow down with this ray detection.
                }
                else
                {
                    float velocityRatio = 1.0f;

        //					if(m_velocity > 0.0f)
        //						velocityRatio = VehicleInSights.m_velocity / m_velocity;

                    Vector3 dirOfVehicleInSight = transform.position - VehicleInSights.transform.position;
                    ratio = Mathf.Clamp((dirOfVehicleInSight.magnitude / m_vehicleCheckDistRay), 0.0f, 1.0f);

                    if(ratio < m_vehicleCheckDistRayMimicSpeedThreshold)
                        m_velocityMax = VehicleInSights.m_velocityMax;
                }
            }

            if(Accelerate)                                                              // are we accelerating?
                m_velocity = m_velocity + ((m_accelerationRate * ratio) * Time.deltaTime);        // add to the current velocity according while accelerating
        //			else
        //				m_velocity = m_velocity - (m_decelerationRate * Time.deltaTime);        // subtract from the current velocity while decelerating

            float velTmp = m_velocityMax * ratio;

            if(velTmp > m_velocity)
                m_velocity = m_velocity - ((m_accelerationRate * m_decelerationPercentage) * Time.deltaTime);
            else
                m_velocity = velTmp;

            if(VehicleHit)
                m_velocity = VehicleHit.m_velocity;                                     // ensure the velocity is the same as the car in front
            else
                m_velocity = Mathf.Clamp(m_velocity, m_velocityMin, m_velocityMax);     // ensure the velocity never goes out of the min/max boundaries

            Vector3 dir = m_nextNode.transform.position;
            dir.x      += m_lanePosVariation;
            dir.z      += m_lanePosVariation;
            dir         = dir - (transform.position + m_offsetPosVal);           // find the direction to the next node

            Vector3 speed = dir.normalized * m_velocity;                                // work out how fast we should travel in the desired directoin

            for(int rIndex = 0; rIndex < m_lightsRear.Length; rIndex++)
            {
                if(m_lightsRear[rIndex].gameObject.activeSelf)
                    m_lightsRear[rIndex].gameObject.SetActive(false);
            }

            Vector3 wheelAxis = Vector3.zero;

            if(m_wheelAxis == AxisType.X)
                wheelAxis = new Vector3(1.0f, 0.0f, 0.0f);
            else if(m_wheelAxis == AxisType.Y)
                wheelAxis = new Vector3(0.0f, 1.0f, 0.0f);
            else if(m_wheelAxis == AxisType.Z)
                wheelAxis = new Vector3(0.0f, 0.0f, 1.0f);

            for(int wIndex = 0; wIndex < m_wheelsFront.Length; wIndex++)
                m_wheelsFront[wIndex].transform.Rotate(wheelAxis, m_velocity * m_wheelRotMultiplier);

            for(int wIndex = 0; wIndex < m_wheelsRear.Length; wIndex++)
                m_wheelsRear[wIndex].transform.Rotate(wheelAxis, m_velocity * m_wheelRotMultiplier);

            if(m_rigidbody)                                                             // if we have a rigidbody, use the following code to move us
            {
                m_rigidbody.velocity = speed;                                           // set our rigidbody to this speed to move us by the determined speed
                transform.forward    = Vector3.Lerp( transform.forward, dir.normalized, m_rotationSpeed * Time.deltaTime );    // rotate our forward directoin over time to face the node we are moving towards
            }
            else                                                                        // no rigidbody then use the following code to move us
            {
                if(m_collider || collider)                                              // it generally is a bad idea to move something with a collider, so we should tell someone about it if this is happening. See Unity Docs for more info: http://docs.unity3d.com/ScriptReference/Collider.html
                    Debug.LogWarning("Traffic System Warning -> VehicleBase has a collider. You should think about moving the object with a rigidbody instead.");

                transform.position += speed * Time.deltaTime;                           // move us by the determined speed
                transform.forward   = Vector3.Lerp( transform.forward, dir.normalized, m_rotationSpeed * Time.deltaTime );     // rotate our forward directoin over time to face the node we are moving towards
            }

            if(dir.magnitude < m_nextNodeThreshold)                                     // if we are close enough to the node we were travelling towards then check for the next one
            {
        //				if(m_nextNode.HasSplineToFollow( this ))
        //				{
        //					if(!m_traversePath)
        //					{
        //						m_traversePath = true;
        //						ProcessSpline();
        //					}
        //				}
        //				else

        //				if(!IsTrafficJamOnUpcomingNodes())
        //				{
        //					TrafficSystemNode preNextNode = m_nextNode;
        //
        //					List<TrafficSystemNode> blockedNodes = new List<TrafficSystemNode>();
        //					for(int nIndex = 0; nIndex < m_nextNode.m_connectedNodes.Count; nIndex++)
        //					{
        //						TrafficSystemNode nodeToCheck = m_nextNode.m_connectedNodes[nIndex];
        //						if(VehicleExistsOnNode(nodeToCheck))
        //							blockedNodes.Add(nodeToCheck);
        //					}
        //
                SetNextNode( m_nextNode.GetNextNode( this, true/*, blockedNodes*/ ) );                            // gets the next required node to go to and start the process all over again
                //}
            }
        }
        else if(CrashDetected)
        {
            // don't stop, but don't do anything
        }
        else if(StopMoving)
        {
            Stop();
        }

        if(m_killOnEmptyPath && !m_nextNode)
        {
            if (Debug.isDebugBuild)
                Debug.LogWarning("Vehicle Destroyed - No path node");

            Kill();
        }
    }
コード例 #30
0
    public TrafficSystemNode GetNextNode( TrafficSystemVehicle a_vehicle, bool a_checkLocalConnectedNode = true, List<TrafficSystemNode> a_blockedNodes = null )
    {
        if(m_connectedNodes.Count <= 0 && !m_connectedLocalNode && m_connectedChangeLaneNodes.Count <= 0)
            return null;

        if(a_checkLocalConnectedNode && m_connectedLocalNode)
            return m_connectedLocalNode;

        float randomChanceUseOfframp  = Random.Range(0.0f, 1.0f);
        float randomChanceOfDirChange = Random.Range(0.0f, 1.0f);

        if(m_connectedChangeLaneNodes.Count > 0)
        {
            if(randomChanceOfDirChange <= a_vehicle.m_chanceOfDirChange)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if(node)
                    return node;
            }
            else if(m_connectedNodes.Count <= 0 && !m_connectedLocalNode)
            {
                TrafficSystemNode node = GetRandomChangeLangeNode();

                if(node)
                    return node;
            }
        }

        TrafficSystemNode offrampNode = null;
        for(int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];
            if(node && node.m_roadType == TrafficSystem.RoadType.OFFRAMP)
            {
                offrampNode = node;
                break;
            }
        }

        if(a_vehicle.m_randomLaneChange > 0.0f && m_connectedNodes.Count > 1)
        {
            float randomChance = Random.Range(0.0f, 1.0f);

            if(randomChance <= a_vehicle.m_randomLaneChange)
            {
                List<int> nodeIndex = new List<int>(m_connectedNodes.Count);
                for(int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    nodeIndex.Insert(nIndex, nIndex);
                }

                TrafficSystemNode sameLaneNode = null;
                int count = 0;
                while(count < m_connectedNodes.Count)
                {
                    int nIndex = Random.Range(0, nodeIndex.Count);
                    int lIndex = nodeIndex[nIndex];

                    TrafficSystemNode node = m_connectedNodes[lIndex];

                    if(node)
                    {
                        bool blockNode = false;
                        if(a_blockedNodes != null)
                        {
                            for(int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if(node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if(!blockNode)
                        {
                            if(node.m_lane != m_lane || (node.m_lane == m_lane && node.m_roadType == TrafficSystem.RoadType.OFFRAMP) )
                                return node;
                            else
                                sameLaneNode = node;
                        }
                    }

                    nodeIndex.Remove(nIndex);
                    count++;
                }

                if(sameLaneNode)
                    return sameLaneNode;
            }
            else
            {
                for(int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
                {
                    TrafficSystemNode node = m_connectedNodes[nIndex];

                    if(node && node.m_lane == m_lane)
                    {
                        bool blockNode = false;
                        if(a_blockedNodes != null)
                        {
                            for(int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                            {
                                if(node == a_blockedNodes[cIndex])
                                {
                                    blockNode = true;
                                    break;
                                }
                            }
                        }

                        if(!blockNode)
                        {
                            if(randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                            {
                                if(offrampNode)
                                    return offrampNode;
                            }
                            else if(node.IsNormalRoad())
                                return node;
                        }
                    }
                }
            }
        }

        TrafficSystemNode nextNodeInOurLane    = null;
        TrafficSystemNode nextNodeNotInOurLane = null;
        for(int nIndex = 0; nIndex < m_connectedNodes.Count; nIndex++)
        {
            TrafficSystemNode node = m_connectedNodes[nIndex];

            if(node)
            {
                bool blockNode = false;
                if(a_blockedNodes != null && m_connectedNodes.Count > 1)
                {
                    for(int cIndex = 0; cIndex < a_blockedNodes.Count; cIndex++)
                    {
                        if(node == a_blockedNodes[cIndex])
                        {
                            blockNode = true;
                            break;
                        }
                    }
                }

                if(!blockNode)
                {

                    if(node.m_lane == m_lane)
                    {
                        if(randomChanceUseOfframp <= a_vehicle.m_chanceOfUsingOfframp)
                        {
                            if(offrampNode)
                                return offrampNode;
                            else if(node.IsNormalRoad())
                                return node;
                            else
                                nextNodeInOurLane = node;
                        }
                        else if(node.IsNormalRoad())
                            return node;
                        else
                            nextNodeNotInOurLane = node;
                    }
                    else
                        nextNodeNotInOurLane = node;
                }
            }
        }

        if(nextNodeInOurLane)
            return nextNodeInOurLane;
        else
            return nextNodeNotInOurLane;
    }
コード例 #31
0
    public bool VehicleHasFocus( TrafficSystemVehicle a_vehicle )
    {
        if(m_followCameraScript)
        {
            if(m_followCameraScript.m_vehicleToFollow == a_vehicle)
                return true;
        }

        return false;
    }
コード例 #32
0
ファイル: TrafficSystem.cs プロジェクト: farizekber/Test
 public void UnRegisterVehicle(TrafficSystemVehicle a_vehicle)
 {
     m_spawnedVehicles.Remove(a_vehicle);
     RespawnVehicle();
 }
コード例 #33
0
    public override void Update()
    {
        if (!TrafficLight)
        {
            m_trafficLightCoolDown += Time.deltaTime;
        }

        StopMoving = false;

        if (WaitingForTraffic)
        {
            StopMoving = true;
        }

        if (CrashDetected)
        {
            m_timetoWaitAfterCrashTimer += Time.deltaTime;
            CrashOverCheck();
        }

        if (IsStuck())
        {
            m_stuckDestroyTimer += Time.deltaTime;
            if (m_stuckDestroyTimer >= m_stuckDestroyTimerMax)
            {
                if (Debug.isDebugBuild)
                {
                    Debug.LogWarning("Vehicle Destroyed - m_stuckDestroyTimerMax - Vehicle had unusual behaviour");
                }

                Kill();
            }
        }
        else
        {
            m_stuckDestroyTimer = 0.0f;
        }

        if (!m_useRoadSpeedLimits && m_velocityMaxOriginal != m_velocityMax)
        {
            m_returnToOriginalVelocityTimer += Time.deltaTime;
            if (m_returnToOriginalVelocityTimer >= m_returnToOriginalVelocityTimerMax)
            {
                m_velocityMax = m_velocityMaxOriginal;
                m_returnToOriginalVelocityTimer = 0.0f;
            }
        }

        if (VehicleHit)        // if we are close to a car previously, wait before checking
        {
            m_waitTimer += Time.deltaTime;
            if (m_waitTimer < m_waitTime)
            {
                return;
            }
        }

        if (m_nextNode)
        {
            RaycastHit[] hitInfoAll = Physics.SphereCastAll((transform.position + m_vehicleCheckOffset), m_vehicleCheckRadius, transform.forward, m_vehicleCheckDist);
            VehicleHit = null;
            for (int hIndex = 0; hIndex < hitInfoAll.Length; hIndex++)
            {
                TrafficSystemVehicle vehicle = hitInfoAll[hIndex].transform.GetComponent <TrafficSystemVehicle>();
                if (vehicle)
                {
                    if (vehicle != this && vehicle.VehicleHit != this)
                    {
                        StopMoving    = true;
                        VehicleHit    = vehicle;
                        m_velocityMax = VehicleHit.m_velocityMax;
                        m_waitTimer   = 0.0f;
                        m_waitTime    = Random.Range(m_waitTimeMin, m_waitTimeMax);
                    }
                }
            }

            if (!VehicleHit && m_enableVehicleCheckMid)
            {
                RaycastHit[] hitInfo = Physics.SphereCastAll((transform.position + m_vehicleCheckOffset), (m_vehicleCheckRadius * m_vehicleCheckRadiusMid), transform.forward, m_vehicleCheckDist - m_vehicleCheckDistMid);

                VehicleHit = null;
                for (int hIndex = 0; hIndex < hitInfo.Length; hIndex++)
                {
                    TrafficSystemVehicle vehicle = hitInfo[hIndex].transform.GetComponent <TrafficSystemVehicle>();
                    if (vehicle)
                    {
                        if (vehicle.VehicleHit != this)
                        {
                            StopMoving    = true;
                            VehicleHit    = vehicle;
                            m_velocityMax = VehicleHit.m_velocityMax;
                            m_waitTimer   = 0.0f;
                            m_waitTime    = Random.Range(m_waitTimeMin, m_waitTimeMax);
                        }
                    }
                }
            }
        }

        if (!StopMoving && !WaitForUserInput && TrafficLight && !CrashDetected)        // determine if there is there is room to move throught the intersection
        {
            if (TrafficLight.m_status == TrafficSystemTrafficLight.Status.RED ||
                TrafficLight.m_status == TrafficSystemTrafficLight.Status.YELLOW)
            {
                //				print ("TrafficLight = RED OR YELLOW");
                StopMoving = true;
            }
            else if (CanSeeVehicleViaSphere())
            {
                //				print ("CanSeeVehicleViaSphere: = TRUE");
                StopMoving = true;
            }
            else if (!CanFitAcrossIntersection())
            {
                //				print ("CanFitAcrossIntersection: = FALSE");
                StopMoving = true;
            }
            else if (TrafficLight.m_status == TrafficSystemTrafficLight.Status.GREEN)
            {
                if (TrafficLight.m_intersection)
                {
                    if (TrafficLight.m_intersection.m_intersectionSystem == TrafficSystemIntersection.IntersectionSystem.SINGLE)
                    {
                        //						print ("GO!");
                        TrafficLight = null;
                        StopMoving   = false;
                    }
                    else if (TrafficLight.m_intersection.m_intersectionSystem == TrafficSystemIntersection.IntersectionSystem.DUAL)
                    {
                        if (IsTurningIntoIncomingTraffic())
                        {
                            //							print ("IsTurningIntoIncomingTraffic: = TRUE");
                            StopMoving = true;
                        }
                        else
                        {
                            //							print ("GO!");
                            TrafficLight = null;
                            StopMoving   = false;
                        }
                    }
                }
                else
                {
                    Debug.LogWarning("Traffic System Traffic Light is missing a parent intersection! See the example traffic system intersection and the structure setup as this is what you need to mimic");
                }
            }

            //			print ("TrafficLight: " + TrafficLight);
        }

        if (!StopMoving && !WaitForUserInput && m_nextNode && !CrashDetected)       // && !m_pathingStarted)
        {
            VehicleInSights = CanSeeVehicleViaRay();
            float ratio = 1.0f;
            if (VehicleInSights)
            {
                if (VehicleInSights.VehicleInSights && VehicleInSights.VehicleInSights == this)
                {
                    // do nothing as these two cars are facing eachother for unknown reasons so none of them should slow down with this ray detection.
                }
                else
                {
                    float velocityRatio = 1.0f;

                    //					if(m_velocity > 0.0f)
                    //						velocityRatio = VehicleInSights.m_velocity / m_velocity;

                    Vector3 dirOfVehicleInSight = transform.position - VehicleInSights.transform.position;
                    ratio = Mathf.Clamp((dirOfVehicleInSight.magnitude / m_vehicleCheckDistRay), 0.0f, 1.0f);

                    if (ratio < m_vehicleCheckDistRayMimicSpeedThreshold)
                    {
                        m_velocityMax = VehicleInSights.m_velocityMax;
                    }
                }
            }

            if (Accelerate)                                                                         // are we accelerating?
            {
                m_velocity = m_velocity + ((m_accelerationRate * ratio) * Time.deltaTime);          // add to the current velocity according while accelerating
            }
            float velTmp = m_velocityMax * ratio;

            if (velTmp > m_velocity)
            {
                m_velocity = m_velocity - ((m_accelerationRate * m_decelerationPercentage) * Time.deltaTime);
            }
            else
            {
                m_velocity = velTmp;
            }

            if (VehicleHit)
            {
                m_velocity = VehicleHit.m_velocity;                                                     // ensure the velocity is the same as the car in front
            }
            else
            {
                m_velocity = Mathf.Clamp(m_velocity, m_velocityMin, m_velocityMax);                     // ensure the velocity never goes out of the min/max boundaries
            }
            Vector3 dir = m_nextNode.transform.position;
            dir.x += m_lanePosVariation;
            dir.z += m_lanePosVariation;
            dir    = dir - (transform.position + m_offsetPosVal);                            // find the direction to the next node

            Vector3 speed = dir.normalized * m_velocity;                                     // work out how fast we should travel in the desired directoin

            for (int rIndex = 0; rIndex < m_lightsRear.Length; rIndex++)
            {
                if (m_lightsRear[rIndex].gameObject.activeSelf)
                {
                    m_lightsRear[rIndex].gameObject.SetActive(false);
                }
            }

            Vector3 wheelAxis = Vector3.zero;

            if (m_wheelAxis == AxisType.X)
            {
                wheelAxis = new Vector3(1.0f, 0.0f, 0.0f);
            }
            else if (m_wheelAxis == AxisType.Y)
            {
                wheelAxis = new Vector3(0.0f, 1.0f, 0.0f);
            }
            else if (m_wheelAxis == AxisType.Z)
            {
                wheelAxis = new Vector3(0.0f, 0.0f, 1.0f);
            }

            for (int wIndex = 0; wIndex < m_wheelsFront.Length; wIndex++)
            {
                m_wheelsFront[wIndex].transform.Rotate(wheelAxis, m_velocity * m_wheelRotMultiplier);
            }

            for (int wIndex = 0; wIndex < m_wheelsRear.Length; wIndex++)
            {
                m_wheelsRear[wIndex].transform.Rotate(wheelAxis, m_velocity * m_wheelRotMultiplier);
            }

            float rotSpeed = (m_velocity / m_velocityMax) * m_rotationSpeed;
            if (m_rigidbody)                                                                                       // if we have a rigidbody, use the following code to move us
            {
                m_rigidbody.velocity = speed;                                                                      // set our rigidbody to this speed to move us by the determined speed
                transform.forward    = Vector3.Lerp(transform.forward, dir.normalized, rotSpeed * Time.deltaTime); // rotate our forward directoin over time to face the node we are moving towards
            }
            else                                                                                                   // no rigidbody then use the following code to move us
            {
                if (m_collider || GetComponent <Collider>())                                                       // it generally is a bad idea to move something with a collider, so we should tell someone about it if this is happening. See Unity Docs for more info: http://docs.unity3d.com/ScriptReference/Collider.html
                {
                    Debug.LogWarning("Traffic System Warning -> VehicleBase has a collider. You should think about moving the object with a rigidbody instead.");
                }

                transform.position += speed * Time.deltaTime;                                                     // move us by the determined speed
                transform.forward   = Vector3.Lerp(transform.forward, dir.normalized, rotSpeed * Time.deltaTime); // rotate our forward directoin over time to face the node we are moving towards
            }

            if (dir.magnitude < m_nextNodeThreshold)                                                // if we are close enough to the node we were travelling towards then check for the next one
            {
                if (m_nextNode.IsDirectionChange())
                {
                    WaitForUserInput = true;
                }
                else
                {
                    SetNextNode(m_nextNode.GetNextNode(this, true /*, blockedNodes*/));                         // gets the next required node to go to and start the process all over again
                }
                ChangeLaneActivated = false;
            }
        }
        else if (CrashDetected)
        {
            // don't stop, but don't do anything
        }
        else if (StopMoving || WaitForUserInput)
        {
            Stop();
        }

        if (m_killOnEmptyPath && !m_nextNode)
        {
            if (Debug.isDebugBuild)
            {
                Debug.LogWarning("Vehicle Destroyed - No path node");
            }

            Kill();
        }
    }
コード例 #34
0
    void Update()
    {
        if(Application.isPlaying && m_enableVehicleCamera)
        {
            if(m_enableVehicleChangeKeyboard)
            {
                if(Input.GetKeyDown(KeyCode.Comma))
                    AttachVehicleCameraToPreviousVehicle();
                else if(Input.GetKeyDown(KeyCode.Period))
                    AttachVehicleCameraToNextVehicle();
            }

            if(m_enableVehicleChangeMouse && Input.GetMouseButtonDown(0) && m_vehicleCamera)
            {
                Ray ray = m_vehicleCamera.ScreenPointToRay (new Vector3(Input.mousePosition.x,Input. mousePosition.y, 0.0f));
                RaycastHit raycastHit;
                if(Physics.Raycast(ray, out raycastHit))
                {
                    if(raycastHit.collider.GetComponent<TrafficSystemVehicle>())
                        m_vehicleToFollow = raycastHit.collider.GetComponent<TrafficSystemVehicle>();
                }
            }

            if(m_vehicleCamera && m_vehicleToFollow)
            {
                m_vehicleCamera.transform.position = m_vehicleToFollow.transform.position - (m_vehicleToFollow.transform.forward.normalized * m_vehicleCameraOffsetBehind) + new Vector3(0.0f, m_vehicleCameraOffsetAbove, 0.0f);
                m_vehicleCamera.transform.forward  = Vector3.Slerp( m_vehicleCamera.transform.forward, m_vehicleToFollow.transform.forward + m_vehicleCameraRotation, m_vehicleCameraFaceForwardDelay * Time.deltaTime );
            }
        }
    }