Je viens vers vous car j'ai un problème avec mon CharacterScript et le rigidBody.
J'essaye de le faire moi même pour maîtriser à 100% ce que je fais plutôt que d'utiliser des scripts que je trouve à gauche, à droite ou ceux unity. Je préfère comprendre et savoir faire plutôt que prendre le travail des autres et bidouiller.
Du coup mon problème:
Faire un petit personnage qui bouge il n'y a pas trop de problèmes. Mais en fait je me rends compte que quand dans un script on touche à la vélocité du RigidBody il ne réagit pas vraiment comme un rigidBody "neutre".
J'ai fait un test avec un cube et un RigidBody. je lance le moteur et il tombe comme je l'espère. Je rajoute un script tout simple qui rajoute de la vélocité avec le front de mon transform * la touche "Z" par exemple. Et la l'objet tombe très très très très lentement... Alors j'ai vu plein de choses sur internet pour rajouter une force sur l'objet pour refaire la graviter... N'y a t il pas d'autre solution ?
Quoi qu'il en soit j'ai réussi à faire un truc qui me va plus ou moins pour le moment dans le déplacement du personnage.
Mais ! Quand je veux rajouter un jump ça se complique encore une fois... Je dois rajouter une force de taret pour qu'il saute un peu avec un mouvement qui ne me convient mais absolument pas... Du coup je me dis qu'en fait mon script ne va pas du tout mais je bloque... Je ne sais pas trop quoi faire car je ne comprends pas ce qu'il se passe vraiment...
Est ce que quelqu'un pourrait m'éclairer un peu sur le sujet. J'ai lu pas mal de chose mais rien qui me permet vraiment de comprendre tout ces comportements.
Je précise que je suis sur une Echelle de 1:1 unity. C'est à dire que j'ai un cube de base sans transformation. Je n'importe pas encore de modèle pour être sur de travailler avec l’échelle de unity.
Mon Script:
Code : Tout sélectionner
// ===============================================
// Import modules
// ===============================================
using UnityEngine;
using System.Collections;
// ===============================================
// Character Control
// ===============================================
public class CharacterScript : MonoBehaviour {
// ===========================================
// Base variables
// ===========================================
public float moveSpeed = 1.0f;
public float turnSpeed = 100.0f;
public float jumpPower = 5.0f;
private Vector3 worldVelocity;
private Vector3 lastPosition;
private Vector3 groundNormal;
private Vector3 hitPoint;
private Vector3 moveVelocity;
private Rigidbody rb_transform;
private float yDeg = 0.0f;
public bool isGrounded = true;
// ===========================================
// Event
// ===========================================
void Awake() {
rb_transform = transform.GetComponent<Rigidbody>();
}
void Start() {
yDeg = transform.rotation.eulerAngles.y;
lastPosition = transform.position;
}
void Update() {
moveVelocity = Vector3.zero;
GetGround ();
GetVelocity();
Move();
Turn();
Jump();
}
// ===========================================
// Movement
// ===========================================
void Move()
{
// Get ground position
moveVelocity = Vector3.ProjectOnPlane(transform.forward, groundNormal).normalized * Input.GetAxis ("Vertical") * moveSpeed;
// If not is grounded add gravity
if (!isGrounded){
moveVelocity += Physics.gravity * 5;
}
// Project to ground
Vector3 dir = hitPoint - transform.position;
dir = Vector3.Project(dir, transform.up);
moveVelocity += dir;
// Set RigidBody
rb_transform.velocity = moveVelocity;
}
void Turn()
{
yDeg -= -Input.GetAxis("Horizontal") * turnSpeed;
transform.rotation = Quaternion.Euler (0.0f, yDeg, 0.0f);
}
void Jump() {
if (Input.GetKeyDown ("space") && isGrounded) {
rb_transform.AddForce (rb_transform.velocity + (Vector3.up * jumpPower));
}
}
// ===========================================
// Getter / Check
// ===========================================
void GetVelocity()
{
worldVelocity = (transform.position - lastPosition) / Time.deltaTime;
lastPosition = transform.position;
}
void GetGround()
{
RaycastHit hitInfo;
if (Physics.Raycast(transform.position, -Vector3.up, out hitInfo, 4.5f))
{
groundNormal = hitInfo.normal;
hitPoint = hitInfo.point;
isGrounded = true;
}
else
{
isGrounded = false;
groundNormal = Vector3.up;
}
}
}