Bonjour,
Je viens pour vous demandez un conseil ou une aide.
Je suis sur un petit projet de jeu de gestion 2D, mais une chose me chiffone, j'ai une scene ou il y une liste de matériaux, donc j'affiche 4 choses par materiau, le nom, le stock, un bouton d'achat et un autre de vente. Donc 4 objet par materiaux, c'est assez fastidieux à mettre en place , j'en ai que 2 pour l'instant vu que cette partie marche bien je planche sur le reste ( au final c'est du bete copier coller pour en rajouter )
Mais je trouve que ma scene se charge vite en objet et admettons que je voudrais mettre une 20aine de materiaux ça va vite devenir bordelique. Donc y'a-t-il une méthode pour allégé tout ça ?
https://gyazo.com/cdd53f8f1f50bcff526e87e6eaaf04eb je vous laisse un screen pour vous aidez à visualiser.
Merci d'avance !
Tu peux utiliser un slider, ou regrouper des matériaux
C'est à dire ?
Le slider servirait à quoi ici ?
Et quand tu dis regrouper les matériaux, faire un dossier avec un gameobject vide ?
Ce que j'ai compris, c'est que quand t'auras trop de matériaux, ça va saturer l'écran, non ?
Si c'est ça, le slider te permettrait de faire défiler l'affichage de tes matériaux.
Je me suis mal exprimé du coup désolé, j'ai penser au slider effictivement, mon problème est en fait au niveau de hierarchy et en général dans la conception ( pas dans le jeu quoi ) ça fait beaucoup d'élément répété.
Dans le code quand tu répètes trop de fois le même bout de code tu en fais une fonction par exemple.
Je voulais savoir si je pouvais amélioré la façon de faire mes boutons et text etc pour que ça soit moins lourd.
J'espère que je me suis mieux exprimé cette fois, merci d'essayer de m'aider en tout cas
J'en profite pour vous poser une autre question.
J'ai fait un script d'achat, quand je clique sur un bouton sa increment et decremente des variables etc, j'aimerais qu'a chaque fois que j'appuie sur le bouton et qu'un achat est effectuer, un message s'affiche dans une zone pour indiquer au joueur son action.
J'ai tenter un bête code, comme si je modifiais simplement un texte mais je dois mal m'y prendre car unity me retourne un joli NullReferenceException: Object reference not set to an instance of an object.
public UnityEngine.UI.Text ControlText;
void FAchat (string mat, ref int m, ref int ca, ref int s, ref int st, ref int sm, ref int nb, ref int dc){
if (m > 0 && ca <= m && s > 0 && st < sm){
m -= ca;
s -= 1;
st += 1;
nb += 1;
dc = ca;
ControlText.text = "Vous avez acheté " + nb + " " + mat + " pour " + ca + " po !";
}
Voilà comment j'ai procédé. J'ai aussi une fonction cliked() dans ce script.
Est-ce que tu as attribué ton TextMesh à ton ControlText ?
Si tu l'as pas fait, tu passes ControlText en public et tu l'assignes par l'inspector.
il faut mettre une instance du texte, soit tu mets le texte en public et tu dois le glisser soit en private et dans la void start tu mets un GetComponent
d'ailleurs je te conseille plutôt au debut du script d'utiliser Unity.Engine simplement et de mettre une public class
après sinon je comprends pas ton problème de hierarchy, crée un Canvas regroupant les textes/boutons et tu fais un seul script qui traite tout
Bah le soucis ( qui n'en est peut être pas vraiment un hein ! ) c'est que j'aimerais rajouter plein de materiaux mais ça va faire un paquet enorme de bouton quoi.
Sinon un script qui les génèrent tous avec une fonction ?
using UnityEngine;
using System.Collections;
public class Achat : MonoBehaviour {
//Script qui permet l'achat de materiaux dans les villages
public UnityEngine.UI.Text ControlText;
void FAchat (string mat, ref int m, ref int ca, ref int s, ref int st, ref int sm, ref int nb, ref int dc){
if (m > 0 && ca <= m && s > 0 && st < sm){
m -= ca;
s -= 1;
st += 1;
nb += 1;
dc = ca;
ControlText.text = "Vous avez acheté " + nb + " " + mat + " pour " + ca + " po !";
}
}
public void Cliked(){
if (gameObject.name == "ButtonBuyWood"){
FAchat("bois", ref Ressource.Money, ref Ressource.CA_Bois, ref Ressource.StockBois, ref Ressource.Stockage, ref Ressource.StockageMax, ref Ressource.NbBois, ref Ressource.DernierCoutBois);
}
else if(gameObject.name == "ButtonBuyIron"){
FAchat("fer", ref Ressource.Money, ref Ressource.CA_Fer, ref Ressource.StockFer, ref Ressource.Stockage, ref Ressource.StockageMax, ref Ressource.NbFer, ref Ressource.DernierCoutFer);
}
}
}
voilà le code complet de mon script.
J'ai bien assigné dans l'inspector. J'ai fait comme je fais d'habitude en fait, sauf que c'est la première fois que je caler ça ailleurs que dans l'Update() ou le Start() du coup j'ai pas du utiliser la bonne méthode.
ça me perturbe ta déclaration de texte
dégage le UnityEngine
public Text nom;
quand tu parles de matériaux c'est le nom des objets à acheter ?
et du coup using UnityEngine.UI en haut
Oui c'est des items dans le jeu.
Ah oui ok j'avais lu un truc sur ce que tu viens de me dire en faisant le rapprochement avec Python mais j'avais pas fait gaffe.
Merci.
J'ai toujours la même erreur, je commence à être fatiguer j'ai du mal a réfléchir la
si tu as un seul texte attaché au gameObject qui porte ton script
private Text nomDuText = gameObject.GetComponent<Text> ();
et là tu travailles avec ce texte là, c'est une instance de ton texte
Ok j'avais commencé à me renseigner sur ça je vais finir.
Mais en fait à ce gameObject j'aimerais y attacher tout un tas de texte issu de plusieurs script au final.
Je devrais peut être faire un script à part pour gerer ça du coup ? Peut être moins compliquer.
Merci de ton aide en tous cas.
ce qui peut être pas mal plutôt que de placer 500 texts sur ton gameObject c'est de les instancier dans le script, en prenant 4 textes de référence pour les positions/police/taille
tu peux faire des arrays (en gros listes) aussi pour les gérer plus facilement
Ok j'irais voir ça demain a la fraiche.
Merci encore pour ton aide !
les gens j'ai un gros problème
je suis en train de faire mon script de first person controller moi-même (j'aime pas utiliser des assets et surtout ne pas comprendre un script) en m'inspirant de l'asset, tout va bien pour le moment niveau déplacement, caméra etc sauf pour la limite de la rotation de la caméra en x.
en fait c'est pour bloquer à 90 et -90 degrés pour pas pouvoir faire des tours de rotation entiers en X(rotation sur la caméra, et celle en Y sur le player comme le first person controller asset)
donc sur l'asset ils ont fait une fonction qui tronque la valeur de la rotation en x (le quaternion q c'est celui de la caméra) :
Quaternion ClampRotationAroundXAxis(Quaternion q)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1.0f;
float angleX = 2.0f * Mathf.Rad2Deg * Mathf.Atan (q.x);
angleX = Mathf.Clamp (angleX, MinimumX, MaximumX);
q.x = Mathf.Tan (0.5f * Mathf.Deg2Rad * angleX);
return q;
}
bon déjà je suis pas familier avec les quaternions donc je ne sais absolument pas ce que représente le w, ni les /=
du coup j'ai essayé de faire comme eux en appelant la fonction pareil, mais ça fait faire n'importe quoi à la caméra (même pas descriptible, on dirait que ça oscille entre 2 rotations) quand on lance.
Du coup j'ai fait un Debug.Log(cam.transform.rotation.x), et j'obtiens :
-pour 270°(90 vers le haut) : -0.6931648
-pour 90° (90 vers le bas) : 0.6995172
et si j'ai bien compris les valeurs sont censées être des radians alors que là pas du tout (ça devrait être 1/2pi là il me semble), donc c'est plutôt inexploitable sachant que je veux utiliser deux variables pour le min et le max
j'ai aussi essayé avec les eulerAngles sauf que quand on dépasse les 90° (270 vers le haut, ou 90 vers le bas) la caméra se tourne de 180° en y et z (wtf) et l'angle en x devient croissant pour 270, et décroissant pour 90 fin c'est inexploitable
ça me prend la tête depuis des heures, quelqu'un aurait une idée de comment exploiter le x du Quaternion de ma caméra ? merci
Bonjour,
@kaTk :
Evite tant que possible de manipuler directement les quaternions.
Voici une possible solution non testée :
/// <summary>
/// Clamp la rotation locale sur l'axe des X de tout composant.
/// </summary>
/// <param name="behaviour">Le composant.</param>
/// <param name="ClampEulerX">L'angle delta en degrés mimimum et maximum autorisé.</param>
public void ClampRotation(Behaviour behaviour, float ClampEulerX)
{
Transform transformObject = behaviour.transform;
Vector3 localEulerAngle = transformObject.localEulerAngles;
if (localEulerAngle.x > (360f - ClampEulerX))
localEulerAngle.x = (360f - ClampEulerX);
else if (localEulerAngle.x > ClampEulerX)
localEulerAngle.x = ClampEulerX;
if (transformObject.localEulerAngles.x != localEulerAngle.x)
transformObject.localEulerAngles = localEulerAngle;
}
J'ai écrit cela vite fait mais le principe est la.
Cela devrait fonctionner en principe.
NB :
Bien sur dans le cas de deux valeurs minX et maxX, à toi d'adapter...