plantilla base para movimiento básico
This commit is contained in:
Robii Aragon
2026-02-05 05:07:55 -08:00
parent ed7b223c04
commit fd87a6ffd5
14441 changed files with 13711084 additions and 20 deletions

View File

@@ -0,0 +1,210 @@
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class hoverBoardAnimationSystem : MonoBehaviour
{
[Header ("Main Settings")]
[Space]
public float extraBodyRotation = -20;
public float extraSpineRotation = 30;
public float limitBodyRotationX = 30;
public float limitBodyRotationZ = 30;
public float minSpineRotationX = 20;
public float maxSpineRotationX = 330;
public float maxArmsRotation = 25;
public bool addMovementToBody;
public bool addExtraMovementToBody;
public bool addMovementToArms;
public bool addMovementToHead;
public float maxHeadRotationBackward;
public float headRotationSpeed;
public float minBackwardVelocityToHeadRotation;
[Space]
[Header ("Components")]
[Space]
public Transform headLookCenter;
public Transform bodyLookCenter;
public Transform bodyLookPivot;
public Rigidbody mainRigidbody;
public hoverBoardController mainHoverBoardController;
public Transform hoverBoardTransform;
public Transform playerGravityCenter;
upperBodyRotationSystem mainUpperBodyRotationSystem;
Vector3 currentNormal;
float gravityCenterAngleX;
float gravityCenterAngleZ;
float angleZ;
float currentExtraBodyRotation;
float currentExtraSpineRotation;
float headLookCenterCurrentRotation;
bool driving;
Animator animator;
Transform rightArm;
Transform leftArm;
bool firstPersonActive;
bool animationActive;
void Start ()
{
currentExtraBodyRotation = extraBodyRotation;
currentExtraSpineRotation = extraSpineRotation;
}
void Update ()
{
if (driving) {
firstPersonActive = mainHoverBoardController.firstPersonActive;
if (!firstPersonActive && animationActive) {
currentNormal = mainHoverBoardController.getNormal ();
currentNormal = currentNormal.normalized;
angleZ = Mathf.Asin (hoverBoardTransform.InverseTransformDirection (Vector3.Cross (currentNormal, hoverBoardTransform.up)).z) * Mathf.Rad2Deg;
float angleX = Mathf.Asin (hoverBoardTransform.InverseTransformDirection (Vector3.Cross (currentNormal, hoverBoardTransform.up)).x) * Mathf.Rad2Deg;
float gravityAngleZ = 0;
if (Mathf.Abs (angleZ) > 1) {
gravityAngleZ = -angleZ;
} else {
gravityAngleZ = 0;
}
float gravityAngleX = 0;
if (Mathf.Abs (angleX) > 1) {
gravityAngleX = -angleX;
} else {
gravityAngleX = 0;
}
gravityCenterAngleX = Mathf.Lerp (gravityCenterAngleX, gravityAngleX, Time.deltaTime * 5);
gravityCenterAngleZ = Mathf.Lerp (gravityCenterAngleZ, gravityAngleZ, Time.deltaTime * 5);
gravityCenterAngleX = Mathf.Clamp (gravityCenterAngleX, -limitBodyRotationX, limitBodyRotationX);
gravityCenterAngleZ = Mathf.Clamp (gravityCenterAngleZ, -limitBodyRotationZ, limitBodyRotationZ);
playerGravityCenter.localEulerAngles = new Vector3 (gravityCenterAngleX, currentExtraBodyRotation, gravityCenterAngleZ);
float forwardSpeed = (mainRigidbody.transform.InverseTransformDirection (mainRigidbody.linearVelocity).z) * 3f;
float bodyRotation = extraBodyRotation;
float spineRotation = extraSpineRotation;
if (forwardSpeed < -2) {
bodyRotation = -extraBodyRotation;
spineRotation = -extraSpineRotation;
}
currentExtraBodyRotation = Mathf.Lerp (currentExtraBodyRotation, bodyRotation, Time.deltaTime * 5);
currentExtraSpineRotation = Mathf.Lerp (currentExtraSpineRotation, spineRotation, Time.deltaTime * 5);
}
}
}
void LateUpdate ()
{
if (driving && !firstPersonActive && animationActive) {
if (addExtraMovementToBody) {
Quaternion rotationX = Quaternion.FromToRotation (bodyLookPivot.InverseTransformDirection (hoverBoardTransform.right),
bodyLookPivot.InverseTransformDirection (hoverBoardTransform.forward));
Vector3 directionX = rotationX.eulerAngles;
Quaternion rotationZ = Quaternion.FromToRotation (bodyLookPivot.InverseTransformDirection (hoverBoardTransform.forward),
bodyLookPivot.InverseTransformDirection (hoverBoardTransform.forward));
Vector3 directionZ = rotationZ.eulerAngles;
float angleX = directionX.x;
if (angleX > 180) {
angleX = Mathf.Clamp (angleX, maxSpineRotationX, 360);
} else {
angleX = Mathf.Clamp (angleX, 0, minSpineRotationX);
}
bodyLookPivot.localEulerAngles = new Vector3 (angleX - angleZ, bodyLookPivot.localEulerAngles.y, directionZ.z - currentExtraSpineRotation);
}
if (addMovementToArms) {
float armRotation = angleZ;
armRotation = Mathf.Clamp (armRotation, -maxArmsRotation, maxArmsRotation);
float rightArmRotationX = rightArm.localEulerAngles.x - armRotation;
rightArm.localEulerAngles = new Vector3 (rightArmRotationX, rightArm.localEulerAngles.y, rightArm.localEulerAngles.z);
float leftArmRotationX = leftArm.localEulerAngles.x + armRotation;
leftArm.localEulerAngles = new Vector3 (leftArmRotationX, leftArm.localEulerAngles.y, leftArm.localEulerAngles.z);
}
if (addMovementToHead) {
float headAngle = 0;
if (mainHoverBoardController.motorInput < 0 &&
(Mathf.Abs (mainHoverBoardController.currentSpeed) > minBackwardVelocityToHeadRotation || mainHoverBoardController.motorInput < -0.8f)) {
headAngle = maxHeadRotationBackward;
}
headLookCenterCurrentRotation = Mathf.Lerp (headLookCenterCurrentRotation, headAngle, Time.deltaTime * headRotationSpeed);
headLookCenter.localEulerAngles = new Vector3 (0, headLookCenterCurrentRotation, 0);
}
}
}
//the player is getting on or off from the vehicle, so
public void changeVehicleState (bool state)
{
driving = state;
animationActive = state;
//set the audio values if the player is getting on or off from the vehicle
if (driving) {
//set the same state in the gravity control components
animator = hoverBoardTransform.GetComponentInChildren<Animator> ();
mainUpperBodyRotationSystem = hoverBoardTransform.GetComponentInChildren<upperBodyRotationSystem> ();
if (addMovementToBody) {
if (mainUpperBodyRotationSystem != null) {
mainUpperBodyRotationSystem.enableOrDisableIKUpperBody (true);
mainUpperBodyRotationSystem.setTemporalObjectToFollow (bodyLookCenter);
}
}
bodyLookPivot.localEulerAngles = Vector3.zero;
if (animator != null) {
rightArm = animator.GetBoneTransform (HumanBodyBones.RightUpperArm);
leftArm = animator.GetBoneTransform (HumanBodyBones.LeftUpperArm);
}
} else {
if (addMovementToBody) {
if (mainUpperBodyRotationSystem != null) {
mainUpperBodyRotationSystem.enableOrDisableIKUpperBody (false);
mainUpperBodyRotationSystem.setTemporalObjectToFollow (null);
}
}
}
}
}