统一5.4设置目的地;只能在活动代理上调用,实例化时目的地错误
本文关键字:目的地 调用 代理 活动 实例化 错误 设置 统一 | 更新日期: 2023-09-27 18:09:52
我正在尝试生成士兵,并通过鼠标点击导航网格将他们移动为一个团。但是我得到了"设置目的地"只能在活动代理上调用"的错误。我在论坛上看到,这可能是由实例化到高或低从导航网格造成的。但无论我把生成点放在y轴上,都没有变化。我通常在Y = 0时生成它们,似乎Unity在实例化时自动将我的预制克隆设置为Y = 0.303……我不知道为什么。在场景视图中,我无法在运行时平移y轴上的士兵。发生的另一件"有趣"的事情是,即使我在Awake上调用getComponent,我也会为navmesh代理获得未分配的引用异常。我必须在一个单独的函数中调用它,使其分别工作以到达"设置目的地"错误。
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
}
}
}
}
我在试图实例化用于克隆的隐藏gui元素时遇到了这个问题。
问题是GetComponent找不到非活动游戏对象的组件。如果你想找到一个不活动的游戏对象,你必须调用GetComponentsInChildren<NavMeshAgent>(true);
Like,
nav = GetComponentsInChildren<NavMeshAgent>(true);
请注意,true参数用于查找非活动对象。其他用于查找非活动对象的GetComponent方法现在已经过时了。
你可能需要为非活动的gameobjects设置父对象,然后调用GetComponentsInChildren<NavMeshAgent>(true);
Like,
nav = GameObject.Find("Parent").GetComponentsInChildren<NavMeshAgent>(true);
参见参考文献。https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html
你应该在窗口中打开导航,然后选择平面和烘焙。你会看到它变成蓝色,这意味着你的士兵可以用navmeshaagent在上面行走。希望对你有用。