要实现的功能就是 : 得到这个点上最高的cube的位置。然后可以放新的cube在上面。(也就是如果射线碰撞到了cube,则会继续向上发射射线直到上方没有cube为止),然后会返回当前最高cube的位置。
因为是实时检测,需要在update中调用,但是这样的话就会陷入死循环,一个点这一帧检测到最高时,返回了false值,下一帧又会重新检测。所以就退不出来循环了。
该如何实现一个点只向上检测一次的功能。(点是变换的,不是固定点。)
下面是实现代码:
private void Start() { CheckCubePosition(Vector3.zero); } private Vector3 CheckCubePosition(Vector3 rayPosition) { Vector3 targetPosition = rayPosition; bool hitcube = true; while (hitcube) { hitcube = RayUpwards(targetPosition, out targetPosition); } return targetPosition; } private bool RayUpwards(Vector3 rayPosition,out Vector3 hitPosition) { bool hitCube = false; hitPosition = rayPosition; RaycastHit hit; Ray ray=new Ray(rayPosition,Vector3.up); if (Physics.Raycast(ray, out hit)) { if (hit.collider.CompareTag("Cube")) { hitCube = true; hitPosition = hit.point; Debug.Log(hitPosition); } } return hitCube; }
这里只是在Start中实现的,检测的初始点是坐标原点。各个cube的位置是(0,1,0)(0,3,0)(0,5,0)所以只调用了一次,在update中会一直调用,因为没有限制条件,会重复调用无限次。
代码应该没有问题的,就是想问问逻辑问题:
我该如何让它在update中调用且随机到任何点只去检测一次最高点的位置呢 ?(必须要实时检测任意点的最高点位置哈)
重点就是 任何点的检测都只去调用一次CheckCubePosition,而不会反复调用