Page 1 sur 1

[RESOLU] Désactiver script avec un toggle

Publié : 02 Mars 2018 20:45
par Leuprochon
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);
			}
		}		
	}
}

Re: Désactivé script avec un toggle

Publié : 03 Mars 2018 01:19
par ZJP
Cela donne quel résultat avec OnEnable(), OnDisable() et SetActive()?.

Re: Désactivé script avec un toggle

Publié : 03 Mars 2018 01:34
par Leuprochon
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);
			}
		}
	}
}

Re: Désactivé script avec un toggle

Publié : 03 Mars 2018 10:40
par Titan
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()

Re: Désactivé script avec un toggle

Publié : 03 Mars 2018 15:55
par Leuprochon
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

Re: Désactivé script avec un toggle

Publié : 03 Mars 2018 22:37
par Titan

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.

Re: Désactivé script avec un toggle

Publié : 04 Mars 2018 15:38
par Leuprochon
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 (:.