Unity 中的避障,使用光线投射。 C#
Obstacle Avoidance in Unity, using raycasts. C#
我正在使用一些基本的避障算法来避开障碍物,但是左右传感器出现问题。当两者都活跃时。他们将取消轮换,根本不轮换。通过前传感器计算 hit.normals 也有点麻烦。
ray = new Ray(transform.position + Vector3.up, transform.forward);
Vector3 posInicial = transform.position;
if (Physics.Raycast(ray, out hit, 55f)) // Front sensor
{
if (hit.collider.tag == ("Pick Up")) // If robot detects pick up, it goes towards it
{
Debug.DrawLine(ray.origin, hit.point, Color.red);
transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.deltaTime * speed);
}
else
{
transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate if front sensor doesn't detect pick up
Debug.DrawLine(ray.origin, hit.point, Color.blue);
}
}
else
{
transform.position += transform.forward * speed * Time.deltaTime; // Go forward
Debug.DrawLine(ray.origin, hit.point, Color.white);
}
if (Physics.Raycast(posInicial, Quaternion.AngleAxis(45f, transform.up) * transform.forward, out hit2, 20f))
{
transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate left if right detected
Debug.DrawLine(posInicial, hit2.point, Color.yellow);
}
if (Physics.Raycast(posInicial, Quaternion.AngleAxis(-45f, transform.up) * transform.forward, out hit3, 20f))
{
transform.Rotate(0, 80 * Time.deltaTime, 0); // rotate right if detected left
Debug.DrawLine(posInicial, hit3.point, Color.cyan);
}
}
我不确定你为什么要尝试自己实现它。如果是因为你对算法感兴趣,想把它外推到未来的现实世界,那也没关系。
但为了以防万一,Unity 中已经有一个叫做 NavMesh 的东西,它基本上为游戏对象(例如敌人)提供了 AI,这使得它们能够识别障碍物,以便在场景中从一个点移动到另一个点时避开它们.
- Select 应该影响导航的场景几何 - walkable
表面和障碍物。
- 选中导航静态以在
NavMesh烘焙过程。
- 调整烘焙设置以匹配您的代理大小。
- 点击烘焙构建 NavMesh
烘焙场景后,您可以将导航网格添加到游戏对象:
public class EnemyMovement : MonoBehaviour
{
NavMeshAgent nav;
function Awake ()
{
nav = GetComponent(NavMeshAgent);
}
//So here it will be chasing the player
function Update ()
{
nav.SetDestination (player.position);
}
}
我正在使用一些基本的避障算法来避开障碍物,但是左右传感器出现问题。当两者都活跃时。他们将取消轮换,根本不轮换。通过前传感器计算 hit.normals 也有点麻烦。
ray = new Ray(transform.position + Vector3.up, transform.forward);
Vector3 posInicial = transform.position;
if (Physics.Raycast(ray, out hit, 55f)) // Front sensor
{
if (hit.collider.tag == ("Pick Up")) // If robot detects pick up, it goes towards it
{
Debug.DrawLine(ray.origin, hit.point, Color.red);
transform.position = Vector3.MoveTowards(transform.position, hit.point, Time.deltaTime * speed);
}
else
{
transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate if front sensor doesn't detect pick up
Debug.DrawLine(ray.origin, hit.point, Color.blue);
}
}
else
{
transform.position += transform.forward * speed * Time.deltaTime; // Go forward
Debug.DrawLine(ray.origin, hit.point, Color.white);
}
if (Physics.Raycast(posInicial, Quaternion.AngleAxis(45f, transform.up) * transform.forward, out hit2, 20f))
{
transform.Rotate(0, -80 * Time.deltaTime, 0); // Rotate left if right detected
Debug.DrawLine(posInicial, hit2.point, Color.yellow);
}
if (Physics.Raycast(posInicial, Quaternion.AngleAxis(-45f, transform.up) * transform.forward, out hit3, 20f))
{
transform.Rotate(0, 80 * Time.deltaTime, 0); // rotate right if detected left
Debug.DrawLine(posInicial, hit3.point, Color.cyan);
}
}
我不确定你为什么要尝试自己实现它。如果是因为你对算法感兴趣,想把它外推到未来的现实世界,那也没关系。
但为了以防万一,Unity 中已经有一个叫做 NavMesh 的东西,它基本上为游戏对象(例如敌人)提供了 AI,这使得它们能够识别障碍物,以便在场景中从一个点移动到另一个点时避开它们.
- Select 应该影响导航的场景几何 - walkable 表面和障碍物。
- 选中导航静态以在 NavMesh烘焙过程。
- 调整烘焙设置以匹配您的代理大小。
- 点击烘焙构建 NavMesh
烘焙场景后,您可以将导航网格添加到游戏对象:
public class EnemyMovement : MonoBehaviour
{
NavMeshAgent nav;
function Awake ()
{
nav = GetComponent(NavMeshAgent);
}
//So here it will be chasing the player
function Update ()
{
nav.SetDestination (player.position);
}
}