Depuis quelques temps je m'essaye à Unity en réalisant un clone d'un jeu mobile pour Android uniquement de type "Splashy" (cf le Playstore) . Dans ma réplique je fais différemment, au lieu de devoir déplacer horizontalement une balle qui arrive vers des plateformes pour permettre son rebond, ce sont les plateformes qui arrivent vers la balle qui reste fixe (effectue seulement un rebond vertical quand une plateforme arrive). Comme je code un petit peu en mode "blaireau" en tâtonnant un peu ^^, je remarque que mes script ne me permettent pas d'arriver là où je veux, c'est à dire faire en sorte que même au bout du nème rebond, la balle atterrit toujours au milieu de la plateforme (et quelque soit la vitesse, la distance entre celles-ci ...) Je suis à peu près bon dans le calcul mais un léger décalage subsiste, qui ne semble pas venir d'une double activation et cause toujours un micro décalage qui finis inlassablement par faire tomber la balle trop en avant.
Voici mon script qui génère les plateformes (riverMin/Max sera activé plus tard pour que les plateformes soit crées un peu aléatoirement sur l'axe horizontal mais pour tester plus facilement le jeu je le laisse désactiver pour l'instant)
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlateformGenerator : MonoBehaviour {
public GameObject thePlateform;
public Transform generationPoint;
private float distanceBetween = 2.8f;
private float xPos = 45f;
public static float centerPlateformDist;
private float plateformWidth;
private float riverMin = 43.5f;
private float riverMax = 46.5f;
public GameObject plateformClone;
private int nextNameNumber = 1;
void Start () {
plateformWidth = thePlateform.GetComponent<BoxCollider>().size.x;
}
void FixedUpdate () {
if (transform.position.z < generationPoint.position.z)
{
//xPos = Random.Range (riverMin, riverMax);
transform.position = new Vector3(xPos, transform.position.y, transform.position.z + plateformWidth + distanceBetween);
plateformClone = Instantiate(thePlateform, transform.position, transform.rotation);
centerPlateformDist = plateformWidth + distanceBetween;
plateformClone.name = "newPlateform" + nextNameNumber;
plateformClone.tag = "Plateforms";
nextNameNumber++;
}
}
}
Celui qui les fait se déplacer vers la balle
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlateformMove : MonoBehaviour {
public static float plateformSpeed = 6;
private bool freeze = false;
void Start () {
}
void Update () {
freeze = Respawning.freeze;
if (freeze == false)
{
transform.Translate(-Vector3.forward * Time.deltaTime * plateformSpeed);
}
}
}
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class autoJump1 : MonoBehaviour
{
public Vector3 jump;
Rigidbody rb;
private float vel;
public float v;
private float jumpForce;
private float T;
private float d;
public static int ctN = 0;
public static int ctO = 0;
void Start()
{
rb = GetComponent<Rigidbody>();
jump = new Vector3(0.0f, 1.0f, 0.0f);
}
void OnCollisionEnter()
{
ctN++;
}
void OnCollisionExit()
{
ctO++;
}
void FixedUpdate()
{
if (ctN > ctO && Respawning.freeze == false)
{
vel = rb.velocity.y;
if (vel <= 0.05)
{
d = PlateformGenerator.centerPlateformDist;
v = PlateformMove.plateformSpeed;
T = d / v;
jumpForce = (9.81f * T / 2f);
rb.AddForce(jump * jumpForce, ForceMode.VelocityChange);
Vibration.Vibrate(50);
GameManagement.Scoring();
}
}
}
}