Newer
Older
Traffic-Simulator / Assets / Scripts / Roads.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Roads : MonoBehaviour {
    public List<Node> nodes = new List<Node>();
    public List<Road> roads = new List<Road>();
    public FlatBezierRenderer roadRenderer;
    public Camera mainCamera;
    private bool down = false;
    public Material material;

    void Start() {
    }

    private Node startNode;

    private void startRoad() {
        Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), out RaycastHit hit, Mathf.Infinity, 1 << 6);
        foreach (Node node in nodes) {
            if ((hit.point - node.position).magnitude < 1.0f) {
                startNode = node;
                down = true;
                return;
            }
        } 
        Vector3 position = new Vector3(hit.point.x, 0.0f, hit.point.z);
        startNode = new Node(position, transform, material);
        nodes.Add(startNode);
        down = true;
    }

    private void endRoad() {
        Physics.Raycast(mainCamera.ScreenPointToRay(Input.mousePosition), out RaycastHit hit, Mathf.Infinity, 1 << 6);
        Node endNode = null;
        foreach (Node node in nodes) {
            if ((hit.point - node.position).magnitude < 1.0f) {
                endNode = node;
                break;
            }
        }
        if (endNode == null) {
            Vector3 position = new Vector3(hit.point.x, 0.0f, hit.point.z);
            endNode = new Node(position, transform, material);
            nodes.Add(endNode);
        }
        
        Road road = new Road(startNode, endNode, material);
        if (!roads.Contains(road)) {
            road.initialize(transform);
            roads.Add(road);
            startNode.roads.Add(road);
            endNode.roads.Add(road);
        }
        startNode = null;
        down = false;
    }

    void Update() {
        if (Input.GetAxis("Fire1") != 0.0f) {
            if (!down) {
                startRoad();
            }
        } else {
            if (down) {
                endRoad();
            }
        }
    }
}