Unity 3d En Español
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Un Foro De Ayuda Para Los que Trabajan Con Unity 3d Y Hablan Español


No estás conectado. Conéctate o registrate

Problemas con el movimiento del pj

Ir abajo  Mensaje [Página 1 de 1.]

1Problemas con el movimiento del pj Empty Problemas con el movimiento del pj Dom Mayo 05, 2013 10:38 pm

matute



No se porque cuando el personaje esta parado y toco alguna de las teclas de movimiento(en este caso atrás, derecha e izquierda) gira muy rápido como a 180° aprox. Quisiera saber como puedo solucionar esto. Adjunto el script de los movimientos y un vídeo para que vean que pasa. Espero respuestas. Gracias




SCRIPT:


// Requiere un controlador de caracteres que se adjunta al objeto mismo juego
@script RequireComponent(CharacterController)

public var idleAnimation : AnimationClip;
public var walkAnimation : AnimationClip;
public var runAnimation : AnimationClip;
public var jumpAnimation : AnimationClip;

public var walkMaxAnimationSpeed : float = 0.75;
public var trotMaxAnimationSpeed : float = 1.0;
public var runMaxAnimationSpeed : float = 1.0;
public var jumpAnimationSpeed : float = 1.15;
public var landAnimationSpeed : float = 1.0;

private var _animation : Animation;

enum CharacterState {
Idle = 0,
Walking = 1,
Trotting = 2,
Running = 3,
Jumping = 4,
}

private var _characterState : CharacterState;


// La velocidad al caminar
var walkSpeed = 2.0;
// Después de trotar tras unos segundos de caminata llegamos al trote con trotSpeed
var trotSpeed = 4.0;
// Al pulsar "Fire3" botón (cmd) que comienza a correr
var runSpeed = 6.0;

var inAirControlAcceleration = 3.0;

// Qué tan alto que saltemos al pulsar saltar y soltar inmediatamente
var jumpHeight = 0.5;

// La gravedad para el carácter
var gravity = 20.0;
// La gravedad en el modo de descenso controlado
var speedSmoothing = 10.0;
var rotateSpeed = 10.0;
var trotAfterSeconds = 3.0;

var canJump = true;

private var jumpRepeatTime = 0.05;
private var jumpTimeout = 0.15;
private var groundedTimeout = 0.25;

// La cámara no se inicia después de la final de forma inmediata, sino que espera por una fracción de segundo para evitar el exceso ondeando a su alrededor.
private var lockCameraTimer = 0.0;

// La dirección del movimiento actual en x-z
private var moveDirection = Vector3.zero;
// The current vertical speed
private var verticalSpeed = 0.0;
// La velocidad vertical actual
private var moveSpeed = 0.0;

// Las banderas último choque de regresar de controller.Move
private var collisionFlags : CollisionFlags;

// ¿Estamos saltando? (Iniciado con el botón de salto y no conectado a tierra aún)
private var jumping = false;
private var jumpingReachedApex = false;

// ¿Nos estamos moviendo hacia atrás (Esto bloquea la cámara para no hacer un giro de 180 grados)
private var movingBack = false;
// ¿El usuario ha pulsado ninguna tecla?
private var isMoving = false;
// Cuando el usuario se empiezan a caminar (Se utiliza para entrar en trote después de un rato)
private var walkTimeStart = 0.0;
// La última vez que el botón de salto se ha hecho clic abajo
private var lastJumpButtonTime = -10.0;
// La última vez que se realizó un salto
private var lastJumpTime = -1.0;


// La altura que saltó de (utilizado para determinar por cuánto tiempo se debe aplicar potencia de salto adicional después de saltar.)
private var lastJumpStartHeight = 0.0;


private var inAirVelocity = Vector3.zero;

private var lastGroundedTime = 0.0;


private var isControllable = true;

function Awake ()
{
moveDirection = transform.TransformDirection(Vector3.forward);

_animation = GetComponent(Animation);
if(!_animation)
Debug.Log("The character you would like to control doesn't have animations. Moving her might look weird.");

/*
public var idleAnimation : AnimationClip;
public var walkAnimation : AnimationClip;
public var runAnimation : AnimationClip;
public var jumpPoseAnimation : AnimationClip;
*/
if(!idleAnimation) {
_animation = null;
Debug.Log("No idle animation found. Turning off animations.");
}
if(!walkAnimation) {
_animation = null;
Debug.Log("No walk animation found. Turning off animations.");
}
if(!runAnimation) {
_animation = null;
Debug.Log("No run animation found. Turning off animations.");
}
if(!jumpAnimation && canJump) {
_animation = null;
Debug.Log("No jump animation found and the character has canJump enabled. Turning off animations.");
}

}


function UpdateSmoothedMovementDirection ()
{
var cameraTransform = Camera.main.transform;
var grounded = IsGrounded();

// Delantero vector con respecto a la cámara a lo largo del plano xz
var forward = cameraTransform.TransformDirection(Vector3.forward);
forward.y = 0;
forward = forward.normalized;

// Relativa vector Derecho a la cámara
// Siempre ortogonal al vector hacia adelante
var right = Vector3(forward.z, 0, -forward.x);

var v = Input.GetAxisRaw("Vertical");
var h = Input.GetAxisRaw("Horizontal");

// ¿Nos estamos moviendo hacia atrás o mirando hacia atrás
if (v < -0.2)
movingBack = true;
else
movingBack = false;

var wasMoving = isMoving;
isMoving = Mathf.Abs (h) > 0.1 || Mathf.Abs (v) > 0.1;

// Blanco con respecto a la dirección de la cámara
var targetDirection = h * right + v * forward;

// Controles desde el suelo
if (grounded)
{
// Bloqueo cámara por un período breve durante la transición en movimiento y parado
lockCameraTimer += Time.deltaTime;
if (isMoving != wasMoving)
lockCameraTimer = 0.0;

// Guardamos la velocidad y la dirección por separado,
// Por lo que cuando el personaje se queda quieto todavía tenemos un sentido de avance válida
// MoveDirection se normaliza siempre, y sólo se actualizará si hay entrada del usuario.
if (targetDirection != Vector3.zero)
{
// Si estamos realmente lento, simplemente saca a la dirección de destino
if (moveSpeed < walkSpeed * 0.9 && grounded)
{
moveDirection = targetDirection.normalized;
}
// En caso contrario suavemente gire hacia ella
else
{
moveDirection = Vector3.RotateTowards(moveDirection, targetDirection, rotateSpeed * Mathf.Deg2Rad * Time.deltaTime, 10);

moveDirection = moveDirection.normalized;
}
}

// Alise la velocidad en función de la dirección de destino actual
var curSmooth = speedSmoothing * Time.deltaTime;

// Elegir velocidad objetivo
// * Queremos apoyar a la entrada analógica pero asegúrese de que no te puedes caminar más rápido que en diagonal justo delante o hacia los lados
var targetSpeed = Mathf.Min(targetDirection.magnitude, 1.0);

_characterState = CharacterState.Idle;

// Captura modificador de velocidad
if (Input.GetKey (KeyCode.LeftShift) || Input.GetKey (KeyCode.RightShift))
{
targetSpeed *= runSpeed;
_characterState = CharacterState.Running;
}
else if (Time.time - trotAfterSeconds > walkTimeStart)
{
targetSpeed *= trotSpeed;
_characterState = CharacterState.Trotting;
}
else
{
targetSpeed *= walkSpeed;
_characterState = CharacterState.Walking;
}

moveSpeed = Mathf.Lerp(moveSpeed, targetSpeed, curSmooth);

// Cambiar inicio caminata momento en que frenar
if (moveSpeed < walkSpeed * 0.3)
walkTimeStart = Time.time;
}
// En los controles de aire
else
{
// Lock cámara mientras está en el aire
if (jumping)
lockCameraTimer = 0.0;

if (isMoving)
inAirVelocity += targetDirection.normalized * Time.deltaTime * inAirControlAcceleration;
}



}


function ApplyJumping ()
{
// Evitar saltar demasiado rápido después de la otra
if (lastJumpTime + jumpRepeatTime > Time.time)
return;

if (IsGrounded()) {
// Saltar
// - Sólo cuando se presiona el botón
// - Con un tiempo de espera para pulsar ligeramente el botón antes de aterrizar
if (canJump && Time.time < lastJumpButtonTime + jumpTimeout) {
verticalSpeed = CalculateJumpVerticalSpeed (jumpHeight);
SendMessage("DidJump", SendMessageOptions.DontRequireReceiver);
}
}
}


function ApplyGravity ()
{
if (isControllable) // No se mueven en absoluto jugador si no controlable.
{
// Aplicar gravedad
var jumpButton = Input.GetButton("Jump");


// Cuando se llega a la cima del salto de enviar un mensaje
if (jumping && !jumpingReachedApex && verticalSpeed <= 0.0)
{
jumpingReachedApex = true;
SendMessage("DidJumpReachApex", SendMessageOptions.DontRequireReceiver);
}

if (IsGrounded ())
verticalSpeed = 0.0;
else
verticalSpeed -= gravity * Time.deltaTime;
}
}

function CalculateJumpVerticalSpeed (targetJumpHeight : float)
{
// A partir de la altura del salto y la gravedad se deduce la velocidad hacia arriba
// Para el personaje para llegar a la cima.
return Mathf.Sqrt(2 * targetJumpHeight * gravity);
}

function DidJump ()
{
jumping = true;
jumpingReachedApex = false;
lastJumpTime = Time.time;
lastJumpStartHeight = transform.position.y;
lastJumpButtonTime = -10;

_characterState = CharacterState.Jumping;
}

function Update() {

if (!isControllable)
{
// Eliminar todas las entradas, si no controlables.
Input.ResetInputAxes();
}

if (Input.GetButtonDown ("Jump"))
{
lastJumpButtonTime = Time.time;
}

UpdateSmoothedMovementDirection();

// Aplicar gravedad
// - Aumento de potencia adicional modifica la gravedad
// - Modo controlledDescent modifica gravedad
ApplyGravity ();

// Aplicar la lógica salta
ApplyJumping ();

// Calcular el movimiento real
var movement = moveDirection * moveSpeed + Vector3 (0, verticalSpeed, 0) + inAirVelocity;
movement *= Time.deltaTime;

// Mover el controlador
var controller : CharacterController = GetComponent(CharacterController);
collisionFlags = controller.Move(movement);

// ANIMATION sector
if(_animation) {
if(_characterState == CharacterState.Jumping)
{
if(!jumpingReachedApex) {
_animation[jumpAnimation.name].speed = jumpAnimationSpeed;
_animation[jumpAnimation.name].wrapMode = WrapMode.ClampForever;
_animation.CrossFade(jumpAnimation.name);
} else {
_animation[jumpAnimation.name].speed = -landAnimationSpeed;
_animation[jumpAnimation.name].wrapMode = WrapMode.ClampForever;
_animation.CrossFade(jumpAnimation.name);
}
}
else
{
if(controller.velocity.sqrMagnitude < 0.1) {
_animation.CrossFade(idleAnimation.name);
}
else
{
if(_characterState == CharacterState.Running) {
_animation[runAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, runMaxAnimationSpeed);
_animation.CrossFade(runAnimation.name);
}
else if(_characterState == CharacterState.Trotting) {
_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, trotMaxAnimationSpeed);
_animation.CrossFade(walkAnimation.name);
}
else if(_characterState == CharacterState.Walking) {
_animation[walkAnimation.name].speed = Mathf.Clamp(controller.velocity.magnitude, 0.0, walkMaxAnimationSpeed);
_animation.CrossFade(walkAnimation.name);
}

}
}
}
// ANIMATION sector

// Establecer la rotación a la dirección de movimiento
if (IsGrounded())
{

transform.rotation = Quaternion.LookRotation(moveDirection);

}
else
{
var xzMove = movement;
xzMove.y = 0;
if (xzMove.sqrMagnitude > 0.001)
{
transform.rotation = Quaternion.LookRotation(xzMove);
}
}

// Estamos en modo de salto, pero sólo se convirtió en tierra
if (IsGrounded())
{
lastGroundedTime = Time.time;
inAirVelocity = Vector3.zero;
if (jumping)
{
jumping = false;
SendMessage("DidLand", SendMessageOptions.DontRequireReceiver);
}
}
}

function OnControllerColliderHit (hit : ControllerColliderHit )
{
// Debug.DrawRay(hit.point, hit.normal);
if (hit.moveDirection.y > 0.01)
return;
}

function GetSpeed () {
return moveSpeed;
}

function IsJumping () {
return jumping;
}

function IsGrounded () {
return (collisionFlags & CollisionFlags.CollidedBelow) != 0;
}

function GetDirection () {
return moveDirection;
}

function IsMovingBackwards () {
return movingBack;
}

function GetLockCameraTimer ()
{
return lockCameraTimer;
}

function IsMoving () : boolean
{
return Mathf.Abs(Input.GetAxisRaw("Vertical")) + Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5;
}

function HasJumpReachedApex ()
{
return jumpingReachedApex;
}

function IsGroundedWithTimeout ()
{
return lastGroundedTime + groundedTimeout > Time.time;
}

function Reset ()
{
gameObject.tag = "Player";
}

Volver arriba  Mensaje [Página 1 de 1.]

Permisos de este foro:
No puedes responder a temas en este foro.