[RESOLU] Désactiver script avec un toggle

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
Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

[RESOLU] Désactiver script avec un toggle

Message par Leuprochon » 02 Mars 2018 20:45

Bonjour à Tous !

J'ai un petit soucis sur Unity.

J'ai trouvé un script qui me permets de faire un flip de mes faces. Jusque la tout fonctionne.
Par contre j'aurais aimé utiliser un bouton Toggle pour activer ou désactiver ce script.

J'arrive à activer le script quand il est désactivé de base. Mais quand il est activé impossible de le désactiver.

D'après mes recherches j'ai cru comprendre que c'était du au fait que l'ensemble de mon script se trouve dans "void Start". Or je ne sais pas ou mettre l'ensemble de mon script pour arriver à le désactiver. Si je le mets dans "void Update" ça marche mais ça fait un effet de scintillement. Je suppose que comme il calcule à chaque image il passe son temps à flipper les normales.

J'arrive à faire ce que je veux en créant deux objets, un avec les faces inversées et l'autre normal. Mais ça prend de la mémoire pour rien !

Merci beaucoup pour votre aide

Voici le script :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
 
[RequireComponent(typeof(MeshFilter))]
public class ReverseNormals : MonoBehaviour {
 
	void Start () {
		MeshFilter filter = GetComponent(typeof (MeshFilter)) as MeshFilter;
		if (filter != null)
		{
			Mesh mesh = filter.mesh;
 
			Vector3[] normals = mesh.normals;
			for (int i=0;i<normals.Length;i++)
				normals[i] = -normals[i];
			mesh.normals = normals;
 
			for (int m=0;m<mesh.subMeshCount;m++)
			{
				int[] triangles = mesh.GetTriangles(m);
				for (int i=0;i<triangles.Length;i+=3)
				{
					int temp = triangles[i + 0];
					triangles[i + 0] = triangles[i + 1];
					triangles[i + 1] = temp;
				}
				mesh.SetTriangles(triangles, m);
			}
		}		
	}
}

Avatar de l’utilisateur
ZJP
Messages : 5745
Inscription : 15 Déc 2009 06:00

Re: Désactivé script avec un toggle

Message par ZJP » 03 Mars 2018 01:19

Cela donne quel résultat avec OnEnable(), OnDisable() et SetActive()?.

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: Désactivé script avec un toggle

Message par Leuprochon » 03 Mars 2018 01:34

Merci pour votre aide !

J'ai pu trouvé la solution, la voici (mettre m pour enable et -m pour disable):

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
public class ReverseNormals : MonoBehaviour {

	void OnEnable () {
		MeshFilter filter = GetComponent(typeof (MeshFilter)) as MeshFilter;
		if (filter != null)
		{
			Mesh mesh = filter.mesh;

			Vector3[] normals = mesh.normals;
			for (int i=0;i<normals.Length;i++)
				normals[i] = -normals[i];
			mesh.normals = normals;

			for (int m=0;m<mesh.subMeshCount;m++)
			{
				int[] triangles = mesh.GetTriangles(m);
				for (int i=0;i<triangles.Length;i+=3)
				{
					int temp = triangles[i + 0];
					triangles[i + 0] = triangles[i + 1];
					triangles[i + 1] = temp;
				}
				mesh.SetTriangles(triangles, m);
			}
		}		
	}

	void OnDisable () {
		MeshFilter filter = GetComponent(typeof (MeshFilter)) as MeshFilter;
		if (filter != null)
		{
			Mesh mesh = filter.mesh;

			Vector3[] normals = mesh.normals;
			for (int i=0;i<normals.Length;i++)
				normals[i] = -normals[i];
			mesh.normals = normals;

			for (int m=0;m<mesh.subMeshCount;m++)
			{
				int[] triangles = mesh.GetTriangles(m);
				for (int i=0;i<triangles.Length;i+=3)
				{
					int temp = triangles[i + 0];
					triangles[i + 0] = triangles[i + 1];
					triangles[i + 1] = temp;
				}
				mesh.SetTriangles(triangles, -m);
			}
		}
	}
}

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Désactivé script avec un toggle

Message par Titan » 03 Mars 2018 10:40

Salut,
Je ne comprend pas comment passer une valeur de submesh negative pourrait "aider à" inverser tes triangles. en fait, je suppute que tu n'a qu'un submesh dans ton mesh, donc ton index (m) reste à 0 ce qui évite à ton script de crasher. retire le et ça devrait fonctionner de la même manière.

Sinon, factorise ton code dans une fonction, tu ne doit pas dupliquer toute ta logique pour utiliser 2 callback différente. Et d'une manière générale, il est déconseillé de réutiliser un état précédent pour calculer les valeurs d'un état suivant. une application est beaucoup plus robuste lorsque elle utilise l'état initial comme référence. dans ton cas ça veut dire sauvegarder la liste de triangle initial et la réappliquer sans modification dans le OnDisable()
Dernière édition par Titan le 03 Mars 2018 22:21, édité 2 fois.
____________________________________________
Hop Boy

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: Désactivé script avec un toggle

Message par Leuprochon » 03 Mars 2018 15:55

Merci pour cette remarque.

Je suis conscient que c'est bourrin comme technique. Je suis totalement d'accord avec ce que tu dis mais je ne sais pas coder et je n'ai pas les compétences pour y arriver autrement (et pas trop le temps non plus à vrai dire).
Actuellement je ne fais qu'un prototype qui ne servira qu'à moi, c'est pourquoi je ne cherche pas à optimiser à fond.

L'application sera légère, peu de poly, très peu d'animation et de menu.

Cela suffit à mes besoins mais je suis tout à fait d'accord avec ce que tu as dit. Je n'aime pas faire le bourrin dans mon métier ( graphiste 3D ) mais quand on manque de temps et de connaissance on essaie de faire comme on peut :p

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Désactivé script avec un toggle

Message par Titan » 03 Mars 2018 22:37

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter))]
public class ReverseNormals : MonoBehaviour {

	void OnEnable () {
		FlipTriangles();		
	}

	void OnDisable () {
		FlipTriangles();
	}
	
	void FlipTriangles() {
		Mesh mesh  = GetComponent<MeshFilter>()?. mesh;
		if (mesh == null) return;

		Vector3[] normals = mesh.normals;
		for (int i=0;i<normals.Length;i++)
			normals[i] = -normals[i];
		mesh.normals = normals;

		for (int m=0;m<mesh.subMeshCount;m++)
		{
			int[] triangles = mesh.GetTriangles(m);
			for (int i=0;i<triangles.Length;i+=3)
			{
				int temp = triangles[i + 0];
				triangles[i + 0] = triangles[i + 1];
				triangles[i + 1] = temp;
			}
			mesh.SetTriangles(triangles, m);
		}
	}
}
C'est pas uniquement les débutants qui font ça, j'ai une paire de collègue à qui j'arracherai bien la touche CTRL de leur clavier.
Dernière édition par Titan le 04 Mars 2018 23:49, édité 2 fois.
____________________________________________
Hop Boy

Leuprochon
Messages : 60
Inscription : 04 Déc 2017 19:12

Re: Désactivé script avec un toggle

Message par Leuprochon » 04 Mars 2018 15:38

Merci !! C’est très sympa

En fait c'est tout con, propre et ça marche bien.

Je comprends un peu mieux du coup maintenant ! Merci encore (:.

Répondre

Revenir vers « (C#) CSharp »