2 votes

c# - boucle imbriquée pour des emplacements de téléportation aléatoires dans UNITY

J'essaie de téléporter un objet à différents endroits dans un ordre spécifique dans Unity, mais le système ne passe pas par la boucle imbriquée pour l'emplacement de téléportation suivant. J'ai préalloué les emplacements de téléportation dans un tableau 2d en m'attendant à ce que le système passe par le tableau 2d à travers la boucle imbriquée et déplace l'objet en conséquence, mais il ne fait que déplacer l'objet à l'emplacement SP3 sans tenir compte des éléments de l'index track_teleporation_index. Je suppose donc qu'il y a une erreur dans les instructions if-else if dans les boucles for imbriquées, mais en tant que débutant en codage et en Unity, je n'arrive pas à trouver la solution après des jours de dépannage.

Toute aide ou piste sera grandement appréciée !

Elle est mon code :

public class Teleporting : MonoBehaviour
{
    public GameObject mouse;
    public Transform SP1; //Starting Position in Track 1
    public Transform SP2; //Starting Position in Track 2
    public Transform SP3; //Starting Position in Track 3
    private int[,] track_teleportation_index;

    void OnTriggerEnter(Collider other)
    {
        mouse = GameObject.Find("mouse");

        track_teleportation_index = new int[3, 3] { { 1,2,3 }, { 3, 1, 2 }, { 1, 2, 3 } }; 

        for (int row = 0; row < track_teleportation_index.GetLength(0); row++)
            for (int col = 0; col < track_teleportation_index.GetLength(1); col++)
            {
                if (track_teleportation_index[row, col] == 1)
                {
                    mouse.transform.position = SP1.transform.position;
                }
                else if (track_teleportation_index[row, col] == 2)
                {
                    mouse.transform.position = SP2.transform.position;
                }
                else if (track_teleportation_index[row, col] == 3)
                {
                    mouse.transform.position = SP3.transform.position;
                }

                Debug.Log("Teleported to track #" + track_teleportation_index[row, col]);
            }
    }

}

1voto

derHugo Points 12631

Si je comprends bien, ce que vous voulez, c'est

  • la première fois que vous appuyez sur la gâchette -> passez au SP1
  • la deuxième fois que vous appuyez sur la gâchette -> passez au SP2
  • la troisième fois que vous appuyez sur la gâchette -> passez au SP3
  • la quatrième fois que vous appuyez sur la gâchette -> passez au SP1
  • etc.

Un seul compteur suffirait pour cela

// Simply reference as many target Transform as you need
public Transform[] SPS;

// index for the NEXT target
private int index;

void OnTriggerEnter(Collider other)
{
    // is the mouse not the same object that collides? 
    // in that case you would rather simply do
    //mouse = other.gameObject;
    mouse = GameObject.Find("mouse");

    // teleport to currently next target
    mouse.transform.position = SPS[index].position;

    Debug.Log("Teleported to track #" + SPS[index], SPS[index]);

    // Update to the next index, wrapping around at the end of array
    index = (index + 1) % SPS.Length;
}

0voto

Josh Heaps Points 77

Voici comment je procéderais pour parcourir chaque emplacement de votre tableau 2d, une fois à chaque fois OnTriggerEnter fonctionne. Cet exemple modifiera une grande partie de votre code, mais aura la fonctionnalité souhaitée. Je vais essayer d'expliquer ce qu'il fait et comment il fonctionne.

public class Teleporting : MonoBehaviour
{
    public GameObject mouse;

    /*
    * If you want just the three starting points, you would need to do
    * this where ever you are setting them now.
    *
    * StartingPoints.Add(StartingPointOne);
    * StartingPoints.Add(StartingPointTwo);
    * StartingPoints.Add(StartingPointThree);
    * 
    * Using a list makes it so you can add as many starting points as 
    * you would like, as well as cleans up the rest of the code a bit
    */
    public List<Transform> StartingPoints { get; set; } = new List<Transform>();
    private int[,] track_teleportation_index;

    // Don't mind the underscore. It's something I picked up from the Microsoft documentation. 
    // It doesn't change functionality
    private int _row; 
    private int _column;

    public Teleporting()
    {
        //Set these to zero when instantiating the class
        _row = 0; 
        _column = 0;

        //Set this in here to not make a new one every time the method is called
        track_teleportation_index = new int[3, 3] { { 1,2,3 }, { 3, 1, 2 }, { 1, 2, 3 } }; 
    }

    void OnTriggerEnter(Collider other)
    {
        mouse = GameObject.Find("mouse");

        // This code will move to the next position in your 2d array, 
        // regardless of the size of the array. This will only work
        // for a non null, 2d array.
        _row++;

        if (_row > track_teleportation_index.GetLength(0))
        {
            _row = 0;
            _column++;
        }

        if (_column > track_teleportation_index.GetLength(1))
        {
            _column = 0;
        }

        // Now get the starting point at the new location
        int desiredStartingPoint = track_teleportation_index[_row,_column];

        // Move mouse to the new location. If the desired starting point
        // equals three, then it will be set to the third element added
        // to the list.
        mouse.transform.position = StartingPoints[desiredStartingPoint];

        Debug.Log("Teleported to track #" + desiredStartingPoint);
    }

}

Edita:

Voici quelques précisions sur votre commentaire.

Pour ajouter de nouveaux points de départ à la List<Transform> Dans l'exemple ci-dessus, cette liste s'appelle StartingPoints vous utiliseriez l'option .Add() fonctionnalité des listes. Cela vous permet d'ajouter un nouveau Transform à la liste. En utilisant votre code et les modifications que j'ai apportées, voici comment je procéderais.

public List<Transform> StartingPoints { get; set; } = new List<Transform>();

public Transform SP1; //Starting Position in Track 1
public Transform SP2; //Starting Position in Track 2
public Transform SP3; //Starting Position in Track 3

public Teleporting()
{
    //Set these to zero when instantiating the class
    _row = 0; 
    _column = 0;

    //Set this in here to not make a new one every time the method is called
    track_teleportation_index = new int[3, 3] { { 1,2,3 }, { 3, 1, 2 }, { 1, 2, 3 } }; 

    StartingPoints.Add(SP1);
    StartingPoints.Add(SP2);
    StartingPoints.Add(SP3);
}

Cela rendra ces trois premiers points de départ accessibles. Vous pouvez ajouter d'autres points de départ à cette liste à partir de n'importe quelle classe ayant accès à la fonction Teleporting classe. Voici un exemple de ce à quoi cela pourrait ressembler :

public class MyClass
{

    public Teleporting teleporting = new Teleporting();

    public Transform SP1; //Starting Position in Track 1
    public Transform SP2; //Starting Position in Track 2
    public Transform SP3; //Starting Position in Track 3

    public AddStartingPoints()
    {
        teleporting.StartingPoints.Add(SP1);
        teleporting.StartingPoints.Add(SP2);
        teleporting.StartingPoints.Add(SP3);
    }
}

J'espère que cela vous aidera !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X