plantilla base para movimiento básico
This commit is contained in:
Robii Aragon
2026-02-05 05:07:55 -08:00
parent 195b696771
commit 779f2c8b20
14443 changed files with 23840465 additions and 452 deletions

View File

@@ -0,0 +1,710 @@
using UnityEngine;
using System.Collections;
using UnityEngine.Events;
public class boatController : vehicleController
{
[Header ("Custom Settings")]
[Space]
public otherVehicleParts vehicleParts;
public vehicleSettings settings;
[Space]
[Header ("Main Settings")]
[Space]
public float moveForwardSpeedMultiplier;
public float moveBackwardSpeedMultiplier;
public float forwardMovementLerpSpeed = 0.8f;
public float airControlAmount;
public float airControlRotationAmount = 4;
public float brakeForce = 5;
public float rollRotationSpeed = 5;
public bool rollRotationReversed;
public float rotationExtraForwardMovement = 0.4f;
public float rotationLerpSpeed = 0.6f;
[Space]
[Header ("Density Settings")]
[Space]
public bool changeDensityEnabled = true;
public float densityChangeAmount = 0.05f;
public Vector2 densityClampValues;
[Space]
[Header ("Orientation Settings")]
[Space]
public float maxAngleRangeForProperOrientationForces = 45;
public bool autoOrientateUpOnWater;
public float minAngleToAutoOrientateUpOnWater;
public float autoOrientateUpForceAmountOnWater;
public bool autoOrientateUpOnAir;
public float minAngleToAutoOrientateUpOnAir;
public float autoOrientateUpForceAmountOnAir;
[Space]
[Header ("Wind Settings")]
[Space]
public bool checkWindState;
public bool sailActive;
public bool ignoreWindForcesIfNotDrivingBoat;
public bool addWindForceIfSailNotActive;
public float windForceMultiplierIfSailNotActive = 0.5f;
public Transform sailTransform;
public Transform sailDirectionTransform;
public float sailWindSpeedMultiplier;
public float sailRotationSpeed;
public float sailRotationClamp;
public float sailRotationAmount;
[Space]
public bool checkBoatOrientationOnWind;
public float maxAngleToReduceSpeedOnIncorrectWindDirection;
public float reduceSpeedOnIncorrectWindDirectionMultiplier;
public bool showWindDirectionObject;
public float windDirectionRotationSpeed;
[Space]
[Header ("Events Settings")]
[Space]
public UnityEvent eventOnActiveWindDetection;
public UnityEvent eventOnDeactiveWindDetection;
public UnityEvent eventOnActiveSail;
public UnityEvent eventOnDeactiveSail;
[Space]
[Header ("Debug")]
[Space]
public bool anyOnGround;
public float normalAngle;
public bool properlyOrientedUp;
public float windAirSpeedMultiplier;
public float windAngle;
public float regularWindAngle;
public bool sailLookingRight;
public Vector3 forceToApply;
public float reducedSpeedOnIncorrectWindMultiplier;
public float boatAngleWithWind;
[Space]
[Header ("Components")]
[Space]
public objectOnWater mainObjectOnWater;
public Transform externalRotationForcePointTransform;
public windOnObjectState mainWindOnObjectState;
public Transform windDirectionTransform;
float originalJumpPower;
Vector3 moveInput;
Transform vehicleCameraTransform;
float rotationToApply;
bool desiredJump;
Vector3 externalRotationForcePoint;
Vector3 totalForceToApply;
float totalRotationToApply;
float forwardInput;
float currentSteeringWheelZAxisAngle;
float currentSailYAxisAngle;
public override void Awake ()
{
base.Awake ();
}
public override void Start ()
{
base.Start ();
originalJumpPower = vehicleControllerSettings.jumpPower;
vehicleCameraTransform = mainVehicleCameraController.transform;
setWindCheckState (checkWindState);
setSailActiveState (sailActive);
}
public override void vehicleUpdate ()
{
base.vehicleUpdate ();
forwardInput = motorInput;
if (!checkWindState) {
if (rotationToApply != 0) {
if (forwardInput == 0) {
forwardInput = rotationExtraForwardMovement;
}
}
}
moveInput = forwardInput * transform.forward;
//+ horizontalAxis * vehicleCameraTransform.right;
moveInput = Vector3.ClampMagnitude (moveInput, 1f);
if (vehicleParts.SteeringWheel != null) {
currentSteeringWheelZAxisAngle =
Mathf.Lerp (currentSteeringWheelZAxisAngle, -vehicleParts.steerAngleLimit * horizontalAxis, Time.deltaTime * vehicleParts.steerRotationSpeed);
if (Mathf.Abs (currentSteeringWheelZAxisAngle) > 0.01f) {
vehicleParts.SteeringWheel.localEulerAngles =
new Vector3 (vehicleParts.SteeringWheel.localEulerAngles.x, vehicleParts.SteeringWheel.localEulerAngles.y, currentSteeringWheelZAxisAngle);
}
}
if (checkWindState) {
if (Mathf.Abs (rawAxisValues.y) > 0) {
if (rawAxisValues.y > 0) {
currentSailYAxisAngle += sailRotationAmount;
} else {
currentSailYAxisAngle -= sailRotationAmount;
}
}
currentSailYAxisAngle = Mathf.Clamp (currentSailYAxisAngle, -sailRotationClamp, sailRotationClamp);
Vector3 eulerTarget = currentSailYAxisAngle * Vector3.up;
Quaternion targetRotation = Quaternion.Euler (eulerTarget);
sailTransform.localRotation = Quaternion.Lerp (sailTransform.localRotation, targetRotation, sailRotationSpeed * Time.deltaTime);
}
}
void FixedUpdate ()
{
if (usingHoverBoardWaypoint) {
return;
}
fixedUpdateVehicle ();
if (checkWindState) {
bool isWindDetected = mainWindOnObjectState.isWindDetected ();
Vector3 windDirection = Vector3.up;
bool canCheckWindForcesResult = true;
if (ignoreWindForcesIfNotDrivingBoat) {
if (!isDrivingActive ()) {
canCheckWindForcesResult = false;
}
}
if (isWindDetected && canCheckWindForcesResult) {
if (sailActive) {
windDirection = mainWindOnObjectState.getwindDirection ();
windAngle = Vector3.SignedAngle (windDirection, sailDirectionTransform.forward, sailDirectionTransform.up);
sailLookingRight = true;
float windAngleABS = Mathf.Abs (windAngle);
// print (sailTransform.localEulerAngles.y);
if (sailTransform.localEulerAngles.y < 180) {
sailLookingRight = false;
}
regularWindAngle = Vector3.Angle (windDirection, sailDirectionTransform.forward);
if (sailLookingRight) {
if (windAngleABS < 90) {
windAirSpeedMultiplier = (sailRotationClamp - regularWindAngle) / sailRotationClamp;
// print ("right and lower 90");
} else {
// print ("right and higher 90");
windAirSpeedMultiplier = (regularWindAngle - sailRotationClamp) / sailRotationClamp;
}
} else {
if (windAngleABS > 90) {
windAirSpeedMultiplier = (regularWindAngle - sailRotationClamp) / sailRotationClamp;
// print ("left and lower 90");
} else {
// print ("left and higher 90");
windAirSpeedMultiplier = (sailRotationClamp - regularWindAngle) / sailRotationClamp;
}
// windAirSpeedMultiplier = (regularWindAngle - sailRotationClamp) / sailRotationClamp;
// windAirSpeedMultiplier = 0;
}
// windAirSpeedMultiplier = regularWindAngle / sailRotationClamp;
windAirSpeedMultiplier = Mathf.Clamp (windAirSpeedMultiplier, 0, 1);
forceToApply = windAirSpeedMultiplier * mainWindOnObjectState.getWindForce () * sailWindSpeedMultiplier * windDirection;
if (checkBoatOrientationOnWind) {
boatAngleWithWind = Vector3.SignedAngle (windDirection, transform.forward, transform.up);
float boatAngleWithWindABS = Mathf.Abs (boatAngleWithWind);
if (boatAngleWithWindABS > maxAngleToReduceSpeedOnIncorrectWindDirection) {
if (boatAngleWithWindABS > 180) {
boatAngleWithWindABS -= 180;
}
reducedSpeedOnIncorrectWindMultiplier = (boatAngleWithWindABS / 180) * reduceSpeedOnIncorrectWindDirectionMultiplier;
forceToApply *= reducedSpeedOnIncorrectWindMultiplier;
}
}
} else {
if (addWindForceIfSailNotActive) {
windDirection = mainWindOnObjectState.getwindDirection ();
forceToApply = mainWindOnObjectState.getWindForce () * windForceMultiplierIfSailNotActive * windDirection;
} else {
forceToApply = Vector3.zero;
}
}
} else {
forceToApply = Vector3.zero;
}
if (showWindDirectionObject) {
if (sailActive) {
Quaternion windDirectionRotationTarget = Quaternion.LookRotation (windDirection);
windDirectionTransform.rotation = Quaternion.Lerp (windDirectionTransform.rotation, windDirectionRotationTarget, Time.deltaTime * windDirectionRotationSpeed);
}
}
}
if (forwardMovementLerpSpeed > 0) {
totalForceToApply = Vector3.Lerp (totalForceToApply, forceToApply, Time.fixedDeltaTime * forwardMovementLerpSpeed);
} else {
totalForceToApply = forceToApply;
}
mainObjectOnWater.updateExternalForces (totalForceToApply, true);
if (rotationLerpSpeed > 0) {
totalRotationToApply = Mathf.Lerp (totalRotationToApply, rotationToApply, Time.fixedDeltaTime * rotationLerpSpeed);
} else {
totalRotationToApply = rotationToApply;
}
float currentRotationSpeed = rollRotationSpeed;
if (!anyOnGround) {
currentRotationSpeed = airControlRotationAmount;
}
mainObjectOnWater.updateExternalRotationForces (totalRotationToApply * currentRotationSpeed,
vehicleCameraTransform.up, externalRotationForcePoint);
currentSpeed = totalForceToApply.magnitude;
}
void fixedUpdateVehicle ()
{
forceToApply = Vector3.zero;
anyOnGround = mainObjectOnWater.isObjectOnWaterActive ();
if (!checkWindState) {
if (anyOnGround) {
if (forwardInput > 0) {
forceToApply = moveForwardSpeedMultiplier * moveInput;
} else if (forwardInput < 0) {
forceToApply = moveBackwardSpeedMultiplier * moveInput;
}
} else {
forceToApply = airControlAmount * moveInput;
}
}
normalAngle = Vector3.SignedAngle (transform.up, mainVehicleGravityControl.getCurrentNormal (), transform.forward);
float normalAngleABS = Mathf.Abs (normalAngle);
properlyOrientedUp = (normalAngleABS < maxAngleRangeForProperOrientationForces);
if (anyOnGround) {
if (autoOrientateUpOnWater) {
if (normalAngleABS > minAngleToAutoOrientateUpOnWater) {
float valueMultiplier = 1;
if (normalAngle > 0) {
valueMultiplier = -1;
}
mainRigidbody.AddRelativeForce (0, 0, autoOrientateUpForceAmountOnWater * valueMultiplier);
}
}
} else {
if (autoOrientateUpOnAir) {
if (normalAngleABS > minAngleToAutoOrientateUpOnAir) {
float valueMultiplier = 1;
if (normalAngle > 0) {
valueMultiplier = -1;
}
mainRigidbody.AddRelativeForce (0, 0, autoOrientateUpForceAmountOnAir * valueMultiplier);
}
}
}
if (!properlyOrientedUp) {
forceToApply = Vector3.zero;
}
if (anyOnGround && properlyOrientedUp) {
if (usingBoost) {
forceToApply *= boostInput;
}
if (desiredJump) {
desiredJump = false;
forceToApply += mainRigidbody.mass * vehicleControllerSettings.jumpPower * vehicleCameraTransform.up;
}
bool brakeActive = (braking || isBrakeActive ());
if (brakeActive) {
float verticalVelocity = vehicleCameraTransform.InverseTransformDirection (mainRigidbody.linearVelocity).y;
Vector3 downVelocity = verticalVelocity * vehicleCameraTransform.up;
mainRigidbody.linearVelocity = Vector3.Lerp (mainRigidbody.linearVelocity, Vector3.zero + downVelocity, Time.deltaTime * brakeForce);
}
}
if (properlyOrientedUp) {
if (rollRotationReversed) {
rotationToApply = horizontalAxis;
} else {
rotationToApply = -horizontalAxis;
}
} else {
rotationToApply = 0;
}
externalRotationForcePoint = externalRotationForcePointTransform.position;
}
public void checkEventOnWindStateChange (bool state)
{
if (state) {
eventOnActiveWindDetection.Invoke ();
} else {
eventOnDeactiveWindDetection.Invoke ();
}
}
public void checkEventOnSailStateChange (bool state)
{
if (state) {
eventOnActiveSail.Invoke ();
} else {
eventOnDeactiveSail.Invoke ();
}
}
public override void updateMovingState ()
{
moving = verticalAxis != 0 || horizontalAxis != 0;
}
public override bool isVehicleOnGround ()
{
return anyOnGround;
}
//if the vehicle is using the gravity control, set the state in this component
public override void changeGravityControlUse (bool state)
{
base.changeGravityControlUse (state);
}
//the player is getting on or off from the vehicle, so
public override void changeVehicleState ()
{
base.changeVehicleState ();
}
public override void setTurnOnState ()
{
}
public override void setTurnOffState (bool previouslyTurnedOn)
{
base.setTurnOffState (previouslyTurnedOn);
if (previouslyTurnedOn) {
}
}
public override bool isDrivingActive ()
{
return driving;
}
public override void setEngineOnOrOffState ()
{
base.setEngineOnOrOffState ();
}
public override void turnOnOrOff (bool state, bool previouslyTurnedOn)
{
base.turnOnOrOff (state, previouslyTurnedOn);
}
//the vehicle has been destroyed, so disabled every component in it
public override void disableVehicle ()
{
base.disableVehicle ();
}
//if the vehicle is using the boost, set the boost particles
public override void usingBoosting ()
{
base.usingBoosting ();
}
//use a jump platform
public void useVehicleJumpPlatform (Vector3 direction)
{
mainRigidbody.AddForce (mainRigidbody.mass * direction, ForceMode.Impulse);
}
public void useJumpPlatformParable (Vector3 direction)
{
Vector3 jumpForce = direction;
mainRigidbody.AddForce (jumpForce, ForceMode.VelocityChange);
}
public void setNewJumpPower (float newJumpPower)
{
vehicleControllerSettings.jumpPower = newJumpPower * 100;
}
public void setOriginalJumpPower ()
{
vehicleControllerSettings.jumpPower = originalJumpPower;
}
public void setCanJumpState (bool state)
{
vehicleControllerSettings.canJump = state;
}
//CALL INPUT FUNCTIONS
public override void inputJump ()
{
if (driving && !usingGravityControl && isTurnedOn && vehicleControllerSettings.canJump) {
if (usingHoverBoardWaypoint) {
pickOrReleaseHoverboardVehicle (false, false);
Vector3 totalJumpForce = mainRigidbody.mass * hoverboardJumpForce * (currentNormal + transform.forward);
if (useHoverboardJumpClamp) {
totalJumpForce = Vector3.ClampMagnitude (totalJumpForce, hoverboardJumpClamp);
}
mainRigidbody.AddForce (totalJumpForce, ForceMode.Impulse);
return;
}
if (anyOnGround) {
desiredJump = true;
}
}
}
public override void inputHoldOrReleaseTurbo (bool holdingButton)
{
if (driving && !usingGravityControl && isTurnedOn && !usingHoverBoardWaypoint) {
//boost input
if (holdingButton) {
if (vehicleControllerSettings.canUseBoost) {
usingBoost = true;
//set the camera move away action
mainVehicleCameraController.usingBoost (true, vehicleControllerSettings.boostCameraShakeStateName,
vehicleControllerSettings.useBoostCameraShake, vehicleControllerSettings.moveCameraAwayOnBoost);
}
} else {
//stop boost input
usingBoost = false;
//disable the camera move away action
mainVehicleCameraController.usingBoost (false, vehicleControllerSettings.boostCameraShakeStateName,
vehicleControllerSettings.useBoostCameraShake, vehicleControllerSettings.moveCameraAwayOnBoost);
usingBoosting ();
boostInput = 1;
}
}
}
public override void inputHoldOrReleaseBrake (bool holdingButton)
{
if (driving && !usingGravityControl && isTurnedOn && anyOnGround) {
braking = holdingButton;
}
}
public override void inputSetTurnOnState ()
{
if (driving && !usingGravityControl) {
if (mainVehicleHUDManager.canSetTurnOnState) {
setEngineOnOrOffState ();
}
}
}
public void setSailActiveState (bool state)
{
sailActive = state;
checkEventOnSailStateChange (sailActive);
}
public void setWindCheckState (bool state)
{
checkWindState = state;
checkEventOnWindStateChange (checkWindState);
}
public void inputToggleWindCheckState ()
{
if (driving) {
setWindCheckState (!checkWindState);
}
}
public void inputToggleSailActive ()
{
if (driving) {
setSailActiveState (!sailActive);
}
}
public void inputIncreaseDensity ()
{
if (driving) {
if (changeDensityEnabled) {
if (mainObjectOnWater.getDensity () < densityClampValues.y) {
mainObjectOnWater.addOrRemoveDensity (densityChangeAmount);
} else {
mainObjectOnWater.setNewDensity (densityClampValues.y);
}
}
}
}
public void inputDecreaseDensity ()
{
if (driving) {
if (changeDensityEnabled) {
if (mainObjectOnWater.getDensity () > densityClampValues.x) {
mainObjectOnWater.addOrRemoveDensity (-densityChangeAmount);
} else {
mainObjectOnWater.setNewDensity (densityClampValues.x);
}
}
}
}
[System.Serializable]
public class otherVehicleParts
{
public Transform COM;
public GameObject chassis;
public Transform SteeringWheel;
public float steerAngleLimit;
public float steerRotationSpeed;
}
[System.Serializable]
public class vehicleSettings
{
public LayerMask layer;
public GameObject vehicleCamera;
}
}