The problem is that my scripts work fine, except that the character walks trhough geometry even though it has a character controller attachhed to it.
I have two scripts. One named TP_Motor, and the other TP_Controller.
Here are the scripts:
TP_Motor
using UnityEngine;
using System.Collections;
public class TP_Motor : MonoBehaviour
{
public static TP_Motor Instance;
public float movementSpeed = 10;
public float backwardSpeed = 5;
public float Gravity = 40f;
public float TerminalVelocity = 20f;
private Vector3 slideDirection;
public float turningSpeed = 60;
public float MoveSpeed = 10f;
public float JumpSpeed = 14f;
public Vector3 MoveVector { get; set; }
public float VerticalVelocity { get; set; }
void Update()
{
Instance = this;
}
public void UpdateMotor()
{
SnapAlignCharacterWithCamera();
Moveandrotate();
ProcessMotion();
}
void Moveandrotate() // Esto hace que el jugador se mueva y rote.
{
float horizontal = Input.GetAxis("Horizontal") * turningSpeed * Time.deltaTime;
transform.Rotate(0, horizontal, 0);
float vertical = Input.GetAxis("Vertical") * movementSpeed * Time.deltaTime;
transform.Translate(0, 0, vertical);
}
void ProcessMotion()
{
// Transform MoveVector to World Space
MoveVector = transform.TransformDirection(MoveVector);
// Normalize MoveVector if Magnitude > 1
if (MoveVector.magnitude > 1)
MoveVector = Vector3.Normalize(MoveVector);
// Multiply MoveVector by MoveSpeed Esto hace que se mueva de derecha a izquierda
MoveVector *= MoveSpeed;
// Reapply VerticalVelocity MoveVector.y
MoveVector = new Vector3(MoveVector.x, VerticalVelocity , MoveVector.z);
// ApplyGravity
ApplyGravity();
// Move Character in World Space Esto tambien hace que se mueva de derecha a izquierda
TP_Controller.CharacterController.Move(MoveVector * Time.deltaTime);
}
void ApplyGravity()
{
if (MoveVector.y > -TerminalVelocity)
MoveVector = new Vector3(MoveVector.x, MoveVector.y - Gravity * Time.deltaTime, MoveVector.z);
if(TP_Controller.CharacterController.isGrounded && MoveVector.y < -1)
MoveVector = new Vector3(MoveVector.x, -1 , MoveVector.z);
}
public void Jump()
{
if (TP_Controller.CharacterController.isGrounded)
VerticalVelocity = JumpSpeed;
}
void SnapAlignCharacterWithCamera()
{
}
}
AND THE TP_Controller
using UnityEngine;
using System.Collections;
public class TP_Controller : MonoBehaviour
{
public static CharacterController CharacterController;
public static TP_Controller Instance;
public float MoveSpeed = 10f;
void Awake()
{
CharacterController = GetComponent();
Instance = this;
}
void Update()
{
if(Camera.mainCamera == null)
return;
GetLocomotionInput();
HandleActionInput();
TP_Motor.Instance.UpdateMotor();
}
void GetLocomotionInput()
{
var deadZone = 0.1f;
TP_Motor.Instance.VerticalVelocity = TP_Motor.Instance.MoveVector.y; // Gravedad
TP_Motor.Instance.MoveVector = Vector3.zero;
if (Input.GetAxis("Vertical") > deadZone || Input.GetAxis("Vertical") < -deadZone)
TP_Motor.Instance.MoveVector += new Vector3(0, 0, Input.GetAxis("Vertical"));
}
void HandleActionInput() // Esto hace junto con jump que se accione con un boton el Jump
{
if (Input.GetButton("Jump"))
{
Jump ();
}
}
void Jump()
{
TP_Motor.Instance.Jump ();
}
}