diff --git a/Assets/Scripts/FlatBezierRenderer.cs b/Assets/Scripts/FlatBezierRenderer.cs index e712521..b8dad15 100644 --- a/Assets/Scripts/FlatBezierRenderer.cs +++ b/Assets/Scripts/FlatBezierRenderer.cs @@ -40,6 +40,7 @@ mesh.Clear(); mesh.vertices = vertices; mesh.triangles = indices; + mesh.Optimize(); } private Vector3 getTangent(float t) { diff --git a/Assets/Scripts/FlatBezierRenderer.cs b/Assets/Scripts/FlatBezierRenderer.cs index e712521..b8dad15 100644 --- a/Assets/Scripts/FlatBezierRenderer.cs +++ b/Assets/Scripts/FlatBezierRenderer.cs @@ -40,6 +40,7 @@ mesh.Clear(); mesh.vertices = vertices; mesh.triangles = indices; + mesh.Optimize(); } private Vector3 getTangent(float t) { diff --git a/Assets/Scripts/Road.cs b/Assets/Scripts/Road.cs index 3d3f5bf..0af2218 100644 --- a/Assets/Scripts/Road.cs +++ b/Assets/Scripts/Road.cs @@ -5,10 +5,10 @@ public class Road { public List nodes = new List(); Bezier path; - FlatBezierRenderer pathLine; - FlatBezierRenderer roadBody; + FlatBezierRenderer pathLine, roadBody; Config config; - + MeshCollider collider; + public Road(Node start, Node end, Config config) { nodes.Add(start); nodes.Add(end); @@ -20,25 +20,27 @@ public void initialize(Transform parent) { + GameObject child = new GameObject(); + child.transform.parent = parent; GameObject lineChild = new GameObject(); lineChild.transform.position = Vector3.zero; lineChild.AddComponent().material = config.roadEditMaterial; lineChild.AddComponent().mesh = pathLine.mesh; - lineChild.transform.parent = parent; - GameObject roadChild = new GameObject(); + lineChild.transform.parent = child.transform; + GameObject roadChild = new GameObject(); + collider = roadChild.AddComponent(); roadChild.transform.position = Vector3.zero; roadChild.AddComponent().material = config.roadMaterial; - roadChild.transform.parent = parent; + roadChild.transform.parent = child.transform; roadChild.layer = 8; - roadChild.AddComponent(); roadChild.AddComponent().mesh = roadBody.mesh; - - update(true); + roadChild.AddComponent().road = this; } public void update(bool updateOthers) { path.A = nodes[0].position; + path.D = nodes[1].position; if (nodes[0].roads.Count == 2) { path.B = nodes[0].position + 0.25f * (nodes[1].position - nodes[0].getOther(nodes[1]).position); @@ -56,9 +58,9 @@ node.lateUpdate(this); } } - path.D = nodes[1].position; pathLine.update(); roadBody.update(); + collider.sharedMesh = roadBody.mesh; } override public bool Equals(object other) { diff --git a/Assets/Scripts/FlatBezierRenderer.cs b/Assets/Scripts/FlatBezierRenderer.cs index e712521..b8dad15 100644 --- a/Assets/Scripts/FlatBezierRenderer.cs +++ b/Assets/Scripts/FlatBezierRenderer.cs @@ -40,6 +40,7 @@ mesh.Clear(); mesh.vertices = vertices; mesh.triangles = indices; + mesh.Optimize(); } private Vector3 getTangent(float t) { diff --git a/Assets/Scripts/Road.cs b/Assets/Scripts/Road.cs index 3d3f5bf..0af2218 100644 --- a/Assets/Scripts/Road.cs +++ b/Assets/Scripts/Road.cs @@ -5,10 +5,10 @@ public class Road { public List nodes = new List(); Bezier path; - FlatBezierRenderer pathLine; - FlatBezierRenderer roadBody; + FlatBezierRenderer pathLine, roadBody; Config config; - + MeshCollider collider; + public Road(Node start, Node end, Config config) { nodes.Add(start); nodes.Add(end); @@ -20,25 +20,27 @@ public void initialize(Transform parent) { + GameObject child = new GameObject(); + child.transform.parent = parent; GameObject lineChild = new GameObject(); lineChild.transform.position = Vector3.zero; lineChild.AddComponent().material = config.roadEditMaterial; lineChild.AddComponent().mesh = pathLine.mesh; - lineChild.transform.parent = parent; - GameObject roadChild = new GameObject(); + lineChild.transform.parent = child.transform; + GameObject roadChild = new GameObject(); + collider = roadChild.AddComponent(); roadChild.transform.position = Vector3.zero; roadChild.AddComponent().material = config.roadMaterial; - roadChild.transform.parent = parent; + roadChild.transform.parent = child.transform; roadChild.layer = 8; - roadChild.AddComponent(); roadChild.AddComponent().mesh = roadBody.mesh; - - update(true); + roadChild.AddComponent().road = this; } public void update(bool updateOthers) { path.A = nodes[0].position; + path.D = nodes[1].position; if (nodes[0].roads.Count == 2) { path.B = nodes[0].position + 0.25f * (nodes[1].position - nodes[0].getOther(nodes[1]).position); @@ -56,9 +58,9 @@ node.lateUpdate(this); } } - path.D = nodes[1].position; pathLine.update(); roadBody.update(); + collider.sharedMesh = roadBody.mesh; } override public bool Equals(object other) { diff --git a/Assets/Scripts/RoadData.cs b/Assets/Scripts/RoadData.cs new file mode 100644 index 0000000..eb620ba --- /dev/null +++ b/Assets/Scripts/RoadData.cs @@ -0,0 +1,7 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class RoadData : MonoBehaviour { + public Road road; +} diff --git a/Assets/Scripts/FlatBezierRenderer.cs b/Assets/Scripts/FlatBezierRenderer.cs index e712521..b8dad15 100644 --- a/Assets/Scripts/FlatBezierRenderer.cs +++ b/Assets/Scripts/FlatBezierRenderer.cs @@ -40,6 +40,7 @@ mesh.Clear(); mesh.vertices = vertices; mesh.triangles = indices; + mesh.Optimize(); } private Vector3 getTangent(float t) { diff --git a/Assets/Scripts/Road.cs b/Assets/Scripts/Road.cs index 3d3f5bf..0af2218 100644 --- a/Assets/Scripts/Road.cs +++ b/Assets/Scripts/Road.cs @@ -5,10 +5,10 @@ public class Road { public List nodes = new List(); Bezier path; - FlatBezierRenderer pathLine; - FlatBezierRenderer roadBody; + FlatBezierRenderer pathLine, roadBody; Config config; - + MeshCollider collider; + public Road(Node start, Node end, Config config) { nodes.Add(start); nodes.Add(end); @@ -20,25 +20,27 @@ public void initialize(Transform parent) { + GameObject child = new GameObject(); + child.transform.parent = parent; GameObject lineChild = new GameObject(); lineChild.transform.position = Vector3.zero; lineChild.AddComponent().material = config.roadEditMaterial; lineChild.AddComponent().mesh = pathLine.mesh; - lineChild.transform.parent = parent; - GameObject roadChild = new GameObject(); + lineChild.transform.parent = child.transform; + GameObject roadChild = new GameObject(); + collider = roadChild.AddComponent(); roadChild.transform.position = Vector3.zero; roadChild.AddComponent().material = config.roadMaterial; - roadChild.transform.parent = parent; + roadChild.transform.parent = child.transform; roadChild.layer = 8; - roadChild.AddComponent(); roadChild.AddComponent().mesh = roadBody.mesh; - - update(true); + roadChild.AddComponent().road = this; } public void update(bool updateOthers) { path.A = nodes[0].position; + path.D = nodes[1].position; if (nodes[0].roads.Count == 2) { path.B = nodes[0].position + 0.25f * (nodes[1].position - nodes[0].getOther(nodes[1]).position); @@ -56,9 +58,9 @@ node.lateUpdate(this); } } - path.D = nodes[1].position; pathLine.update(); roadBody.update(); + collider.sharedMesh = roadBody.mesh; } override public bool Equals(object other) { diff --git a/Assets/Scripts/RoadData.cs b/Assets/Scripts/RoadData.cs new file mode 100644 index 0000000..eb620ba --- /dev/null +++ b/Assets/Scripts/RoadData.cs @@ -0,0 +1,7 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class RoadData : MonoBehaviour { + public Road road; +} diff --git a/Assets/Scripts/RoadData.cs.meta b/Assets/Scripts/RoadData.cs.meta new file mode 100644 index 0000000..2948b97 --- /dev/null +++ b/Assets/Scripts/RoadData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6bfac654eff68754c88b877a9b88ae42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/FlatBezierRenderer.cs b/Assets/Scripts/FlatBezierRenderer.cs index e712521..b8dad15 100644 --- a/Assets/Scripts/FlatBezierRenderer.cs +++ b/Assets/Scripts/FlatBezierRenderer.cs @@ -40,6 +40,7 @@ mesh.Clear(); mesh.vertices = vertices; mesh.triangles = indices; + mesh.Optimize(); } private Vector3 getTangent(float t) { diff --git a/Assets/Scripts/Road.cs b/Assets/Scripts/Road.cs index 3d3f5bf..0af2218 100644 --- a/Assets/Scripts/Road.cs +++ b/Assets/Scripts/Road.cs @@ -5,10 +5,10 @@ public class Road { public List nodes = new List(); Bezier path; - FlatBezierRenderer pathLine; - FlatBezierRenderer roadBody; + FlatBezierRenderer pathLine, roadBody; Config config; - + MeshCollider collider; + public Road(Node start, Node end, Config config) { nodes.Add(start); nodes.Add(end); @@ -20,25 +20,27 @@ public void initialize(Transform parent) { + GameObject child = new GameObject(); + child.transform.parent = parent; GameObject lineChild = new GameObject(); lineChild.transform.position = Vector3.zero; lineChild.AddComponent().material = config.roadEditMaterial; lineChild.AddComponent().mesh = pathLine.mesh; - lineChild.transform.parent = parent; - GameObject roadChild = new GameObject(); + lineChild.transform.parent = child.transform; + GameObject roadChild = new GameObject(); + collider = roadChild.AddComponent(); roadChild.transform.position = Vector3.zero; roadChild.AddComponent().material = config.roadMaterial; - roadChild.transform.parent = parent; + roadChild.transform.parent = child.transform; roadChild.layer = 8; - roadChild.AddComponent(); roadChild.AddComponent().mesh = roadBody.mesh; - - update(true); + roadChild.AddComponent().road = this; } public void update(bool updateOthers) { path.A = nodes[0].position; + path.D = nodes[1].position; if (nodes[0].roads.Count == 2) { path.B = nodes[0].position + 0.25f * (nodes[1].position - nodes[0].getOther(nodes[1]).position); @@ -56,9 +58,9 @@ node.lateUpdate(this); } } - path.D = nodes[1].position; pathLine.update(); roadBody.update(); + collider.sharedMesh = roadBody.mesh; } override public bool Equals(object other) { diff --git a/Assets/Scripts/RoadData.cs b/Assets/Scripts/RoadData.cs new file mode 100644 index 0000000..eb620ba --- /dev/null +++ b/Assets/Scripts/RoadData.cs @@ -0,0 +1,7 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class RoadData : MonoBehaviour { + public Road road; +} diff --git a/Assets/Scripts/RoadData.cs.meta b/Assets/Scripts/RoadData.cs.meta new file mode 100644 index 0000000..2948b97 --- /dev/null +++ b/Assets/Scripts/RoadData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6bfac654eff68754c88b877a9b88ae42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Roads.cs b/Assets/Scripts/Roads.cs index 08568dd..acd376a 100644 --- a/Assets/Scripts/Roads.cs +++ b/Assets/Scripts/Roads.cs @@ -51,6 +51,7 @@ endNode.roads.Add(road); roads.Add(road); road.initialize(transform); + road.update(true); } startNode = null; drawing = false; @@ -59,24 +60,42 @@ Node pulling = null; void Update() { - if (Input.GetAxis("Fire1") != 0.0f && config.mode == Mode.DrawRoad) { - if (!drawing) { - startRoad(); - } - } else if (drawing) { - endRoad(); - } Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); + RaycastHit hit; + if (config.mode == Mode.DrawRoad) { + if (Input.GetAxis("Fire1") != 0.0f) { + if (!drawing) { + startRoad(); + } + } else if (drawing) { + endRoad(); + } + } else if (config.mode == Mode.DeleteRoad) { + if (!drawing && Input.GetAxis("Fire1") != 0.0f) { + if (Physics.Raycast(ray, out hit, Mathf.Infinity, 1 << 8)) { + drawing = true; + Road road = hit.transform.gameObject.GetComponent().road; + roads.Remove(road); + foreach (Node node in road.nodes) { + node.roads.Remove(road); + node.update(); + } + Destroy(hit.transform.parent.gameObject); + } + } else if (drawing && Input.GetAxis("Fire1") == 0.0f) { + drawing = false; + } + } if (Input.GetAxis("Fire2") != 0.0f) { - if (pulling == null && Physics.Raycast(ray, out RaycastHit hit, Mathf.Infinity, 1 << 7)) { + if (pulling == null && Physics.Raycast(ray, out hit, Mathf.Infinity, 1 << 7)) { pulling = nodes.Find(node => node.gameObject == hit.transform.gameObject); } } else { pulling = null; } if (pulling != null) { - Physics.Raycast(ray, out RaycastHit hit_, Mathf.Infinity, 1 << 6); - Vector3 position = new Vector3(hit_.point.x, 0.0f, hit_.point.z); + Physics.Raycast(ray, out hit, Mathf.Infinity, 1 << 6); + Vector3 position = new Vector3(hit.point.x, 0.0f, hit.point.z); pulling.pull(position); } }