Se connecter

Informatique

Création de Jeux

Sujet : J'aide les gens dans Unity
UnityCoder
Niveau 6
01 décembre 2018 à 21:55:05

@MiskinLesSkelet
Une Light de type Spot dirigée vers le sol à la position de ton player avec l'option de texture cookies est certainement la solution à ta demande.
https://docs.unity3d.com/Manual/Cookies.html

UnityCoder
Niveau 6
01 décembre 2018 à 22:09:06

@General.
A noter que je ne réponds plus à vos question en PV.
Trops de demandes.
Je pensais éventuellement créer un sous forum ici histoire de répondre correct sur le suivit d'une demande, mais JVC ne permet plus cela !!!
Je dispose aussi d'espace d'entraide pour différents sujet sur Unity, mais JVC ou le modérateur actuel de ce forum, m'a signalé qu'il m'était interdit d'en faire usage d'information !!!
L'idéal ici serais de pouvoir ouvrir un sujet pour chaque cas Unity afin d'en suivre un fil convenable, mais la politique de modération l'interdit !!!
Je ne sait que faire plus pour aider.

MiskinLesSkelet
Niveau 8
03 décembre 2018 à 07:40:17

Hello,

j'aimerais faire attendre une fonction avant de faire une action.
J'ai vu 3 méthodes différentes (Ienumerator, Invoke et la technique du delay dans un Update) mais aucune ne semble correspondre.

Pour l'exemple, peut être que vous pouvez me dire où je devrais mettre l'une des 3 méthodes :

void nomFonction ()
{
dommagesJoueur = 0;
attendre 2 secondes
dommagesJoueur = 10;
}

:svp:

UnityCoder
Niveau 6
03 décembre 2018 à 08:35:45

Le 03 décembre 2018 à 07:40:17 MiskinLesSkelet a écrit :
Hello,

j'aimerais faire attendre une fonction avant de faire une action.
J'ai vu 3 méthodes différentes (Ienumerator, Invoke et la technique du delay dans un Update) mais aucune ne semble correspondre.

Pour l'exemple, peut être que vous pouvez me dire où je devrais mettre l'une des 3 méthodes :

void nomFonction ()
{
dommagesJoueur = 0;
attendre 2 secondes
dommagesJoueur = 10;
}

:svp:


    private int _playerDommages;

    private void MyFunction()
    {
        StartCoroutine(WaitDommage(2));
    }

    private IEnumerator WaitDommage(float time)
    {
        _playerDommages = 0;
        yield return new WaitForSeconds(time);
        _playerDommages = 10;
    }
MiskinLesSkelet
Niveau 8
03 décembre 2018 à 15:33:43

Le 03 décembre 2018 à 08:35:45 UnityCoder a écrit :

Le 03 décembre 2018 à 07:40:17 MiskinLesSkelet a écrit :
Hello,

j'aimerais faire attendre une fonction avant de faire une action.
J'ai vu 3 méthodes différentes (Ienumerator, Invoke et la technique du delay dans un Update) mais aucune ne semble correspondre.

Pour l'exemple, peut être que vous pouvez me dire où je devrais mettre l'une des 3 méthodes :

void nomFonction ()
{
dommagesJoueur = 0;
attendre 2 secondes
dommagesJoueur = 10;
}

:svp:


    private int _playerDommages;

    private void MyFunction()
    {
        StartCoroutine(WaitDommage(2));
    }

    private IEnumerator WaitDommage(float time)
    {
        _playerDommages = 0;
        yield return new WaitForSeconds(time);
        _playerDommages = 10;
    }

:merci:

Gaetano-GX
Niveau 22
06 décembre 2018 à 09:59:01

Bonjour à tous,
Suite à mon message précédent, je reviens poster car j'ai toujours ce problème de flammes qui traversent les briques (dans mon Bomberman-like), alors qu'elles devraient s'arrêter à la première brique qu'elles rencontrent...
Une image pour illustrer:
https://image.noelshack.com/fichiers/2018/49/4/1544084544-bomberman.png

Le 01 décembre 2018 à 18:24:10 UnityCoder a écrit :
1 - Le GameObject nommé Brick01 75x75 possède t'il un Collider 2D ?
2 - Quelle est la valeur du Vecteur directionRay quand le hit.collider est différent de null ?

1 - Oui mon GameObject possède un Collider2D
2 - J'ai placé un debug.log, et le résultat dans la console unity est: "UnityEngine.Debug:Log(Object)"

Je vous reposte mes codes rectifiés:

SingleCharacterScript.cs (attaché au personnage; pas de problème avec ce script):

using UnityEngine;
using System.Collections;

public class SingleCharacterScript : MonoBehaviour {

	// Longueur explosion
	public static int BombLength = 2; // 9 = max

	// Nombre de bombes
	public static int BombNumber = 1;

	void Start () {
		SingleCharacterScript.DontDestroyOnLoad(this);
	}
	
	// Update is called once per frame
	void FixedUpdate () {
	
		if (BombNumber >= 10) {
			BombNumber = 10;
		}
		if (BombNumber <= 0) {
			BombNumber = 1;
		}
		if (BombLength > 9) {
			BombLength = 9;
		}
		if (BombLength < 1) {
			BombLength = 1;
		}

	}
}

Explosion.cs (attaché aux flammes; pas de problème avec ce script non plus):

using UnityEngine;
using System.Collections;

public class Explosion : MonoBehaviour {

	public static float time = 0.05f;

	void OnTriggerEnter2D(Collider2D co) {

		// On détruit le personnage
		if (co.name == "Character01")
			Destroy (co.gameObject);

		// On détruit la brique
		if (co.name == "Brick01 75x75") {
			Destroy (co.gameObject);
		}

		// On détruit la bombe à proximité
		if (co.name == "Bomb") {
			Destroy (co.gameObject, time);
		}

	}
}

Bomb.cs (c'est le code qui me pose problème):

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Bomb : MonoBehaviour {

	// Explosion Prefab
	public GameObject explosionPrefab; // Explosion centrale
	public GameObject explosionUpPrefab; // Explosion verticale de fin en haut
	public GameObject explosionLeftPrefab; // Explosion horizontale de fin à gauche
	public GameObject explosionDownPrefab; // Explosion verticale de fin en bas
	public GameObject explosionRightPrefab; // Explosion horizontale de fin à droite

	public GameObject explosionMidHPrefab; // Explosions horizontales du milieu
	public GameObject explosionMidVPrefab; // Explosions verticales du milieu



	//public GameObject[] brickGrey;
	//public static bool stopExplo = false;



	void OnDestroy() {

		// On instantie d'abord l'explosion centrale dans tous les cas:
		Instantiate(explosionPrefab, transform.position, Quaternion.identity);

		// Pas de problème dans ce bloc "if"
		if (SingleCharacterScript.BombLength == 1) { // Longueur explosion == 1
			Vector2 posUp = transform.position;
			posUp.y += 0.75f;
			Instantiate (explosionUpPrefab, posUp, Quaternion.identity);

			Vector2 posLeft = transform.position;
			posLeft.x -= 0.75f;
			Instantiate (explosionLeftPrefab, posLeft, Quaternion.identity);

			Vector2 posDown = transform.position;
			posDown.y -= 0.75f;
			Instantiate (explosionDownPrefab, posDown, Quaternion.identity);

			Vector2 posRight = transform.position;
			posRight.x += 0.75f;
			Instantiate (explosionRightPrefab, posRight, Quaternion.identity);

		}
			
		// Si longueur explosion > 1
		// Comment arrêter l'explosion si elle rencontre une brique ?
		else if (SingleCharacterScript.BombLength > 1) {

			for (int i = 1; i < SingleCharacterScript.BombLength; i++) { /***VERTICAL UP***/

				Vector2 posMidVUp = transform.position;
				posMidVUp.y += (0.75f * i);

// Pourquoi on soustrait posMidVUp alors qu'il est égal à un transform.position:
Vector2 directionRay = ((Vector2)transform.position - posMidVUp).normalized;
// Lancé de rayon.
RaycastHit2D hit = Physics2D.Raycast(transform.position, directionRay);
// Si le rayon rencontre un collider 2D
if (hit.collider != null) {
	Debug.Log (directionRay);
	// Si le GameObject possède ne se nomme pas "Brick01 75x75"
	if (hit.collider.name != "Brick01 75x75") {
	// On instancie le préfab explosion.
		Instantiate (explosionMidVPrefab, posMidVUp, Quaternion.identity);
	}
}

Je ne comprends pas cette ligne en rapport avec le raycast:

// Pourquoi on soustrait posMidVUp alors qu'il est égal à un transform.position:
Vector2 directionRay = ((Vector2)transform.position - posMidVUp).normalized;

Merci d'avance pour votre précieuse aide, car là je bloque complètement... :-(
Bien cordialement

Gaetano-GX
Niveau 22
06 décembre 2018 à 10:04:11

Un pastebin pour plus de lisibilité:
Bomb.cs:
https://pastebin.com/6nYCWT9g

Hytrq
Niveau 3
07 décembre 2018 à 20:43:37

Bonjour,
Je ne savais pas trop où poster cette question, donc désolé si je suis hors-sujet.
Mais voilà, quelles sont les compétences nécessaires en programmation (ici en C#) pour faire un jeu ?
Actuellement, j'essaye d'apprendre la prog', j'ai découvert le principe de l'orienté-objet (avec les notions d'héritage etc.) et je me rends compte que ça risque de m'être extrêmement utile dans la création de jeu. Maintenant, qu'est ce qu'il y a d'autres d'essentiel à savoir ?
En gros, jusqu'où doit on pousser l'apprentissage du C# et à partir de quel moment peut on considérer avoir les bases et apprendre des éléments plus spécifiques aux jeux-vidéos (s'il y en a) ?
Merci ! :-)

Le_Tryall
Niveau 8
10 décembre 2018 à 22:51:10

Hytrq :d) Tu peux créer un Flappy bird avec très peu de notion. ça te demandera plus de connaissances si tu veux faire un Super Meat boy. Et encore plus de connaissances si tu souhaite créer un Stellaris.

N'attend pas d'avoir une certaine base de connaissance pour commencer t'es projets. Fait un jeu qui semble à ta portée. Si tu as les connaissances, cool pour toi, tu finiras ton projet assez rapidement sans trop de soucis (c'est déjà ça). Si c'est au dessus de t'es moyens, tu prendras plus de temps (voir tu ne finira jamais ton jeu) mais dans le processus du gagnera des compétences qui te permettront de mieux faire la prochaine fois.

Après globalement, la programmation orienté objet (POO) c'est la base pour la plupart des langages dans la plupart des jeux. le modèle MVC peut être utilisé pour des jeux de gestions mais ça reste le POO le plus utile. Si tu utilise Unity, les Scriptable Objects sont de bons alliés.

Il n'y à pas de secret, le reste viens à force de pratiquer (et à force de se prendre des bons gros murs :hap: )

gorz94
Niveau 6
14 décembre 2018 à 00:41:29

Salut,

Je cherche à créer une interface permettant à un joueur de taper du code sur Android de manière fluide, pour ce jeu : https://www.jeuxvideo.com/forums/42-31-48718280-1-0-1-0-besoin-d-avis-coderpg-jeu-de-programmation-rpg.htm (que je refais depuis le début).
J'aimerai arriver au même rendu que le jeu Hacked (https://play.google.com/store/apps/details?id=com.hackedapp) sur Unity.

Actuellement, j'ai un gros TextMesh, que l'on peut scroll avec un ScrollRect. En fonction de la position du doigt lors d'un click, je calcule la ligne de code correspondant.

https://www.noelshack.com/2018-50-5-1544744199-abcd.jpg

Le problème est que ... Bah c'est pas fluide du tout. Une fois sur deux, le jeu détecte un mouvement de la zone de code en scroll et pas un click, du coup on se retrouve obligé de cliquer plusieurs fois sur la ligne à choisir, et ça rend l'expérience naze. Sachant qu'en plus, je gère le curseur manuellement (la ptite barre blanche qui indique où on se trouve ...), donc je dois calculer sa position et c'pas ouf ... Y'a pas vraiment de composant natif à Unity pour faire ce que je veux, et j'aimerai rester sur du mobile et pas devoir changer de plateforme pour du PC.

Je sais pas comment le développeur d'Hacked s'y est prit (il m'a pas répondu. :hap:), mais je pense pas que ça soit de l'Android natif, du coup j'pense pouvoir avoir un rendu similaire avec Unity.

Une solution serait de changer de plateforme voir de moteur, pour faire un jeu en Web par exemple, mais je ne maîtrise qu'Unity et j'aimerai continuer mon projet dessus.

Pour résumer, je cherche le moyen de concevoir une interface d'édition de texte fluide sous Unity, pour au moins permettre au joueur de sélectionner facilement la ligne qu'il a envie.

Si quelqu'un a une idée, je suis preneur. :noel:

Le_Tryall
Niveau 8
14 décembre 2018 à 22:18:34

Utilise un ScrollRect :
https://unity3d.com/fr/learn/tutorials/modules/beginner/ui/ui-scroll-rect
https://www.youtube.com/watch?v=ArH0S2Cdptk

tu auras un déplacement fluide grace à n'importe quel touch input (doigt ou curseur).

olololo
Niveau 38
15 décembre 2018 à 00:23:53

bonjour,
quelqu'un peut-il me corriger la ligne suivante en c# (déclaration tableau de tableaux que je sais pas faire). A moins que ce soit correct et qu'il me manque un import mais j'en doute

Array[] tab=new array[]{tab1,tab2,tab3};

voilà l'erreur au cas où : The type or namespace name `Array' could not be found. Are you missing `System' or `UnityScript.Lang' using directive?

merci
ps de là où j'en suis : j'avais abandonné face aux 10k+ erreurs et puis j'ai recommencé y'a 2 semaines (plus que 3k erreurs)

TheRealMarco
Niveau 10
15 décembre 2018 à 09:11:09

C'est pas possible de faire réellement des tableaux DE tableau. Tu peux faire des tableaux de tableaux d'entiers par exemple. Dans tous les cas, tu dois déclarer le type de données qu'ils vont stocker.

Pour la déclaration, tu peux faire un tableau comme ça s'ils font tous la même taille :
int [,] tab = new int [3, tab1.Length];

Et tu le remplis comme ça :
for (int i = 0; i < tab1.Length; i++) { tab[0,i] = tab1[i]; tab[1,i] = tab2[i]; tab[2,i] = tab3[i]; }

(mon code peut comporter des erreurs, je l'écris directement sur jeuxvideo.com sans le tester, c'est pour te donner une idée).
Plus d'infos : https://www.dotnetperls.com/2d

S'ils ne font pas la même taille, tu dois faire un tableau en escalier.
UnityCodrer avait déjà expliqué ici : https://www.jeuxvideo.com/lapintade/forums/message/940473868

olololo
Niveau 38
15 décembre 2018 à 14:48:16

merci pour la réponse je devrais pouvoir avancer avec ça.
je trouve que le c# est trop strict et sans permissivité mais c'est ainsi. c'était la fête avec l'unityscript tout fonctionnait en codant au feeling ,_,
ps la chaîne youtube de ton profil n'existe pas

gorz94
Niveau 6
15 décembre 2018 à 15:15:31

Le 14 décembre 2018 à 22:18:34 Le_Tryall a écrit :
Utilise un ScrollRect :
https://unity3d.com/fr/learn/tutorials/modules/beginner/ui/ui-scroll-rect
https://www.youtube.com/watch?v=ArH0S2Cdptk

tu auras un déplacement fluide grace à n'importe quel touch input (doigt ou curseur).

Justement, c'est ce que j'utilise. Mais sur Android les inputs sont mal gérés je pense, comme je l'ai expliqué le moteur différencie mal un scroll sur le ScrollRect d'un simple clique. C'est comme si le delta-pos utilisé pour différencier les deux était trop faible ..

TheRealMarco
Niveau 10
15 décembre 2018 à 15:19:19

Au contraire cette non permissivite permet de detecter les erreurs a la compilation au lieu de l'exécution. Donc moins de bugs a corriger pendant que le jeu tourne.

Ps oui faut que je le change, avant cet url redirigé sur la chaîne du compte de celui qui cliquait.

olololo
Niveau 38
15 décembre 2018 à 15:33:02

Le 15 décembre 2018 à 15:19:19 TheRealMarco a écrit :
Au contraire cette non permissivite permet de detecter les erreurs a la compilation au lieu de l'exécution. Donc moins de bugs a corriger pendant que le jeu tourne.

Ps oui faut que je le change, avant cet url redirigé sur la chaîne du compte de celui qui cliquait.

j'ai toujours corrigé à l'aide de la console mais je veux bien croire

UnityCoder
Niveau 6
16 décembre 2018 à 01:27:47

Bonsoir, réponses en vrac par ordre anti chronologiques.

@olololo,
L'utilisation de la classe Array est une mauvaise option en C#.
C'est une classe purement Unity de gestion dynamique de tableau essentiellement maintenue pour un portage de scripting entre UnityScript et C#.
C'est de toute façon une classe inefficace en termes de performance.
Maintenant recréer le fonctionnel d'un array (à éviter) en tableau natif C# est assez simple.
Ce pourrait être en fait une classe de type List qui comporte des objets de type List, qui eux-mêmes (etc.).
Donc juste l'écriture d'une classe... (le concept est là)...
Quoi qu'il en soit, abandonne le Array et analyse d'autres possibilités qui te demande le moins de re-factorisation de ton code.
Bien entendu, ce n'est pas simple d'être obligé de passer de UnityScript vers C#.
Si besoin je suis là sous une autre forme malheureusement incompatible avec ce forum.

@gorz94,
Les composants UI sont plus ou moins fonctionnels parfois dans certaines situations.
Donc c'est un fait...
Par expérience, je sais qu'il est possible que certains composant UI composés présentent parfois des anomalies.
Par expérience aussi, je sais qu'il est plus facile de mettre en cause un bug d'une API que de vérifier sa bonne utilisation.
Peut-être donner un code brut et simple de ta mise en place de la fonction que tu attends peut permettre de trouver les soucis.

@Gaetano-GX,
Je t'avais proposé un contact partage écran sous Team Viewer.
En 30 minutes tout aurait été réglé !!! Que te dire de plus.
Donc, je vais te dire en toute sincérité :
Pleins d'anomalies assez graves dans la compréhension de la programmation sous Unity Engine et du C# par rapport à ton code présenté.
Plein d'anomalies sur la logique fonctionnelle de juste 3 scripts entres eux.
Bon, on fait comment mon ami ?
Je ne remets pas en cause ton boulot ou ton engouement à ton projet (les graph j'aime). Mais juste te secouer un peu histoire d'avancer dans la bonne voie.

olololo
Niveau 38
17 décembre 2018 à 01:39:34

UnityCoder > merci pour la réponse je vais faire au mieux pour contourner le problème mais encore une fois ça semble être une absence de permissivité... enfin c'est ainsi. En plein dans cette transition UnityScript/C# j'arrive pas à me convaincre que sur le seul plan du langage ce soit une amélioration mais c'est mon problème... (je crois que j'ai déjà dit ça, faut pas y faire attention).

UnityCoder
Niveau 6
17 décembre 2018 à 16:56:56

@ololo,
La permissivité, n'est pas absente en C#.
D'ailleurs sur le fond elle est omniprésente dans la plupart des langages orientés object sauf en ce qui concerne les structures si le dit langage supporte cette possibilité..
Le fait par exemple de pouvoir caster un float en int ou l'inverse est en soit très permissif.
De même le concept objet qui n'est autre qu'un accès à des pointeurs est très permissif en soit.
En fait le seul langage à ma connaissance non permissif est soit l'assembleur, soit certain Basic de base, soit le Pascal et ses dérivés respectant la norme du langage.
D'ailleurs entre ()... Delphi est une extension du Pascal. Le C# est une évolution de Delphi créé à la base pour la prog en .Net par la même personne .
UnityScript a été abandonné par Unity Engine, et ce n'est pas pour rien. Sa facilité de programmation masquant beaucoup de concepts d'une programmation efficace et évolutive.
D'un autre coté, c'est vrai que cela a été un vrai coup bas pour toutes les personnes qui avaient optées par question de facilités vers le UnityScript.
Tout cela pour dire, ben rien de plus qu'une info et un constat.

Bon courage à toi.

Sujet : J'aide les gens dans Unity
   Retour haut de page
Consulter la version web de cette page