Créer un outil de création de niveau

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
Armelias
Messages : 29
Inscription : 17 Juin 2014 21:30

Créer un outil de création de niveau

Message par Armelias » 21 Fév 2015 15:13

Bonjour à tous !

Je suis sur le point de débuter un nouveau projet et au vu de la structure des niveaux qu'il y aura, j'aimerais créer un petit outil pour m'assister lors de la création des niveaux.

Mon soucis est que j'ai beau cherché ou regarder du code source d'assets similaires, je n'arrive pas à détecter les action de l'utilisateurs dans l'onglet "scene" lorsque le jeu n'est pas lancé.


C'est tout bête mais il me manque la base et je n'arrive pas à commencer. Mes niveaux ne seront constituer que de lignes noires, j'aimerais donc avoir un éditeur semblable à celui déjà intégré à Unity pour éditer les colliders (cliquer pour ajouter un point, si c'est sur une droite existante, ajouter un autre point etc..).


J'ai tenté plusieurs choses, comme créer une classe qui hérite de EditorWindow mais ça n'aboutit pas. Je n'cherche qu'à être aiguillé pour enfin pouvoir commencer ! :D

Merci d'avance !

Avatar de l’utilisateur
minirop
Messages : 184
Inscription : 25 Juin 2014 12:58

Re: Créer un outil de création de niveau

Message par minirop » 21 Fév 2015 15:48

J'imagine qu'il faut utiliser les gizmos
Développeur Nintendo & PS Vita RIP PSM. Vive moi. Vive Unity. Flappikachu Vita

Armelias
Messages : 29
Inscription : 17 Juin 2014 21:30

Re: Créer un outil de création de niveau

Message par Armelias » 21 Fév 2015 15:55

Ce fût ma première idée aussi, sur le clique, tracer une droite (quelque chose de tout bête, juste pour voir si tout fonctionnait) et rien.

Exemple d'utilisation :

Code : Tout sélectionner

void OnDrawGizmos(){
		if(Input.GetMouseButton(0))
			Gizmos.DrawLine(Input.mousePosition, Vector3.zero);
	}

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Créer un outil de création de niveau

Message par artemisart » 21 Fév 2015 16:48

Si tu veux créer des trucs oriente toi plutôt vers l'api editor (namespace UnityEditor).
Matis tu veux faire quoi en fait ? créer du mesh ? placer des objets type labyrinthe ?

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: Créer un outil de création de niveau

Message par Franck » 21 Fév 2015 17:05

Dés fois j'bug, dés fois j'bug pas.

Armelias
Messages : 29
Inscription : 17 Juin 2014 21:30

Re: Créer un outil de création de niveau

Message par Armelias » 21 Fév 2015 17:05

C'est la première fois que j’expérimente ce genre de choses, donc peut être mon approche n'est-elle pas très correcte.

Mes niveaux ne seront constitués que de quelques lignes noires. Je comptais donc les tracer avec l'outil en question et ça aurait automatiquement généré mes lignes (en 2D) à partir d'une texture de 1x1 toute noire.

Avatar de l’utilisateur
minirop
Messages : 184
Inscription : 25 Juin 2014 12:58

Re: Créer un outil de création de niveau

Message par minirop » 21 Fév 2015 17:31

Armelias a écrit :Ce fût ma première idée aussi, sur le clique, tracer une droite (quelque chose de tout bête, juste pour voir si tout fonctionnait) et rien.
ça ne fonctionne pas, car tu utilises "Input" qui n'est pas disppnible dans l'éditeur, en faisant ceci :

Code : Tout sélectionner

void OnDrawGizmos()
{
	Gizmos.DrawLine(Vector3.one, Vector3.zero);
	Gizmos.DrawLine(Vector3.one, new Vector3(1, 0));
}
ça s'affiche bien. En fouillant google, tu peux utiliser Event.current.mousePosition qui est mis à jour à chaque clic (mais qui n'est pas aux bonnes coordonnées, par exemple l'axe Y est inversé)
Développeur Nintendo & PS Vita RIP PSM. Vive moi. Vive Unity. Flappikachu Vita

Armelias
Messages : 29
Inscription : 17 Juin 2014 21:30

Re: Créer un outil de création de niveau

Message par Armelias » 21 Fév 2015 22:54

Alors ça avance au final (merci beaucoup à vous !).

J'suis tombé sur ce lien qui s’avère très utile : http://code.tutsplus.com/tutorials/how- ... tive-10047 (en esperant qu'il serve à ceux qui liront ce post).


EDIT :
Au fil des heures, j'me demande si la façon dont je fait ça est "effiface". Je rappelle que je genere plein de petit carré pour tracé une ligne. Chacun d'enre eux un a collider et aura un script qui écoute si le joueur le touche ou non. Je commence à croire que ça va être très gourmand à terme (pour pas grand chose au final).

J'aimerais vos avis/conseils sur ce système (ou vos propositions pour un autre système).

J'suis en train de me dire qu'au lieu de ça, je pourrais faire un petit prefab (une droite de 2px de haut et par exemple 150px de large, noire) et instancié ce prefab plutot que pleins de carrés. Il me suffirait de la resizer sur X et de l'orienter pour avoir la bonne pente. J'aurais ainsi beaucoup moins d'objets.
Le soucis de cette méthode c'est qu'elle ne marche que si je veux tracer des droites de couleurs unies. Si mon prefab a quelques décorations, réduire se taille va déformer l'aspect. Or j'aimerais faire un truc un peu générique tout d'même.

Je n'sais pas si j'expose suffisamment clairement ma problématique, il est tard. Désolé !



Pour vous donner une idée de ce que j'ai actuellement, voici ma méthode Create() qui permet de creer plein de cubes (elle n'est pas du tout terminée mais vous voyez l'idée !)

Code : Tout sélectionner

public void Create(){
		Vector2[] pts = points.ToArray ();
		Vector2 currentNode;
		Vector2 nextNode;

		for (int i = 0, length = pts.Length-1; i < length; i++) {
			currentNode = pts[i];
			nextNode = pts[i+1];
			//first in line
			GameObject obj = Instantiate (prefab, currentNode, prefab.transform.rotation) as GameObject;
			obj.transform.parent = gameObject.transform;

			//line
			float stepX = prefab.renderer.bounds.size.x / (nextNode.x - currentNode.x);
			float stepY = prefab.renderer.bounds.size.y / (nextNode.y - currentNode.y);
			float x = currentNode.x, y = currentNode.y;
			bool conditionX = (stepX > 0) ? x < nextNode.x : x > nextNode.x;
			bool conditionY = (stepY > 0) ? y < nextNode.y : x > nextNode.y;
			while(conditionX && conditionY){
				x += stepX;
				y += stepY;

				obj = Instantiate (
					prefab,
					new Vector2(x, y),
					prefab.transform.rotation
				) as GameObject;
				obj.transform.parent = gameObject.transform;

				
				conditionX = (stepX > 0) ? x < nextNode.x : x > nextNode.x;
				conditionY = (stepY > 0) ? y < nextNode.y : x > nextNode.y;
			}
			Debug.Log(stepX);
			Debug.Log(stepY);
			//last in line
			obj = Instantiate (prefab, nextNode, prefab.transform.rotation) as GameObject;
			obj.transform.parent = gameObject.transform;
		}
	}

Répondre

Revenir vers « (C#) CSharp »