C# - Problème pour contrôler l'offset d'un prefab

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Halaran
Messages : 2
Inscription : 07 Nov 2016 01:03

C# - Problème pour contrôler l'offset d'un prefab

Message par Halaran » 05 Jan 2017 19:29

Bonsoir à tous,

Je travail actuellement sur un platformer en 3D en C# sur Unity pour mes études,
et depuis un moment je coinces sur l'instantiate d'un de mes prefabs.

J'ai modélisé un canon pour un robot et je souhaite qu'il se positionne sur son bras lors du spawn.

Pour ce faire, j'ai demandé dans le script que le clone du prefab spawn entant que child du bras du robot.
Jusqu'ici, tout fonctionne. Mais lorsque je veux changer les paramètres d'offset (Vector3)
pour le positionnement et la rotation, j'ai beau modifier les valeurs dans Unity, le prefab reste
dans sa position initiale tout en suivant le robot... Ce qui est plutôt drôle à voir.

Voici mon script :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PowersKit : MonoBehaviour
{
    public GameObject PowersKitRef;
    public GameObject RobotSlot;

    public Vector3 KitOffset;
    public Vector3 KitRotation;
    
    public string activatePower;
    
    private bool canActivate = false;

    private Transform parentObject;

   
    void Update()
    {
        ActivateKit();
    }
    
    void ActivateKit()
    {
        if ((canActivate = true) && (Input.GetKeyDown(KeyCode.E)))
        {
            RobotSlot = Instantiate(PowersKitRef, transform.position + KitOffset, Quaternion.Euler(KitRotation)) as GameObject;
            RobotSlot.transform.parent = GameObject.Find("RightArm").transform;
        }
    }
Une capture de ma scène Unity avec l'utilisation du script (Powers Kit) :

Image

Quelqu'un pourrait t-il m'expliquer mon erreur, car là je vous avoue être un peu démoralisé,
j'ai cherché pendant un bon moment... :/

Merci d'avance pour vos réponses,
Belle soirée.
Dernière édition par Halaran le 05 Jan 2017 20:46, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: C# - Problème pour contrôler l'offset d'un prefab

Message par boubouk50 » 06 Jan 2017 10:38

Il faut lui définir une position après le parentage. Ici, tu l'instancies dans le World en le plaçant à l'endroit de l'objet qui possède le script + KitOffset -> Cette position n'est pas dépendante du bras auquel tu l'attaches, donc il ne peut pas être bien positionné.
Il te faut réinitialiser son transform après l'avoir lié au bras.
Aussi, évite d'utiliser un Find() pour aller chercher tout le temps le même objet, fais-le une bonne fois au Start () et stocke-le plutôt.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: C# - Problème pour contrôler l'offset d'un prefab

Message par Moi 1971 » 06 Jan 2017 11:39

Et il faut aussi corriger le code :

Code : Tout sélectionner

void ActivateKit()
    {
        if ((canActivate = true) && (Input.GetKeyDown(KeyCode.E)))
(canActivate = true) !!!!
Il faut écrire :

Code : Tout sélectionner

void ActivateKit()
    {
        if (canActivate  && (Input.GetKeyDown(KeyCode.E)))

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: C# - Problème pour contrôler l'offset d'un prefab

Message par boubouk50 » 06 Jan 2017 12:03

Arf oui, pas vu ça. Attention aux comparaisons et à l'affectation!
A noter aussi que Input.GetKeyDown(KeyCode.E) ne vaudrait true uniquement sur la frame où l'utilisateur appui sur la touche. Ce qui risque d'être difficile à réaliser. Peut-être souhaites-tu utiliser Input.GetKey (KeyCode.E)? (Qui vaut true tant que la touche est appuyée) Si c'est le cas, fait attention à ce que la fonction ActivateKit () ne soit appelée en boucle.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »