本文根据油管作者EYEmaginary原视频创作,视频地址是Car AI Tutorial #1 (Unity 5 ) - Make the Path - YouTube
本文主要做的是对视频中的内容进行分析和讲解,且本文和上篇文章息息相关,如果直接看这一篇可能会有某些变量让你陌生,但是你可以从中学到思路。同时强烈建议如果各位有时间请去看原视频。以下内容如有错误请留言评论,欢迎理性讨论。
承接上文,下面来为汽车制作传感器来让汽车实现避障的功能。
实际上汽车的避障也不一定要使用这种方法,很多人一想到避障就会想到使用导航组件,我刚开始也是这么想的,但是使用传感器做避障也为各位提供了一种新的思路,不只是避障,利用该方法也许可以实现更多的功能。
原理讲解

如图所示,传感器就是在车的前方的五个位置发射射线,如果射线击中了某物,那么就判定前方有障碍物,从而做出一些逻辑语句让车辆进行避障。
传感器的位置确定
首先创建的是A传感器的位置,然后根据偏移计算左右传感器的位置。这里有个方法,首先将汽车模型的位置放在原点处,然后创建一个cube,将该cube放在中间传感器的位置,这样cube的位置就是A传感器相对于汽车位置的偏移量。如下图所示

可以看到这里的cube的位置是(-0.025,1.15,2.7),那么偏移量也就是这个数。同样的方法可以计算出传感器D,E距离A的长度,我这里是1.125,借此继续编辑CarEngine脚本(上一篇文章中的脚本)。
传感器的创建
有了偏移位置,接下来来创建传感器,脚本内容如下
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CarEngine : MonoBehaviour
{
//.....
//传感器部分
public float sensorLength; //传感器能够检测的长度
//传感器A相对于车辆的偏移
private Vector3 frontSensorPosition = new Vecotr3(-0.025f,1.15f,2.7f);
//传感器D,E相较于Z轴的偏移角度
private float frontSensorAngle = 30f;
private void FixedUpdate()
{
//....
Sensors();
}
private void Sensors()
{
Vector3 sensorStartPos = transform.position;
//同步汽车和传感器的位置,也就是说当汽车移动时传感器的位置也要改变
sensorStartPos +=transform.forward * frontSensorPosition.z;
sensorStartPos +=transform.up * frontSensorPosition.y;
sensorStartPos +=transform.right * frontSensorPosition.x;
RaycastHit hit;
//传感器A
if(Physics.Raycast(sensorStartPos, transform.forward, out hit, sensorLength))
{
Debug.DrawLine(sensorStartPos, hit.point, Color.white);
}
//传感器C
//传感器C相对于A的偏移量为X轴的1.125
sensorStartPos += transform.right * 1.125f;
if(Physics.Raycast(sensorStartPos, transform.forward, out hit, sensorLength))
{
Debug.DrawLine(sensorStartPos, hit.point, Color.white);
}
//传感器E
//E的射线发射方向改变了
if(Physics.Raycast(sensorStartPos,
Quaternion.AngleAxis(frontSensorAngle,transform.up) *
transform.forward, out hit, sensorLength))
{
Debug.DrawLine(sensorStartPos, hit.point,Color.white);
}
//传感器B
sensorStartPos -= transform.right * 2.25f;
if(Physics.Ra

最低0.47元/天 解锁文章
2590

被折叠的 条评论
为什么被折叠?



