2016-11-16 4 views
0

Je travaille dans un environnement 3D, une maison de 16 pièces. Dans chaque pièce j'ai placé un cube invisible avec une étiquette appelée "RoomsToScanTag". Je travaille avec un asset appelé Behaviour Designer, et dans mon inspecteur j'ai donné la variable à rechercher (dans ce cas "RoomsToScanTag"). Avec cette variable, je veux que le robot se rende d'abord dans la pièce 1, puis continue dans la pièce 2, jusqu'à la pièce 16.C# - Unity - Le script de mouvement ne bouge pas correctement

C'est mon code

using UnityEngine; 
using BehaviorDesigner.Runtime; 
using BehaviorDesigner.Runtime.Tasks; 

public class MoveTowardsNew : Action 
{ 
    private Transform[] roomsToScanHAHA; 
    public string targetTagRooms; 
    public Transform targetyo; 
    int controlNumber = 0; 

    public string MessageToConsole; 

    public override void OnAwake() 
    { 
     var targets = GameObject.FindGameObjectsWithTag (targetTagRooms); 
     roomsToScanHAHA = new Transform[targets.Length]; 
     for (int i = 0; i < targets.Length; i++) 
     { 
      roomsToScanHAHA [i] = targets [i].transform; 
     } 
    } 

    public override TaskStatus OnUpdate() 
    { 
     while (controlNumber < roomsToScanHAHA.Length) 
     { 
      targetyo = roomsToScanHAHA [controlNumber]; 
      if (Vector3.SqrMagnitude (transform.position - targetyo.position) < 0.5f) 
      { 
       Debug.Log (MessageToConsole); 
       return TaskStatus.Success; 
      } 
      controlNumber++; 
     } 
     NavMeshAgent agent = GetComponent<NavMeshAgent>(); 
     agent.destination = targetyo.position; 
     return TaskStatus.Running; 
    } 
} 

Ceci est mon problème

Il se déplace, mais en quelque sorte qu'il se déplace pas ROOM1 FIRST, mais il semble être obsédé par room4. Je n'ai pas d'idées pourquoi c'est comme ça. Je veux aller à room1 d'abord, puis room2, etc, etc.

EDIT

CH1 est le plus proche du robot, room4 est assez loin.

EDIT 2

J'ai oublié d'ajouter que je sais où est le problème ... Il est à cause du tri du tableau. En ce moment, il est rempli avec des valeurs de transformation, et room4 arrive à être le premier dans ce tableau. J'ai besoin du tableau pour trier basé sur le nom GameObject, mais je ne sais pas comment faire cela. Des conseils?

EDIT 3

using UnityEngine; 
using BehaviorDesigner.Runtime; 
using BehaviorDesigner.Runtime.Tasks; 

public class MoveTowardsNew : Action 
{ 
    private Transform[] roomsToScanHAHA; 
    public string targetTagRooms; 
    public Transform targetyo; 
    int controlNumber = 0; 

    public string MessageToConsole; 

    public override void OnAwake() 
    { 
     var targets = GameObject.FindGameObjectsWithTag (targetTagRooms); 
     roomsToScanHAHA = new Transform[targets.Length]; 
     for (int i = 0; i < targets.Length; i++) 
     { 
      roomsToScanHAHA [i] = targets [i].transform; 
     } 
     Array.Sort(roomsToScanHAHA , 
      delegate(Transform x, Transform y) 
      { 
       return x.gameObject.name.CompareTo(y.gameObject.name); 
      }); 
    } 

    public override TaskStatus OnUpdate() 
    { 
     while (controlNumber < roomsToScanHAHA.Length) 
     { 
      targetyo = roomsToScanHAHA [controlNumber]; 
      if (Vector3.SqrMagnitude (transform.position - targetyo.position) < 0.5f) 
      { 
       Debug.Log (MessageToConsole); 
       return TaskStatus.Success; 
      } 
      controlNumber++; 
     } 
     NavMeshAgent agent = GetComponent<NavMeshAgent>(); 
     agent.destination = targetyo.position; 
     return TaskStatus.Running; 
    } 
} 

Ici, le Array.Sort est rouge et renvoie l'erreur suivante:

Assets/MoveTowardsNew.cs(22,17): error CS0103: The name `Array' does not exist in the current context 

Merci à l'avance!

Répondre

1

Ajouter ce code dans OnAwake() à la fin:

Array.Sort(roomsToScanHAHA , 
    delegate(Transform x, Transform y) 
    { 
     return x.gameObject.name.CompareTo(y.gameObject.name); 
    }); 

Laissez-moi savoir si cela fonctionne. (C'est l'un des many ways pour trier un tableau)

+0

Merci pour la réponse rapide, mais cela ne fonctionne pas. Il donne une couleur rouge. Cela fonctionne quand j'inclus la balise 'Using Systems;', mais alors mon 'transform' ne fonctionne pas. – JuliusSecret

+0

que voulez-vous dire mais * ma transformation ne fonctionne pas *? –

+0

lorsque j'utilise la fonction 'Using Systems;', le transform.position obtient une couleur rouge, ce qui signifie qu'il ne fonctionne plus. – JuliusSecret