2017-09-07 9 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]; 
     } 
    } 

および更新でそれを呼び出す:オブジェクトのMoveTowardsが新しい位置に到達して回転したことを確認するにはどうすればよいですか?

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

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

一度newposに達しsquadMembersの一つは、私は

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

資格が一覧であると私は回転したいをしたいとき彼がnewposに到着したら、チームメンバー。

インサイドMoveToNewFormation私はループの後の行を追加するために考えた:

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

をしかし、「私は」が存在しないので、それはループの後です。

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

をあなたはローテーション機能せずに、あなたの現在のコードが正常に動作していると、あなたは、次の正しく1つの位置からずらしますか? –

+0

@MohammadFaizanKhanはい、うまくいきます。彼らは見張っており、正しいnewposに移動しています。 –

+0

移動変数を設定していますか?それが移動を開始すると、より多くのコードを共有することができます –

答えて

2

あなたは、しきい値を使用し、そのしきい値を使用して距離を確認することができます。

これは完全なスクリプトです。 スクリプトの開始時にこのようにしきい値を定義します。

public float threshold = 0.1f; 

次に、このようなMoveToNewFormation()関数を変更します。

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

そして、どのように回転の回転速度を制御できますか?私は彼らがゆっくりと回転する位置になっているそれぞれを遅く回転させたい。 –

+1

Quaternion.Slerpを使用することができますhttps://docs.unity3d.com/ScriptReference/Quaternion.Slerp.html このように: squadMembers [i] .transform.rotation = Quaternion.Slerp(squadMembers [i] .transform.rotation 、qua [i]、step) – ZayedUpal

関連する問題