统一使用图层蒙版临时忽略光线投射
问题描述:
我已经阅读了其他问题,并没有解决我的问题。我正在制作一个AI,如果AI靠近玩家就会退回[如果光线击中某个距离,光线会转换为布尔值],但是因为这是更新函数,所以光线会更新每一帧,并且然后当我不需要它时切换布尔值,因为我已经启动了使AI返回的代码,请有人告诉我如何使用图层蒙版临时停止射线投射,当'avoid'布尔是当AI向后移动时,光线投射被忽略,代码;统一使用图层蒙版临时忽略光线投射
void Update()
{
//raycasting
RaycastHit hit;
Ray ray = new Ray(transform.position, Vector3.forward);
//check if raycast hit player
if (Physics.Raycast(ray, out hit, 2))
{
if (hit.collider.tag == "PlayerFront")
{
avoid = true;
movementSpeed = 0;
}
}
else
{
movementSpeed = 2f;
avoid = false;
}
if (avoid == true)
{
startPos = enemy.transform.position;
endPos = enemy.transform.position + Vector3.back * distance;
currentLerpTime += Time.deltaTime;
if (currentLerpTime >= lerpTime)
{
currentLerpTime = lerpTime;
}
float perc = currentLerpTime/lerpTime;
enemy.transform.position = Vector3.Lerp(startPos, endPos, perc);
avoidCount+=1;
avoid = false;
}
else if (avoid == false)
{
transform.LookAt(target);
transform.Translate(Vector3.forward * Time.deltaTime * movementSpeed);
currentLerpTime = 0;
}
}
答
我的建议是把if (Physics.Raycast...
块else
块内部在你的代码的底部。 (请注意,else if (avoid == false)
是多余的,因为没有其他价值avoid
可能是,如果它不是true
。
这将意味着你只光线投射时,你是不是已经避免,这将完成你问什么,也更高性能。
然而,这也是值得注意的是,您的代码当前设置avoid = false
在if
块 - 所以你目前只避免在同一时间一帧你可以或许考虑找一个方式离开avoid
作为true
了更长的时间。
你为什么认为你应该使用图层遮罩? “避免==真实”时,仅仅不进行光线投射并不容易? –
您可以选择完成此操作:状态机,使用“IF(false == avoid)”语句等封装调用... RayCast是相当昂贵的操作。 – Cabrra