Files
Robii Aragon fd87a6ffd5 add ckg
plantilla base para movimiento básico
2026-02-05 05:07:55 -08:00

338 lines
9.5 KiB
C#

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<vehiclePartInfo> vehiclePartInfoList = new List<vehiclePartInfo> ();
public List<vehicleSettingsInfo> vehicleSettingsInfoList = new List<vehicleSettingsInfo> ();
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<GameObject> extraVehiclePartMeshesList = new List<GameObject> ();
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;
}
}