private void getReflectPath(Vector3 moveDir, float reflectDistance, List <HitPointInfo> pathList, LayerMask layerMask) { pathList.Clear(); Vector3 startPos = currentBall.transform.position; HitPointInfo startHitInfo = new HitPointInfo(startPos, null); pathList.Add(startHitInfo); while (reflectDistance > 0) { RaycastHit raycastHit; if (!Physics.Raycast(startPos, moveDir, out raycastHit, reflectDistance, layerMask)) { break; } HitPointInfo hitPointInfo = new HitPointInfo(raycastHit.point, raycastHit.collider.GetComponent <IGameObject> ()); pathList.Add(hitPointInfo); reflectDistance -= (raycastHit.point - startPos).magnitude; startPos = raycastHit.point; moveDir = Vector3.Reflect(moveDir, raycastHit.normal); } if (reflectDistance > 0) { Vector3 endPoint = startPos + moveDir * reflectDistance; HitPointInfo endHitInfo = new HitPointInfo(endPoint, null); pathList.Add(endHitInfo); } }
private void ballMove(float dt) { if (this.curPathList.Count <= 0) { return; } // 到达路径终点 if (pointIndex >= this.curPathList.Count) { return; } HitPointInfo targetHitInfo = this.curPathList[pointIndex]; Vector3 targetPos = targetHitInfo.hitPos; Vector3 targetVec = targetPos - currentBall.transform.position; Vector3 targetDir = targetVec.normalized; if (targetVec.magnitude < 0.3) { pointIndex++; this.currentBall.colliderEnter(targetHitInfo.hitObstacle); if (pointIndex >= this.curPathList.Count) { // 重新产生路径 this.getReflectPath(targetDir, ConstValue.reflectDis, this.curPathList, this.layerMask); this.pointIndex = 1; } } currentBall.transform.Translate(targetDir * ConstValue.ballMoveSpeed * dt); }