bon voilà, suis un nouvel utilisateur d'Unity3D,
voici ma petite Présentation
Je travail actuellement sur un petit projet de jeu de plateforme 2D à la façon Mario-Sonic-Donkey kong pour mobile Android et Apple,
Bon, jusque là quoi de bien nouveau me direz-vous!!!
Je me suis rendu compte que les jeux de plateformes pour mobiles ne courent pas les rues, donc pourquoi de pas me faire les dents sur ce genre de projet...
Bref, je débute alors pourquoi pas et puis c'est en forgeant que l'on devient forgeron...
Mon projet s’appellera "Becky Adventure Saga"
Pour le personnage principale, j'utilise iClone 5.51 et je l'exporte en 2D Targa 32bits en séquence images.
Tous les mouvements sont créés et opérationnels,
Les plateformes sont faites avec 2DToolkit que je me suis offert , mais j'ai quelques soucis avec, je m'explique:
2DToolkit est top pour "peindre" les décors et les plateformes de jeux 2D, mais il y a quand même un souci,
les Colliders sont 3D et non 2D, donc pour que le personnage ne passe pas à travers, il lui faut aussi un Collider 3D, mais du coup, les scripts qui lui sont associés sont à modifier également (vector, Rigidbody etc...)
Je me suis isnspirer de plusieurs tutos pour le controle du personnage, le tir, le saut etc.... Pour ce qui est de la recolte des goodies, du compteur de points et de la gestion des vies, tout fonctionne parfaitement,
là ou je bloque, c'est que j'ai mis en place les joystick et bouton pour le controle sur mobile en suivant ce Tuto
Les mouvements droite et gauche fonctionnent nickel, le tir par intermittence et le saut également, c'est a dire que pour le tir, l'appui répétitif sur le bouton, génère le son mais pas la particule associée (en gros la particule n'est pas assez vite régénérée). Pour le saut, les colliders sont bons, mais on a l'impression que sur certains morceaux de la plateforme, le personnage ne détecte pas toujours la collision, donc pas de saut pour lui, pas cool quoi!
Pareil lorsque l'on saute vers un mur, si on ne lache pas le joystick, le personnage reste collé sur celui-ci, j'aurai préféré que lorsqu'il touche un obstacle, le personnage soit stoppé.
Le fait d'avoir modifié le script pour qu'il soit 3D et non 2D, je n'arrive plus a mettre mes animations pour le saut, le tir et le déplacement, le personnage reste sur l'animation "iddle" de base, bref j'ai besoin d'un petit coup de main LOL.
Voici les script que j'utilise pour mon jeu:
PlayerMovements.cs (Controle du personnage via les Joystick et boutons)
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class PlayerMovements : MonoBehaviour {
#region Attributes
public float speed;
public float jumpForce;
#endregion
#region Unity methods
void FixedUpdate() {
CheckMovements ();
}
void Update() {
if (CrossPlatformInput.GetButtonDown ("Jump")) {
if (Global.isGrounded) rigidbody.AddForce (Vector2.up * jumpForce * 10);
}
}
#endregion
#region Other methods
void CheckMovements() {
Vector2 newPosition = Vector2.zero;
float smooth = CrossPlatformInput.GetAxis ("Horizontal");
// Mouvement clavier
if (Input.GetKey(KeyCode.D)) {
// Déplacement droite
newPosition = Vector2.right * speed * Global.deltaTime;
transform.eulerAngles = new Vector2(0, 0);
} else if (Input.GetKey(KeyCode.Q)) {
// Déplacement gauche
newPosition = Vector2.right * speed * Global.deltaTime;
transform.eulerAngles = new Vector2(0, 180);
}
// Mouvement Joystick
if (smooth >= 0) {
newPosition = Vector2.right * speed * smooth * Global.deltaTime;
transform.eulerAngles = new Vector2 (0, 0);
} else {
newPosition -= Vector2.right * speed * smooth * Global.deltaTime;
transform.eulerAngles = new Vector2 (0, 180);
}
// Jump
if (Input.GetKeyDown(KeyCode.Space) && Global.isGrounded) {
rigidbody.AddForce(Vector2.up * jumpForce * 5);
}
transform.Translate(newPosition);
}
#endregion
}
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class CheckGround : MonoBehaviour {
#region Attributes
#endregion
#region Unity methods
void OnTriggerEnter(Collider obj) {
if(obj.gameObject.layer == 11 && !Global.isGrounded) {
Global.isGrounded = true;
transform.name = "GROUNDED";
}
}
void OnTriggerExit(Collider obj) {
if(obj.gameObject.layer == 11 && Global.isGrounded) {
Global.isGrounded = false;
transform.name = "NOT GROUNDED";
}
}
#endregion
#region Other methods
#endregion
}
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class Global : MonoBehaviour {
#region Attributes
public static float deltaTime;
// Player
public static Transform player;
public static bool isGrounded = false;
#endregion
#region Unity methods
void Awake() {
DontDestroyOnLoad (gameObject);
player = GameObject.FindGameObjectWithTag ("Player").transform;
}
void Update() {
deltaTime = Time.deltaTime;
if (player != null) {
Camera.main.transform.position = player.transform.position + new Vector3 (0, 0, -50);
}
}
#endregion
#region Other methods
#endregion
}
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
public class Tir : MonoBehaviour {
// Use this for initialization
void Start ()
{
}
void Update() {
bool shoot = CrossPlatformInput.GetButtonDown("Fire");
if (shoot)
{
WeaponScript weapon = GetComponent<WeaponScript>();
if (weapon != null)
{
// false : le joueur n'est pas un ennemi
weapon.Attack(false);
SoundEffectsHelper.Instance.MakePlayerShotSound();
}
}
}
void FixedUpdate ()
{
// 5 - Tir
}
}
Code : Tout sélectionner
using UnityEngine;
/// <summary>
/// Creating instance of particles from code with no effort
/// </summary>
public class SpecialEffectsHelper : MonoBehaviour
{
/// <summary>
/// Singleton
/// </summary>
public static SpecialEffectsHelper Instance;
public ParticleSystem smokeEffect;
void Awake()
{
// Register the singleton
if (Instance != null)
{
Debug.LogError("Multiple instances of SpecialEffectsHelper!");
}
Instance = this;
}
/// <summary>
/// Create an explosion at the given location
/// </summary>
/// <param name="position"></param>
public void Explosion(Vector3 position)
{
// Smoke on the water
instantiate(smokeEffect, position);
// Tu tu tu, tu tu tudu
}
/// <summary>
/// Instantiate a Particle system from prefab
/// </summary>
/// <param name="prefab"></param>
/// <returns></returns>
private ParticleSystem instantiate(ParticleSystem prefab, Vector3 position)
{
ParticleSystem newParticleSystem = Instantiate(
prefab,
position,
Quaternion.identity
) as ParticleSystem;
// Make sure it will be destroyed
Destroy(
newParticleSystem.gameObject,
newParticleSystem.startLifetime
);
return newParticleSystem;
}
}
WeaponScript.cs (Script pour le mouvement du missile envoyé (celui qui est généré par "Tir.cs", d'ailleurs je ne comprend pas pourquoi lorsque mon personnage est tourné à gauche, le missile lui ne l'est pas, il reste dirigé vers la droite)
Code : Tout sélectionner
using UnityEngine;
/// <summary>
/// Crée des projectiles
/// </summary>
public class WeaponScript : MonoBehaviour
{
//--------------------------------
// 1 - Designer variables
//--------------------------------
/// <summary>
/// Prefab du projectile
/// </summary>
public Transform shotPrefab;
/// <summary>
/// Temps de rechargement entre deux tirs
/// </summary>
public float shootingRate = 0f;
//--------------------------------
// 2 - Rechargement
//--------------------------------
private float shootCooldown;
void Start()
{
shootCooldown = 0f;
}
void Update()
{
if (shootCooldown > 0)
{
shootCooldown -= Time.deltaTime;
}
}
//--------------------------------
// 3 - Tirer depuis un autre script
//--------------------------------
/// <summary>
/// Création d'un projectile si possible
/// </summary>
public void Attack(bool isEnemy)
{
if (CanAttack)
{
shootCooldown = shootingRate;
// Création d'un objet copie du prefab
var shotTransform = Instantiate(shotPrefab) as Transform;
// Position
shotTransform.position = transform.position;
// Propriétés du script
ShotScript shot = shotTransform.gameObject.GetComponent<ShotScript>();
if (shot != null)
{
shot.isEnemyShot = isEnemy;
}
// On saisit la direction pour le mouvement
MoveScript move = shotTransform.gameObject.GetComponent<MoveScript>();
if (move != null)
{
move.direction = this.transform.right; // ici la droite sera le devant de notre objet
}
}
}
/// <summary>
/// L'arme est chargée ?
/// </summary>
public bool CanAttack
{
get
{
return shootCooldown <= 0f;
}
}
}
Merci de vos lumières par avance
Fred