Custom character script and RigidBody3D

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

Custom character script and RigidBody3D

Message par QDRemix » 23 Juin 2017 10:12

Bonjour à tous,

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;
		}

	}

}
Merci d'avance de vos réponse et de vos lumimères !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Custom character script and RigidBody3D

Message par boubouk50 » 23 Juin 2017 10:48

QDRemix a écrit :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.
C'est pas incompatible, et justement avoir un code juste devant les yeux et le tester te fait comprendre plus vite que de tâtonner en essayant tout et n'importe quoi. Du moins pour le général, la base, ensuite bien sur à toi de tester.
Quoiqu'il en soi, je pense qu'il ne faille pas toucher à la vélocité ainsi mais utiliser les forces avec AddForce () pour donner des impulsions dans le bon sens. La vélocité est la résultante des forces, elle devrait rester un résultat pour tester/vérifier voire borner.

Code : Tout sélectionner

rb_transform.AddForce (rb_transform.velocity + (Vector3.up * jumpPower));
Pourquoi ajouter la vélocité? Tu appliques une force, elle va s'additionner avec les forces en cours. C'est redondant.
Ensuite, pourquoi changer la gravité? Physiquement, la gravité n'est jamais plus forte à un endroit par rapport à un autre (sauf en cas extrême physique ou magnétisme) ou relativement aucun objet change de masse en fonction de sa position.

J'ai l'impression que tu essaies de mixer transformations et physique. Ce n'est pas conseillé, il vaut mieux rester soit dans le milieu physique et jouer simplement avec les forces, soit réinventer la roue un peu et recréer son propre système sans la physique d'Unity.

Pour ma part, je te conseille vraiment de te baser sur le characterController de base d'Unity pour mieux cerner les différentes actions et ensuite de faire ta sauce. Les bases de contrôle d'un personnage sont en place depuis des années, elles sont bonnes, je ne vois aucun intérêt à ne pas s'en servir.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

Re: Custom character script and RigidBody3D

Message par QDRemix » 23 Juin 2017 10:54

Merci de ta réponse.
C'est pas incompatible, et justement avoir un code juste devant les yeux et le tester te fait comprendre plus vite que de tâtonner en essayant tout et n'importe quoi. Du moins pour le général, la base, ensuite bien sur à toi de tester.
Je regarde les scripts que je peux trouver. Je cherche à les comprendres, mais j'essaye ensuite de refaire car pour mieux comprendre et retenir il me faut ça... Cerveau à deux balles :)

J'avais essayé avec le addForce mais je n'avais pas réussi à avoir de résultat concluant... Je vais re essayer du coup car effectivement avec ce que tu dis ce que je fais est un gros mixe des deux...

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Custom character script and RigidBody3D

Message par boubouk50 » 23 Juin 2017 10:57

Cherche un peu sur le forum, c’est pas la première fois que les membres se perdent dans la physique du CharacterController. Il y a déjà pas mal de réponses.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

[MY-AL] Custom character script and RigidBody3D

Message par QDRemix » 23 Juin 2017 11:05

Ça marche je vais farfouiller dedans !

Avatar de l’utilisateur
Greg
Messages : 156
Inscription : 08 Mai 2017 15:22

Re: Custom character script and RigidBody3D

Message par Greg » 23 Juin 2017 19:53

Je comprend pas trop le problème... Peux-tu préciser ceci :
QDRemix a écrit :quand dans un script on touche à la vélocité du RigidBody il ne réagit pas vraiment comme un rigidBody "neutre"
QDRemix a écrit :un script tout simple qui rajoute de la vélocité avec le front de mon transform * la touche "Z" par exemple.
QDRemix a écrit :plein de choses sur internet pour rajouter une force sur l'objet pour refaire la gravité...
je pige pas trop le problème...
QDRemix a écrit :Et la l'objet tombe très très très très lentement...
Si tu essaies d'appliquer une force pour 'compenser' la gravité ça va ête compliqué...

La vitesse de 'chute' est calculer en fonction de la gravité du projet (menu > edit > project settings > physics) et des propriétés du Rigidbody : mass (poids) drag (frottement) et velocité.

Toutefois, les conseils de Boubouk sont pertinents...
Fais un Cube avec le character controller d'unity, un autre avec le tien et compare les codes et comportements relatifs.
Mon jeu de développement cellulaire : MICROBIOME (encore quelques bugs...)
(merci bien à ceux qui passent mettre des étoiles ! ^^)

QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

Re: Custom character script and RigidBody3D

Message par QDRemix » 26 Juin 2017 16:23

Merci de ta réponse Greg.

Le problème que j'essaye d'expliquer et que si j'ai un rigidBody sur un cube la gravité fonctionne très bien.
Mais dès le moment où j'ai un script qui bouge mon rigidBody avec la vélocité mon cube tombe très très très doucement. Dans l'exemple que j'ai donné (tes citations de mon premier poste) j'explique juste ce que je fais dans mon script. C'est-à-dire, dans un update, multiplier le front de mon transform par l'action d'une touche.

Comme me l'a expliquer boubouk, ce n'est à priori pas du tout ce qu'il faut faire, car la vélocité ne devrait pas être changé dynamiquement par un script, mais par l'ajout d'une force. J'ai fait avec la vélocité, car c'est ce que je trouve de manière générale sur internet. J'ai essayé avec un addForce et effectivement j'ai un comportement bien meilleur. Maintenant, je n'arrive pas à fixer les réglages du rigidBody pour pas que le perso glisse comme il le fait actuellement en gardant un bon comportement de chute.

Je n'ai pas encore eu le temps de me re pencher dessus, mais effectivement le prochain test que je fais et de voir ce que fait le characterScript de unity et comparer.

QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

Re: Custom character script and RigidBody3D

Message par QDRemix » 26 Juin 2017 16:51

J'ai jeté un coup d'oeil rapidement pour trouver ou est ce qu'il change le mouvement du personnage et ils utilisent rigiBody.velocity.

Pour bouger le personnage:

Code : Tout sélectionner

v.y = m_Rigidbody.velocity.y;
m_Rigidbody.velocity = v;
Pour sauter:

Code : Tout sélectionner

m_Rigidbody.velocity = new Vector3(m_Rigidbody.velocity.x, m_JumpPower, m_Rigidbody.velocity.z);
Et ils utilisent le "addForce" uniquement pour rajouter de la gravité:

Code : Tout sélectionner

Vector3 extraGravityForce = (Physics.gravity * m_GravityMultiplier) - Physics.gravity;
m_Rigidbody.AddForce(extraGravityForce);
Du coup je ne comprend vraiment pas pourquoi quand je fais la même chose mon personnage tombe comme une feuille morte et pas normalement comme le leur... Je me souviens, quand j'avais regardé la scène d'exemple ThirsPersonControler, les paramètre de physics sont ceux par défaut de unity et le rigidBody du character aussi.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Custom character script and RigidBody3D

Message par ZJP » 26 Juin 2017 22:14

Pb de Drag?!

QDRemix
Messages : 28
Inscription : 16 Fév 2016 09:16
Contact :

Re: Custom character script and RigidBody3D

Message par QDRemix » 27 Juin 2017 09:40

Ben dans les réglages oui il faut changer le drag. Mais du coup la chute est ralentit aussi... Trouver le bon ration je ne le trouve pas encore.

Répondre

Revenir vers « (C#) CSharp »