using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class vehicleBuilder : MonoBehaviour { public string vehicleName; public LayerMask layerToPlaceVehicle; public float placeVehicleOffset = 2; public bool showGizmo; public bool showGizmoLabel; public Color gizmoLabelColor = Color.black; public float gizmoRadius; public bool useHandle; public GameObject vehicle; public GameObject vehicleCamera; public Transform vehicleViewTransform; public vehicleHUDManager mainVehicleHUDManager; public List vehiclePartInfoList = new List (); public List vehicleSettingsInfoList = new List (); vehiclePartInfo currentVehiclePartInfo; vehicleSettingsInfo currentVehicleSettingsInfo; public bool placeVehicleInScene; [TextArea (5, 15)] public string buildVehicleExplanation = "IMPORTANT: once you create a new vehicle, add the colliders you need on the vehicle, " + "set those colliders to the layer 'vehicle' and attach a vehicle damage receiver component. \n\nFinally, go to vehicle hud manager component " + "and press UPDATE VEHICLE PARTS button"; public void buildVehicle () { adjustVehicleParts (); completeVehicleBuild (); resetTemporalVehicleParts (); adjustVehicleSettings (); updateComponent (); } public void adjustVehicleParts () { for (int i = 0; i < vehiclePartInfoList.Count; i++) { currentVehiclePartInfo = vehiclePartInfoList [i]; if (currentVehiclePartInfo.useVehiclePart) { if (currentVehiclePartInfo.newVehicleMesh != null) { if (currentVehiclePartInfo.currentVehicleMesh != null) { DestroyImmediate (currentVehiclePartInfo.currentVehicleMesh); } for (int j = 0; j < currentVehiclePartInfo.extraVehiclePartMeshesList.Count; j++) { if (currentVehiclePartInfo.extraVehiclePartMeshesList [j] != null) { DestroyImmediate (currentVehiclePartInfo.extraVehiclePartMeshesList [j]); } } currentVehiclePartInfo.extraVehiclePartMeshesList.Clear (); if (currentVehiclePartInfo.temporalVehicleMeshInstantiated) { currentVehiclePartInfo.currentVehicleMesh = currentVehiclePartInfo.temporalVehicleMesh; } else { GameObject newVehiclePart = (GameObject)Instantiate (currentVehiclePartInfo.newVehicleMesh, Vector3.zero, Quaternion.identity); Transform newVehiclePartTransform = newVehiclePart.transform; newVehiclePartTransform.SetParent (currentVehiclePartInfo.vehicleMeshParent); newVehiclePartTransform.localPosition = Vector3.zero; newVehiclePartTransform.localRotation = Quaternion.identity; currentVehiclePartInfo.currentVehicleMesh = newVehiclePart; } } } else { DestroyImmediate (currentVehiclePartInfo.currentVehicleMesh); for (int j = 0; j < currentVehiclePartInfo.extraVehiclePartMeshesList.Count; j++) { if (currentVehiclePartInfo.extraVehiclePartMeshesList [j] != null) { DestroyImmediate (currentVehiclePartInfo.extraVehiclePartMeshesList [j]); } } currentVehiclePartInfo.extraVehiclePartMeshesList.Clear (); } currentVehiclePartInfo.newVehicleMesh = null; if (currentVehiclePartInfo.useVehiclePart) { if (currentVehiclePartInfo.useEventOnUseVehiclePartEnabled) { currentVehiclePartInfo.eventOnUseVehiclePartEnabled.Invoke (); } } else { if (currentVehiclePartInfo.useEventOnUseVehiclePartDisabled) { currentVehiclePartInfo.eventOnUseVehiclePartDisabled.Invoke (); } } } } public void adjustVehicleSettings () { for (int i = 0; i < vehicleSettingsInfoList.Count; i++) { currentVehicleSettingsInfo = vehicleSettingsInfoList [i]; if (currentVehicleSettingsInfo.useBoolState) { currentVehicleSettingsInfo.eventToSetBoolState.Invoke (currentVehicleSettingsInfo.boolState); } if (currentVehicleSettingsInfo.useFloatValue) { currentVehicleSettingsInfo.eventToSetFloatValue.Invoke (currentVehicleSettingsInfo.floatValue); } } } public void adjustVehicleSettingsFromEditor () { adjustVehicleSettings (); } public void completeVehicleBuild () { mainVehicleHUDManager.setVehicleName (vehicleName); vehicle.name = vehicleName + " Controller"; vehicleCamera.name = vehicleName + " Camera"; gameObject.name = vehicleName; mainVehicleHUDManager.setVehicleParts (); print ("New Vehicle Build: " + mainVehicleHUDManager.getVehicleName ()); if (placeVehicleInScene) { placeVehicleInCameraPosition (); } } public void setVehicleName (string newValue) { vehicleName = newValue; } public void resetTemporalVehicleParts () { for (int i = 0; i < vehiclePartInfoList.Count; i++) { currentVehiclePartInfo = vehiclePartInfoList [i]; currentVehiclePartInfo.temporalVehicleMesh = null; currentVehiclePartInfo.temporalVehicleMeshInstantiated = false; currentVehiclePartInfo.temporalNewVehicleMesh = null; currentVehiclePartInfo.newVehicleMeshPositionOffset = Vector3.zero; currentVehiclePartInfo.newVehicleMeshEulerOffset = Vector3.zero; } } public void removeTemporalVehicleParts () { for (int i = 0; i < vehiclePartInfoList.Count; i++) { currentVehiclePartInfo = vehiclePartInfoList [i]; if (currentVehiclePartInfo.temporalVehicleMeshInstantiated) { DestroyImmediate (currentVehiclePartInfo.temporalVehicleMesh); currentVehiclePartInfo.temporalVehicleMesh = null; currentVehiclePartInfo.temporalNewVehicleMesh = null; } currentVehiclePartInfo.temporalVehicleMeshInstantiated = false; currentVehiclePartInfo.newVehicleMeshPositionOffset = Vector3.zero; currentVehiclePartInfo.newVehicleMeshEulerOffset = Vector3.zero; if (currentVehiclePartInfo.currentVehicleMesh != null) { currentVehiclePartInfo.currentVehicleMesh.SetActive (true); } currentVehiclePartInfo.newVehicleMesh = null; currentVehiclePartInfo.useVehiclePart = true; if (currentVehiclePartInfo.currentVehicleMesh != null) { currentVehiclePartInfo.currentVehicleMesh.SetActive (true); } for (int j = 0; j < currentVehiclePartInfo.extraVehiclePartMeshesList.Count; j++) { if (currentVehiclePartInfo.extraVehiclePartMeshesList [j] != null) { currentVehiclePartInfo.extraVehiclePartMeshesList [j].SetActive (true); } } } updateComponent (); } public void getMeshParentTransformValues () { for (int i = 0; i < vehiclePartInfoList.Count; i++) { currentVehiclePartInfo = vehiclePartInfoList [i]; if (currentVehiclePartInfo.vehicleMeshParent != null) { currentVehiclePartInfo.originalMeshParentPosition = currentVehiclePartInfo.vehicleMeshParent.localPosition; currentVehiclePartInfo.originalMeshParentEulerAngles = currentVehiclePartInfo.vehicleMeshParent.localEulerAngles; } } } public void placeVehicleInCameraPosition () { Camera currentCameraEditor = GKC_Utils.getCameraEditor (); if (currentCameraEditor != null) { Vector3 editorCameraPosition = currentCameraEditor.transform.position; Vector3 editorCameraForward = currentCameraEditor.transform.forward; RaycastHit hit; if (Physics.Raycast (editorCameraPosition, editorCameraForward, out hit, Mathf.Infinity, layerToPlaceVehicle)) { transform.position = hit.point + (Vector3.up * placeVehicleOffset); } } } public void alignViewWithVehicleCameraPosition () { setEditorCameraPosition (vehicleViewTransform); } public void setEditorCameraPosition (Transform transformToUse) { GKC_Utils.alignViewToObject (transformToUse); } void updateComponent () { GKC_Utils.updateComponent (this); GKC_Utils.updateDirtyScene ("New Vehicle Created", gameObject); } #if UNITY_EDITOR void OnDrawGizmos () { if (!showGizmo) { return; } if (GKC_Utils.isCurrentSelectionActiveGameObject (gameObject)) { DrawGizmos (); } } void OnDrawGizmosSelected () { DrawGizmos (); } void DrawGizmos () { if (showGizmo) { for (int i = 0; i < vehiclePartInfoList.Count; i++) { if (vehiclePartInfoList [i].objectAlwaysUsed && vehiclePartInfoList [i].currentVehicleMesh) { Gizmos.color = Color.yellow; Gizmos.DrawSphere (vehiclePartInfoList [i].currentVehicleMesh.transform.position, gizmoRadius); } } } } #endif [System.Serializable] public class vehicleSettingsInfo { public string Name; public bool useBoolState; public bool boolState; public eventParameters.eventToCallWithBool eventToSetBoolState; public bool useFloatValue; public float floatValue; public eventParameters.eventToCallWithAmount eventToSetFloatValue; public bool expandElement; } [System.Serializable] public class vehiclePartInfo { public string Name; public bool useVehiclePart = true; public bool moveMeshParentInsteadOfPart; public Transform vehicleMeshParent; public GameObject currentVehicleMesh; public GameObject newVehicleMesh; public bool objectAlwaysUsed; public List extraVehiclePartMeshesList = new List (); public bool temporalVehicleMeshInstantiated; public GameObject temporalVehicleMesh; public GameObject temporalNewVehicleMesh; public bool useEventOnUseVehiclePartEnabled; public UnityEvent eventOnUseVehiclePartEnabled; public bool useEventOnUseVehiclePartDisabled; public UnityEvent eventOnUseVehiclePartDisabled; public Vector3 newVehicleMeshPositionOffset; public Vector3 newVehicleMeshEulerOffset; public Vector3 originalMeshParentPosition; public Vector3 originalMeshParentEulerAngles; public bool expandElement; public bool showHandleTool = true; } }