上一节中实现了圆形机器人到达指定目标物体时,和目标物体打个招呼。实际情况是一个环境中会有很多物体,在出发前做一次整体扫描,了解环境中的整体物体数量和物体名称。我们随机做一下巡检,让物体在出发后按照扫描出来的顺序进行分析,逐一到达各个物体前。
下图圆形机器人位于环境中间偏左的位置。
从左侧列表中查看有14个物体是有效的,除去圆形机器人本身,需要扫描13个物体,并逐一到达他们跟前。
上代码菜,
public class AutoKnowObject : MonoBehaviour
{
GameObject my;
GameObject will;
GameObject[] GameObjectAll;
// Start is called before the first frame update
float ObjectsNum = 0;//全物体数量
float goalNum = 1;//目标物体数量
void Start()
{
//找出所有物体对象
GameObjectAll = AutoKnowObjectsAll();
//Debug.Log(MyObjectName().name);
}
// Update is called once per frame
void Update()
{
//移至各个物体处
// foreach (GameObject go in GameObjectAll)
//{
//Debug.Log("GameObject name is " + go.name);
// Debug.Log(go.name + "'s position is " + AutoKnowObjectsPosion(go));
// will = GameObject.Find("Square");
my = MyObjectName();
Debug.Log("myObject name is " + my.name + " and my position is " + AutoKnowObjectsPosion(my));
//will = go;
if ((int)ObjectsNum < AutoKnowObjectsNum())
{
will = GameObjectAll[(int)ObjectsNum];
Debug.Log("willObject name is " + will.name +" and its position is " + AutoKnowObjectsPosion(will));
if (my.name != will.name)
{
Debug.Log("goalObject name is " + will.name + " and " + will.name + " 's position is " + AutoKnowObjectsPosion(will));
Debug.Log("Now goal numbers is " + goalNum + "个");
AutoMoveToObjects(my, (float)0.5, will);
if (A2B(my, will).sqrMagnitude < 1)//到达目标物位置处
{
Debug.Log(my.name + " comes to " + will.name + " 's position.");
ObjectsNum = ObjectsNum + 1;
goalNum += 1;
Debug.Log("Now new goal numbers is " + goalNum + "个");
}
}
else
{
ObjectsNum = ObjectsNum + 1;
}
}
else {
Debug.Log("myObject name is " + my.name + " and my search is finished. " );
}
// }
}
//4-1.寻找所有物体
GameObject[] AutoKnowObjectsAll()
{
// float ObjectsNum = 0;
//寻找区域内的对象
GameObject[] bodies = FindObjectsOfType(typeof(GameObject)) as GameObject[];
return bodies;
}
//4-2 寻找所有物体数量
int AutoKnowObjectsNum()
{
// float ObjectsNum = 0;
//寻找区域内的对象
GameObject[] bodies = FindObjectsOfType(typeof(GameObject)) as GameObject[];
return bodies.Length;
}
}
机器人逐一到达各物体处,
完成巡逻任务如下图所示。
简单总结一下,本节是对圆形机器人巡检的情况做了实现。各个物体暂时均不具备刚体属性,如果各物体具备了刚体属性,同时中间如果设置障碍物的话,则不能直接走直线到达障碍物跟前,需要寻路算法。在寻路算法的基础上,可以产生最优路径解。