/// <summary> /// Using Raycasts to gather information about surrounding environment. /// </summary> private bool UpdateHits(ref List <RaycastHit> hits) { //Check for collision under the player if (RayHelper.Raycast(transform, RayDownLeftProperties, out var rightHitInfo, GroundLayer) && RayHelper.Raycast(transform, RayDownRightProperties, out var leftHitInfo, GroundLayer)) { hits.Add(leftHitInfo); hits.Add(rightHitInfo); //Raycast to right only active if player is moving to the right if (MoveDirection.x > 0) { if (RayHelper.Raycast(transform, RayRightProperties, out var rightHit, GroundLayer)) { hits.Add(rightHit); } } //Raycast to left only active if player is moving to the left if (MoveDirection.x < 0) { if (RayHelper.Raycast(transform, RayLeftProperties, out var leftHit, GroundLayer)) { hits.Add(leftHit); } } return(true); } return(false); }
void Start() { SkipPlayerMask = RayHelper.allButLayerMask("Player"); _rigidbody = GetComponent <Rigidbody>(); }
public void GetMouseOverObject() { if (World == null) { return; } float radius = 5.5f; MouseOverObject final = new MouseOverObject(); float dist = float.MaxValue; Vector3 camPos = Vector3.One * 0.5f + Camera.Pos; var air = BlockRegistry.GetBlock <BlockAir>(); for (float z = -radius; z <= radius; z++) { for (float y = -radius; y <= radius; y++) { for (float x = -radius; x <= radius; x++) { Vector3 vec = camPos; vec.X += x; vec.Y += y; vec.Z += z; float f = (vec - Camera.Pos).LengthFast; if (f <= radius + 0.5f) { BlockPos pos = new BlockPos(vec); BlockState state = World.GetBlockState(pos); if (state.Block != air) { AxisAlignedBb bb = state.Block.BoundingBox.Offset(pos.ToVec()); bool hitSomething = RayHelper.RayIntersectsBB(Camera.Pos, Camera.GetLookVec(), bb, out Vector3 hitPos, out Vector3 normal); if (hitSomething) { FaceSides sideHit = FaceSides.Null; if (normal.X < 0) { sideHit = FaceSides.West; } else if (normal.X > 0) { sideHit = FaceSides.East; } if (normal.Y < 0) { sideHit = FaceSides.Down; } else if (normal.Y > 0) { sideHit = FaceSides.Up; } if (normal.Z < 0) { sideHit = FaceSides.North; } else if (normal.Z > 0) { sideHit = FaceSides.South; } BlockPos p = new BlockPos(hitPos - normal * bb.Size / 2); if (sideHit == FaceSides.Null) { continue; } float l = Math.Abs((Camera.Pos - (p.ToVec() + bb.Size / 2)).Length); if (l < dist) { dist = l; final.hit = HitType.Block; final.hitVec = hitPos; final.blockPos = p; final.normal = normal; final.sideHit = sideHit; final.boundingBox = bb; } } } } } } } MouseOverObject = final; }