J'ai des exemples :
https://youtu.be/XiVzKBpnHwA
https://youtu.be/FZU8eOS_2AU
https://youtu.be/6Rv_D_-NXqM
Le meilleur exemple est Pokemon 3d. Je me demande comment un placer un sortie 2d dans un monde 3d.
Merci ;)
Tu peux créer un objet, lui affecter une Box collider ( 3D ) normale, et ajouter un Sprite Renderer, toujours face a la camera ( si elle bouge, tu mets un script qui oriente le sprite c'est tout ).
Après, quand ton personnage change de direction, tu changes de sprite, sans changer l'orientation. Faut juste que tes sprites soient adapter a ta vue.
Si j'ai l'temps j'te ferai un exemple.
Bonjour,
Depuis longtemps Il existe tellement de questions rester sans réelles réponses que vais tenter d'apporter mes maigres connaissances en priorité par celles qui m’intéresses et qui me semble didactique...
@TheLemoria :
Tout d'abord, bienvenue dans le monde de Unity.
Secondo, l'algo de ton code mérite une certaine réflexion (et la rien à voir avec Unity).
Quand je regarde ta méthode Update, tu utilise une variable locale à cette méthode nommée nbcube qui est censée mémoriser le nombre de cube déjà créé.
En fait de sa portée locale, ton test :
if (nbcube > 2)
Ne sert à rien, puisque d'entrée même après son incrémentation, elle ne pourra qu'être la valeur de 1.
Tierco, même en enlevant le premier problème énoncé, et sans encore regarder ton souci de cube qui n’apparaît pas à la bonne position voulue, reste un problème crucial dans le domaine du jeu développé avec des langages (plutôt des compilateurs) qui utilisent la virtualisation des ressources mémoire.
En gros c'est un mécanisme interne qui évite au programmeur d'être obligé par code de libérer implicitement la mémoire utilisé par un objet dès lors que l'on ne l'utilise plus, On appelle cela de façon générique le GC (Garbage Collector).
Le vrai problème est que dans les jeux on souhaite au mieux gérer le fameux Frame Rate, la de ce coté en général on optimise au mieux le code, maintenant quand le GC se met en action (c'est à dire que qui de lui même prends la main et récupère la mémoire inutilisée), ben ton jeu se fige c'est ballot hein.
Donc il est très important dans le cadre d'un jeu de minimiser non pas la création d'objets mais surtout leurs destructions qui parait si simple et sans contrepartie.
Si je regarde tes quelques lignes de code, cela va dans l'autre sens de se qu'il faut faire.
Tu créer un objet (donc tu lui affecte une certaine partie de tes ressources mémoire) et ensuite tu pense le détruire immédiatement (Ben non c'est le GC qui va le faire et tu sait pas quand).
if (nbcube > 2) {
Destroy(cube); // Et ici dès qu'il y a plus de 2 cube ça détruit le trop
Bon voila mes remarques au niveau coding en compréhension du pquoi du comment.
En gros si je reprends ton code à une sauce plus correcte, voila ce que cela pourrait donner:
public class enfantlife : MonoBehaviour
{
private int nbcube = 0; // Nb de cube au départ
void Update ()
{
if (nbcube < 2) // Le nombre de cube max à créér
{
// Création du cube
}
}
}
Ta vrai question maintenant et celle ci porte sur Unity c'est je clic sur mon écran, je créer une forme de type primitive, et je souhaite que celle ci soit positionnée à l’endroit de mon click;
Ben...
gorz94 t'avais donné un prémisse de réponse.
Juste réponse en 2D !
Nous sommes nous en 3D et cela change tout.
Le Z la profondeur tu en fait quoi?
Uncube.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition)
Comme gorz94 te la proposé c'est juste adapté éventuellement à la 2D.
Réfléchi et regarde la doc de cette méthode ScreenToWorldPoint...
Elle attend en tant que paramètre un vecteur 3D et non 2D.
Prends une feuille de papier et un crayon et dessine un point qui est ta caméra (ta vision du monde), simule avec la pointe de crayon l'endroit ou tu souhaite que ton cube apparaisse...
Quel es sa distance par rapport à ton point de vue?
Donc tu peut récupérer de façon logicielle l'axe X, Y de la souris, oki mais la profondeur ???
Ben c'est à toi de la fixer .
Pour résumer le tout voici un petit code sans prétention...
using UnityEngine;
public class enfantlife : MonoBehaviour
{
private int nbcube = 0; // Nb de cube au départ
void Update ()
{
if (nbcube < 1) { // Le nombre de cube max à créér
{
// Click mouse
if (Input.GetMouseButton (0)) {
// On traite le clic
nbcube++;
// Création du cube
GameObject cube = GameObject.CreatePrimitive (PrimitiveType.Cube);
// Récupère positon de la souis
Vector2 pMouse = Input.mousePosition;
// Le vecteur cible est à 10 unitées devant la caméra
Vector3 vCible = new Vector3 (pMouse.x, pMouse.y, Camera.main.transform.position.z + Mathf.Abs (Camera.main.transform.position.z) + 10);
// Calcule de la position la cible dans le monde par rapport à la caméra
Vector3 position = Camera.main.ScreenToWorldPoint (vCible);
// Modifie position du cube
cube.transform.position = position;
}
}
}
}
}
Bon ben voila cela fonctionne.
Bonne continuation.
Je possède bien sur les réponses aux autres questions mais bon...
A bientôt.
Merci beaucoup pour avoir pris le temps de m'expliquer mais j'ai toujours un problème --'
J'ai repris ton code et j'ai changer quelque truc.
using UnityEngine;
using System.Collections;
public class enfantlife2 : MonoBehaviour
{
private int nbcube = 0;
public Transform prefab;
void Update ()
{
if (nbcube < 1) {
{
if (Input.GetMouseButton (0)) {
nbcube++;
Vector2 pMouse = Input.mousePosition;
Vector3 vCible = new Vector3 (pMouse.x, pMouse.y, Camera.main.transform.position.z + Mathf.Abs (Camera.main.transform.position.z) + 10);
Vector3 position = Camera.main.ScreenToWorldPoint (vCible);
Instantiate(prefab, position, Quaternion.identity);
}
}
}
}
}
Maintenant unity me met "nullreferenceexception object reference not set to an instance of an object". Si vous pouviez encore m'aider ça serait cool ! Merci encore
Bonjour,
Quand tu créer une instance d'un prefab celui ci doit être de type GameObject.
public Transform prefab; => public GameObject prefab;
Bonne continuation.
Rebonjour , je suis chiant mais ça me met toujours le message ! J'en ais marre a chaque fois que je fais un truc ça marche jamais ARG ! Qu'es que je peux faire alors ? Désolé pour ces nombreux postes.
Re,
Dans l'inspecteur d'objet (a droite en principe) tu as bien renseigné le champ prefab avec ton objet préfabriqué ?
Possède tu skype ?
On fait la suite en MP c'est plus simple la (si tu es d'accord).
oui, j'ai mis le prefab dans le script
Bonjour,
Après quelques heures de googlage inutile, je n'arrive pas a trouver comment ne plus avoir cette erreur :
Rotation quaternions must be unit length.
UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()
Si quelqu'un peut m'aider je suis preneur !!!!
Ce problème m'arrive quand je suis un remote-client (et non le host serveur-client) et que le serveur tire une balle.
Merci
J'ai réussi a l'arranger. Il ne FAUT pas définir "none" comme option dans Network Transform pour la rotation ou plus rien ne marche au niveau de l'objet spawn au niveau des clients. Je pense que c'est un bug que les devs n'ont pas vu.
Pour ceux qui dev' pour Android, quelle alternative vous avez pour la fonction OnMouseDown (), qui n'est pas précise du tout ?
Contrôler qu'il y a un élément ou plus dans input.touches, faire une condition genre if(input.touches[0].phase == touchphase.began || input.touches[0].phase == touchphase.pressed)
En fait j'utilisais cette méthode, via ce script:
private var last : GameObject;
function Update ()
{
var hit : RaycastHit;
for (var i = 0; i < Input.touchCount; ++i)
{
var ray = camera.ScreenPointToRay(Input.GetTouch(i).position);
if ( Physics.Raycast(ray, hit) )
{
var hitObject = hit.transform.gameObject;
if (Input.GetTouch(i).phase == TouchPhase.Began)
{
last = hitObject;
}
if (Input.GetTouch(i).phase == TouchPhase.Ended)
{
if (last == hitObject)
{
hitObject.SendMessage("MouseDown");
}
last = null;
}
}
}
}
... script qui marchait, mais d'un coup il ne marchait plus sans comprendre pourquoi ... en fait j'avais fait un mauvais "Replace In Files" qui avait changé mes fonctions et du coup bah ça marchait plus ...
Je laisse le script au cas où quelqu'un en a besoin.
Coucou Voilà je cherche à pouvoir lancer un lien quand le joueur clique sur
un Gameobject. Quel est le script ?
Je rencontre un petit problème assez bête.
Je suis étonné de voir qu'il semble impossible de renommer une ressource importé dans unity.
En l’occurrence, j'ai téléchargé 2 scripts qui sont la conversion des FPSInput et CharacterMotor en C#.
Seulement ils s'appellent respectivement $FPSInput et $CharacterMotor.
Maintenant que je les ai importé, je suis obligé de les modifier hors d'unity et de les réimporter ? Ou il y'a une fonction renommer que j'ai zappé ?
Merci d'avance
essaye de faire un double-clic lent sur le script dans l'onglet Project d'unity?
"Coucou Voilà je cherche à pouvoir lancer un lien quand le joueur clique sur
un Gameobject. Quel est le script ?"
http://docs.unity3d.com/ScriptReference/Application.OpenURL.html déjà
Et tu peux mettre leur fonction dans la fonction OnMouseDown du gameobject et mettre un collider au gameobject
essaye de faire un double-clic lent sur le script dans l'onglet Project d'unity?
Ah oui, en effet, c'était vraiment con...
Merci
J'en profite pour poser une autre question.
J'ai pas très très bien compris comment fonctionnent les collider.
Voici le cas dans lequel je suis :
J'ai un characterController qui change sa hitbox en mode "Accroupi" quand j’appuie sur ctrl (En l'occurence elle devient plus petite, pour pouvoir passer en dessous d'un objet) et qui la remet en mode "Debout" quand je relâche contrôle.
Pour éviter de pouvoir se relever alors qu'on a un objet au dessus de la tête, j'ai eu l'idée de mettre un collider à la hauteur de la tête en position debout.
Et si il y a une collision, c'est qu'il y a quelque chose à la place de la tête, donc qu'on ne peut pas se lever.
Seulement je comprend pas très bien comment récupérer l'info de collision.
Je cherche à utiliser OnTriggerEnter() et OnTriggerExit() mais je vois pas comment elle fonctionnent, où les utiliser et comment.
Aussi, quelque chose qui reste un mystère pour moi :
Quelle est la différence entre faire ça :
Et ensuite glisser le componement dans l'inspector d'unity.
Et faire ça :
Pour ces colliders, il serait sans doute préférable de ne pas utiliser celui du personnage pour faire cette vérification de plafond, il a déjà d'autres choses à faire, tu peux par contre utiliser un autre collider taille "debout", constamment allumé, qui n'influe pas sur les collisions, et s'il détecte qu'il y a quelque chose au dessus du personnage, tu empèches la remise debout
Les fonctions OnTriggerEnter() et OnTriggerExit() sont des fonctions de monobehaviour, elles sont à surcharger, tu peux simplement les déclarer dans le corps d'un script attaché au même niveau que le collider, elles seront appelées comme par magie quand le collider détecte une collision et leur contenu exécuté.
"Quelle est la différence entre faire ça :
public type variable;
Et ensuite glisser le componement dans l'inspector d'unity.
Et faire ça :
type variable = getComponement<type>();"
Va faire le premier truc sur 10000 objets / frame, ou sur des composants dont tu ne connais pas à l'avance le type, ou simplement quand le jeu est déjà lancé, ou après avoir supprimé puis recréé le composant, etc, enfin c'est toute la limitation du drag&drop qu'on finit vite par rencontrer
Pourtant, je les déclare dans un script au même niveau que mon collider et elles ne sont visiblement pas appelées.
private BoxCollider HeadCollider; //Pour detecter s'il y a quelque chose au niveau de la tête
void Awake()
{
HeadCollider = GetComponent<BoxCollider>();
}
void onTriggerEnter(BoxCollider HeadCollider)
{
Debug.Log("Collision");
}
J'ai oublié quelque chose ?