0

兵士をスポーンし、ナビ メッシュをマウスでクリックして連隊として移動させようとしています。しかし、「「宛先の設定」はアクティブなエージェントでのみ呼び出すことができます」というエラーが表示されます。これは、ナビゲーション メッシュから高または低にインスタンス化することによって引き起こされる可能性があることをフォーラムで読みました。しかし、y 軸上にスポーンポイントをどこに置いても、何も変わりません。私は通常 Y = 0 でそれらをスポーンします。Unity は、インスタンス化するときに私のプレハブ クローンを自動的に y = 0.303 に設定するようです...理由はわかりません。シーン ビューで実行時に y 軸の兵士を移動できません。もう 1 つの「楽しい」ことは、Awake で getComponent を呼び出しても、nav Mesh エージェントの割り当てられていない参照例外が発生することです。「宛先の設定」エラーに到達するには、別の関数で呼び出す必要があります。

public class Move : MonoBehaviour
{
    private Ray _ray;
    private RaycastHit hit;
    private float raycastLength = 1000.0f;
    private UnitMove nav;

    public static List<GameObject> selectedUnits = new List<GameObject>();

    void Update ()
    {
        _ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Input.GetMouseButtonDown(0))
        {
            if (Physics.Raycast(_ray, out hit, raycastLength))
            {
                MoveRegiment(hit.point);
            }
        }
    }

    void MoveRegiment(Vector3 moveToPos)
    {
        foreach (GameObject go in selectedUnits)
        {      
            nav = go.GetComponent<UnitMove>();
            nav.setNav();
            nav.MovetoNav(moveToPos.x, moveToPos.y, moveToPos.z);
        } 
    }
}

public class UnitMove : MonoBehaviour
{
    private NavMeshAgent nav;
    public int xPos { get; set; }
    public int yPos { get; set; }

    void Awake()
    {
      nav = GetComponent<NavMeshAgent>(); //does not work...
    }

   public void setNav()
    {
        nav = GetComponent<NavMeshAgent>();
    }
   public void MovetoNav(float x, float y, float z)
    {
        nav.SetDestination(new Vector3(x , y, z));
    }
}
public class RegimentSpwan : MonoBehaviour
{
    public Text row;
    public Text unitAmmount;
    public GameObject Unit;

    private GameObject _newGO;
    private Vector3 pos;

    public void OnclickNewRegiment()
    {
        DestroyImmediate(GameObject.Find("Regiment"));

        _newGO = new GameObject("Regiment");
        Instantiate(_newGO, this.transform.position, Quaternion.identity);

        for (int i = 0; i < Convert.ToInt16(row.text); i++)
        {
            for (int j = 0; j < Convert.ToInt16(unitAmmount.text); j++)
            {
                Debug.Log(this.transform.position.y); //is zero
                Unit.name = "Unit_" + i + "_" + j;
                pos = new Vector3(this.transform.position.x + j * 2,this.transform.position.y, this.transform.position.z + i * 2);
                Instantiate(Unit, pos, Quaternion.identity, _newGO.transform);
                Move.selectedUnits.Add(Unit); //list of gameobjects

            }
        }

    }
}
4

2 に答える 2

0

クローン作成のために非表示の GUI 要素をインスタンス化しようとしたときに、この問題が発生しました。

問題は、GetComponent が非アクティブなゲームオブジェクトのコンポーネントを見つけられないことです。非アクティブなゲームオブジェクトを見つけたい場合は、GetComponentsInChildren<NavMeshAgent>(true);Like を呼び出す必要があります。

nav = GetComponentsInChildren<NavMeshAgent>(true);

true パラメータは、非アクティブなオブジェクトを見つけるためのものであることに注意してください。非アクティブなオブジェクトを見つけるための他の GetComponent メソッドは廃止されました。

GetComponentsInChildren<NavMeshAgent>(true);非アクティブなゲームオブジェクトを親にしてから、 Likeを呼び出す必要がある場合があります。

nav = GameObject.Find("Parent").GetComponentsInChildren<NavMeshAgent>(true);

参照を参照してください。https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html

于 2016-10-01T16:56:00.233 に答える
0

Window で Navigation を開き、飛行機を選択して Bake します。飛行機が青色に変わります。これは、navmeshagent を使用している兵士がその上を歩くことができることを意味します。それが役に立ったことを願っています。

于 2016-10-02T02:49:50.137 に答える