Ok, j’ai pas encore envoyé le cours donc pas de retours pour le moment par rapport a ça (Je n’ai pas encore eut le temps de télécharger Unity 4 …). mais j’ai quand même regarder la suite des “choses a faire”.
Bon 1er élément, il faut faire un respawn quand le joueur tombe … déjà fait !!
Ensuite, utiliser leurs prefab d’un genre de bumper qui va propulser le joueur. Et également utiliser leur contrôler FPS modifié (et donc utiliser Unity 4)… NON MERCI.
Donc je vous présente le Bumper 2.0 !
Astuce de 3D Max
3DS Max m’a donner du fil a retordre avec le ressort !!! Ils proposent des Dynamic Objects en forme de ressort qui s’attache à deux objets pour faciliter les animations. Parfait.
Mais les animations des Dynamic Objects ne s’exportent pas en FBX. Ils sont donc inutilisable dans Unity. Du coup je du copier l’élément de base et appliquer un morpher. Un fois qu’on connais l’astuce, ça se fait en 10 minutes. Mais il m’a fallu au moins 2h de recherches sur les forums !!!! Je ferai peut-être une vidéo sur comment faire car je n’ai pas trouver grand chose qui explique vraiment comment procéder.
Maintenant on importe tout ça dans Unity
Me voila avec un objet qui ressemble a ceux qu’il va faire. Propulser le joueur dans un direction.
Ensuite, comment appliquer une force au joueur quand il s’approche de notre ressort ?
Sachant que le FPS Controler d’unity n’utilise pas la physique, je ne peut pas simplement ajouter une force au collider (j’ai pourtant essayer !!). On peut appliquer un transform.translate ou quelque chose dans le genre mais cela donne l’effet d’un téléportation instantanée. Pas trop l’effet voulu.
Du coup j’ai fini par créer un autre script sur mon joueur. Ceci me permet d’ajouter un LERP pour harmoniser le mouvement et utiliser le characterControler pour les effectuer grace au fonction move(). Tout ceci s’exécute lors d’un appel avec un déclencheur sur le Bumper :
Sur le Bumper :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpringControler : MonoBehaviour { private Animator SpringAnim; private AudioSource Boing; private Vector3 springForward; public float force; // Use this for initialization void Start () { SpringAnim = GetComponent<Animator>(); Boing = GetComponent<AudioSource>(); } // Update is called once per frame void Update () { } void OnTriggerEnter(Collider col) { //Getting the alignment of the spring in world coords springForward = transform.TransformDirection(new Vector3(0,1,0)); //Animating and playing sounds SpringAnim.SetTrigger("Contact"); Boing.Play(); //grabbing the react script and passing direction and force col.GetComponent<playerReactions>().throwBack(springForward, force); } } |
Et sur le joueur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class playerReactions : MonoBehaviour { private CharacterController cControl; private Vector3 impact = Vector3.zero; // Use this for initialization void Start () { cControl = GetComponent<CharacterController>(); } // Update is called once per frame void Update () { //apply the impacting force if(impact.magnitude > 0.2) { cControl.Move(impact * Time.deltaTime); } //dimish impact over time impact = Vector3.Lerp(impact, Vector3.zero, 5 * Time.deltaTime); } public void throwBack(Vector3 backMotion, float force) { backMotion.Normalize(); //Debug.Log("called : " + backMotion); impact += backMotion.normalized * force; } } |
Ouf, ce n’était pas aussi simple que je croyais !!!
Ils demandent aussi des déclencheurs qui feront tomber des rochers ou tirer des balles. Et des éléments “originaux” … Va faloir que je regarde les cours de plus prés pour savoir de quoi ils parlent !!!
@++
Pingback: Un Booster dans Unity | StarbugStone's Dev Blog