[HELP] Jeu de plateforme 2D à la façon Mario-Sonic...

Toutes les questions sur le développement Mobile, y compris la partie script.
Avatar de l’utilisateur
kikicosmo
Messages : 112
Inscription : 01 Août 2014 10:03
Localisation : Carcassonne

[HELP] Jeu de plateforme 2D à la façon Mario-Sonic...

Message par kikicosmo » 18 Août 2014 11:40

Bonjour à tous
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"

Image

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é.

Image

Image

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
}
CheckGround.cs (Pour détecter le sol et savoir si on peut sauter ou non)

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

}
Global.cs (euh! bonne question!!!)

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

	}
	
Tir.cs (Action sur le bouton "tir")

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


	}

}
SpecialEffectsHelper.cs (Génération de l'effet lorsqu'un ennemi est touché (explosion))

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;
		}
	}
}
Voilà, j'ai essayé de faire le plus clairement possible pour vous expliquer ou j'en suis, en espérant avoir posté au bon endroit ;-)
Merci de vos lumières par avance

Fred

Avatar de l’utilisateur
kikicosmo
Messages : 112
Inscription : 01 Août 2014 10:03
Localisation : Carcassonne

Re: [HELP] Jeu de plateforme 2D à la façon Mario-Sonic...

Message par kikicosmo » 22 Août 2014 23:36

Merci pour rien, mais j'ai trouvé la solution... SUJET CLOS!!!

Verrouillé

Revenir vers « Développement plateformes mobile Iphone et Android »