2017-09-07 2 views
0
private void MoveToNewFormation() 
    { 
     squadMembers = GameObject.FindGameObjectsWithTag("Squad Member"); 
     float step = speed * Time.deltaTime; 
     for (int i = 0; i < squadMembers.Length; i++) 
     { 
      squadMembers[i].transform.LookAt(newpos[i]); 
      squadMembers[i].transform.position = Vector3.MoveTowards(squadMembers[i].transform.position, newpos[i], step); 
      //squadMembers[i].transform.rotation = qua[i]; 
     } 
    } 

et de l'appeler dans la mise à jour:Comment puis-je vérifier quand l'objet MoveTowards a atteint la nouvelle position, puis le faire pivoter?

void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.F)) 
     { 
      ChangeFormation(); 
     } 

     if (move == true) 
      MoveToNewFormation(); 
    } 

Une fois que lorsque l'un des squadMembers atteint les newpos alors je veux faire

squadMembers[i].transform.rotation = qua[i]; 

condition est une liste et je veux tourner le membre de l'équipe une fois qu'il a atteint le newpos.

intérieur MoveToNewFormation i pensé à ajouter après la boucle de la ligne:

if (squadMembers[i].transform.position == newpos[i]) 
{ 
    squadMembers[i].transform.rotation = qua[i]; 
} 

Mais il est après la boucle si « i » existe pas.

Voici le script complet:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class SquadFormation : MonoBehaviour 
{ 
    enum Formation 
    { 
     Square, Circle, Triangle 
    } 

    public Transform squadMemeber; 
    public int columns = 4; 
    public int squareSpace = 10; 
    public int circleSpace = 40; 
    public int numberOfObjects = 20; 
    public float yOffset = 0; 
    public float speed = 3; 

    private Formation formation; 
    private GameObject[] squadMembers; 
    private List<Quaternion> qua = new List<Quaternion>(); 
    private List<Vector3> newpos = new List<Vector3>(); 
    private bool move = false; 

    // Use this for initialization 
    void Start() 
    { 
     formation = Formation.Square; 
     ChangeFormation(); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (Input.GetKeyDown(KeyCode.F)) 
     { 
      ChangeFormation(); 
     } 

     if (move == true) 
      MoveToNewFormation(); 
    } 

    private void ChangeFormation() 
    { 
     switch (formation) 
     { 
      case Formation.Square: 

       FormationSquare(); 

       break; 

      case Formation.Circle: 

       FormationCircle(); 

       break; 
     } 
    } 

    private Vector3 FormationSquarePositionCalculation(int index) // call this func for all your objects 
    { 
     float posX = (index % columns) * squareSpace; 
     float posY = (index/columns) * squareSpace; 
     return new Vector3(posX, posY); 
    } 

    private void FormationSquare() 
    { 
     for (int i = 0; i < numberOfObjects; i++) 
     { 
      Transform go = Instantiate(squadMemeber); 
      Vector3 pos = FormationSquarePositionCalculation(i); 
      go.position = new Vector3(transform.position.x + pos.x, 0, transform.position.y + pos.y); 
      go.Rotate(new Vector3(0, -90, 0)); 
      go.tag = "Squad Member"; 
     } 
     formation = Formation.Circle; 
    } 

    private Vector3 FormationCirclePositionCalculation(Vector3 center, float radius, int index, float angleIncrement) 
    { 
     float ang = index * angleIncrement; 
     Vector3 pos; 
     pos.x = center.x + radius * Mathf.Sin(ang * Mathf.Deg2Rad); 
     pos.z = center.z + radius * Mathf.Cos(ang * Mathf.Deg2Rad); 
     pos.y = center.y; 
     return pos; 
    } 

    private void FormationCircle() 
    {   
     Vector3 center = transform.position; 
     float radius = (float)circleSpace/2; 
     float angleIncrement = 360/(float)numberOfObjects; 

     for (int i = 0; i < numberOfObjects; i++) 
     { 
      Vector3 pos = FormationCirclePositionCalculation(center, radius, i, angleIncrement); 

      var rot = Quaternion.LookRotation(center - pos); 
      pos.y = Terrain.activeTerrain.SampleHeight(pos); 
      pos.y = pos.y + yOffset; 
      newpos.Add(pos); 
      qua.Add(rot); 
     } 
     move = true; 
     formation = Formation.Square; 
    } 

    private void MoveToNewFormation() 
    { 
     squadMembers = GameObject.FindGameObjectsWithTag("Squad Member"); 
     float step = speed * Time.deltaTime; 
     for (int i = 0; i < squadMembers.Length; i++) 
     { 
      squadMembers[i].transform.LookAt(newpos[i]); 
      squadMembers[i].transform.position = Vector3.MoveTowards(squadMembers[i].transform.position, newpos[i], step); 
      //squadMembers[i].transform.rotation = qua[i]; 
     } 

     //if (squadMembers[i].transform.position == newpos[i]) 
    }  
} 
+0

Etes-vous sûr sans fonction de rotation, votre code actuel fonctionne bien et votre passage d'une position à côté correctement? –

+0

@MohammadFaizanKhan oui ça fonctionne bien. Ils sont lookat et se déplaçant vers le droit newpos. –

+0

t-il que vous définissez déplacer variable? comme il commence à se déplacer, pouvez-vous partager plus de code –

Répondre

2

Vous pouvez utiliser un seuil et vérifier la distance en utilisant ce seuil. Définissez un seuil comme celui-ci au début du script.

public float threshold = 0.1f; 

changer ensuite la fonction MoveToNewFormation() comme ceci:

private void MoveToNewFormation() 
{ 
    squadMembers = GameObject.FindGameObjectsWithTag("Squad Member"); 
    float step = speed * Time.deltaTime; 
    for (int i = 0; i < squadMembers.Length; i++) 
    { 
     squadMembers[i].transform.LookAt(newpos[i]); 
     squadMembers[i].transform.position = 
     Vector3.MoveTowards(squadMembers[i].transform.position, newpos[i], step); 
     if(Vector3.Distance(squadMembers[i].transform.position,newpos[i])<threshold){ 
       squadMembers[i].transform.rotation = qua[i]; 
     } 
    } 

    //if (squadMembers[i].transform.position == newpos[i]) 
} 
+0

Et comment puis-je contrôler la vitesse de rotation sur la rotation? Je veux qu'ils tournent lentement chacun qui arrive à la position pour tourner lentement. –

+1

Vous pouvez utiliser Quaternion.Slerp https://docs.unity3d.com/ScriptReference/Quaternion.Slerp.html squadMembers [i] .transform.rotation = Quaternion.Slerp (squadMembers [i] .transform.rotation , qua [i], étape) – ZayedUpal