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 :

[MY-AL] Custom character script and RigidBody3D

Message par QDRemix » 29 Juin 2017 09:28

Salut à tous,

J'ai réussi à avoir un code qui à l'air de fonctionnouiller !
Je me déplace correctement et saute correctement. J'ai mis la gravité de la scène à -98.1, 10* plus que les paramètres par défaut...

Voilà le code:

Code : Tout sélectionner

// ===============================================
//	Import modules
// ===============================================

using UnityEngine;
using System.Collections;


// ===============================================
//	Character Control
// ===============================================

public class PlayerScript : MonoBehaviour {

	// ===========================================
	//	Base variables
	// ===========================================

    public float moveSpeed = 30.0f;
    public float turnSpeed = 4.0f;
	public float jumpPower = 30.0f;

	private Quaternion transformRotation;
	private Vector3 moveVelocity;
    private Rigidbody rb_transform;
	private float yDeg;
	private bool raycastReturn;
	private bool isGrounded;
    
	// ===========================================
	//	Event
	// ===========================================

    void Awake() {
    	rb_transform = transform.GetComponent<Rigidbody>();
		yDeg = transform.rotation.eulerAngles.y;
    }

	void FixedUpdate() {

		//	Init variables
		moveVelocity = Vector3.zero;
		CheckGround ();

		//	Move
		Turn();
		Move();

	}

	// ===========================================
	//	Movement
	// ===========================================

    void Move()
    {

		//	Transform velocity with input and RigidBody
		moveVelocity = Vector3.ProjectOnPlane(transform.forward, Vector3.down);
		moveVelocity *= Input.GetAxis ("Vertical") * moveSpeed;
		moveVelocity = Vector3.Scale(rb_transform.velocity, new Vector3(0, 1, 0)) + Vector3.Scale(moveVelocity, new Vector3(1, 0, 1));

		//	Jump
		if (Input.GetKeyDown ("space") && isGrounded) {
			moveVelocity += Vector3.up * jumpPower;
		}

		//	Set rigidBody
		rb_transform.velocity = moveVelocity;

    }

    void Turn()
    {
		yDeg -= -Input.GetAxis("Horizontal") * turnSpeed;
		transformRotation = Quaternion.Euler (0.0f, yDeg, 0.0f);

		//	Set rotation
		transform.rotation = transformRotation;

    }

	// ===========================================
	//	Check
	// ===========================================

	void CheckGround()
	{

		RaycastHit hitInfo;
		raycastReturn = Physics.Raycast (transform.position, Vector3.down, out hitInfo, 4.1f);
		if (raycastReturn) {
			isGrounded = true;
		}
		else {
			isGrounded = false;
		}

	}

}
Il y a encore pas mal de chose à travailler mais bon pour la suite de mes tests de petit jeu ça va me suffire.
Je vais quand même essayer de faire un characterControler sans RigidBody aussi.

ticoel
Messages : 20
Inscription : 21 Juin 2017 13:31

Re: Custom character script and RigidBody3D

Message par ticoel » 29 Juin 2017 20:23

Bonsoir,

Je m’intéresse aussi à la création d’un contrôleur personnalisé, auquel j’aimerai ajouter la possibilité de marcher sur les murs. J’ai lu ton code, et je trouve ta fonction Move particulière sans comprendre deux lignes, plus particulièrement à cause des deux fonctions de Vector3 ProjectOnPlane et Project.

Code : Tout sélectionner

//   Get ground 
moveVelocity = Vector3.ProjectOnPlane(transform.forward, groundNormal).normalized * Input.GetAxis ("Vertical") * moveSpeed;

Code : Tout sélectionner

//   Project to ground
Vector3 dir = hitPoint - transform.position;
dir = Vector3.Project(dir, transform.up);
moveVelocity += dir;
Peux-tu m’en dire plus sur leur utilisation au sein de ta fonction ?

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

Re: Custom character script and RigidBody3D

Message par QDRemix » 30 Juin 2017 12:08

Alors cette ligne ne me sert plus à rien en fait ! :)

Code : Tout sélectionner

moveVelocity = Vector3.ProjectOnPlane(transform.forward, Vector3.down);
J'ai donné le code avec un fonctionnement "acceptable", mais pas du tout optimisé ou revu.
En fait, on peut directement écrire:

Code : Tout sélectionner

moveVelocity = transform.forward * Input.GetAxis ("Vertical") * moveSpeed;
Ça fonctionne aussi bien.
Il y a peut être d'autres blagues du même genre... :)

Je n'ai pas encore eu le temps de me re pencher dessus. Je n'ai qu'une petite demi heure parfois le matin ou le midi...
Tu essayes d'utiliser aussi le RigidBody ou tu parts sur une solution ou tu gère tes collisions?

EDIT:
Ma sandBox est un plan avec une rampe toute bête.
Si j'avance dessus une fois que je repasse sur du plat le perso vole un petit moment le temps que la gravité fasse son effet. le Project permet de forcer le perso sur le sol de manière brutal avec le rigidBody. Ce n'est pas forcement LA solution mais au moins ça fonctionne pour le moment :)

ticoel
Messages : 20
Inscription : 21 Juin 2017 13:31

Re: Custom character script and RigidBody3D

Message par ticoel » 02 Juil 2017 14:39

Merci pour ce complément.

J'utilise le Rigidbody car mon personnage se déplace par l'ajout de force de type impulse. Je pioche des bonnes idées sur Internet, comme ici pour régler la hauteur d'un saut et non sa puissance, aussi ici pour marcher sur les murs. Mais j'ai un problème avec une vitesse élevée qui fait sauter le personnage quand il rencontre une bosse, ceci se retrouve aussi présent sur ton script tout comme sur celui fourni avec le Standard Assets.

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

Re: Custom character script and RigidBody3D

Message par QDRemix » 03 Juil 2017 11:11

Tiens je n'avais jamais vu ces scripts avec mes recherches..
Je vais pouvoir essayer ce midi normalement !!!

Merci pour ces liens.

Répondre

Revenir vers « (C#) CSharp »