private void GetNextTarget() { if (Room.Instance.FurnitureStack.Count > 0) { var furniture = Room.Instance.FurnitureStack.Pop(); if (furniture.Prefab != null) { if (_target != null) { _target.SetAppearance(false); } var go = GameObject.Instantiate(furniture.Prefab, new Vector3(0, 2, 0), Quaternion.identity); _target = go.GetComponent <VoxelFurniture>(); _target.Furniture = furniture; _target.SetAppearance(true); _remainingTime = Timer; SoundManager.Instance.Play(NewSound); } } else { UITablet.Instance.ShowEnd(); } }
public bool CheckNear(VoxelFurniture a, VoxelFurniture b) { var bA = a.VoxelObject.GetWorldBounds(); var bB = a.VoxelObject.GetWorldBounds(); bA.size *= 1.1f; return(bA.Intersects(bB)); }
public void PlaceFurniture(VoxelFurniture furniture) { //furniture.FinishMovement(); foreach (var kvp in furniture.Volume.Data) { var worldVoxel = VoxelSpace.GetWorldVoxelFromLocalVoxel(furniture.transform.position, kvp.Key - furniture.Volume.Pivot); var localVoxel = VoxelSpace.GetLocalVoxelFromWorldVoxel(transform.position, worldVoxel + ObjectsVolume.Pivot); ObjectsVolume.SetAt(localVoxel, kvp.Value); } _placedFurniture.Add(furniture); }
private void Update() { if (_target == null || Room.Instance == null) { return; } // Timer check _remainingTime -= Time.deltaTime; if (_remainingTime < 0) { if (!_placeLock) { _placeLock = true; SoundManager.Instance.Play(SkipSound); _target.MoveSmooth(new Vector3(0, 5, 0), () => { Destroy(_target.gameObject); GetNextTarget(); _placeLock = false; }); } return; } /* * // Rotation * if (Input.GetButtonDown("RotateY")) * { * SoundManager.Instance.Play(RotateSound); * _target.RotateYCw(); * } * * if (Input.GetButtonDown("RotateX")) * { * SoundManager.Instance.Play(RotateSound); * _target.RotateXCw(); * }*/ _isRotating = Input.GetButton("RotateY"); if (_isRotating) { //Cursor.lockState = CursorLockMode.Locked; Cursor.visible = false; var xDelta = Input.GetAxis("Mouse X"); var yDelta = Input.GetAxis("Mouse Y"); if (xDelta > 0 && _rotationTravelX < 0) { _rotationTravelX = 0f; } if (xDelta < 0 && _rotationTravelX > 0) { _rotationTravelX = 0f; } if (yDelta > 0 && _rotationTravelY < 0) { _rotationTravelY = 0f; } if (yDelta < 0 && _rotationTravelY > 0) { _rotationTravelY = 0f; } _rotationTravelX += xDelta; _rotationTravelY += yDelta; if (_rotationTravelX > RotationMouseTravel) { _rotationTravelX = 0; SoundManager.Instance.Play(RotateSound); _target.RotateYCCw(); } if (_rotationTravelX < -RotationMouseTravel) { _rotationTravelX = 0; SoundManager.Instance.Play(RotateSound); _target.RotateYCw(); } if (_rotationTravelY > RotationMouseTravel) { _rotationTravelY = 0; SoundManager.Instance.Play(RotateSound); _target.RotateXCw(); } if (_rotationTravelY < -RotationMouseTravel) { _rotationTravelY = 0; SoundManager.Instance.Play(RotateSound); _target.RotateXCCw(); } } else { _rotationTravelX = 0; _rotationTravelY = 0; //Cursor.lockState = CursorLockMode.None; Cursor.visible = true; } // Placement target var targetVoxel = Vector3Int.zero; var targetPosition = VoxelSpace.GetWorldPosition(targetVoxel); // Scroll wheel var scroll = Input.GetAxis("Mouse ScrollWheel"); if (scroll < 0) { _yPos += 1; } else if (scroll > 0) { _yPos -= 1; } _yPos = Mathf.Min(_yPos, Room.Instance.FillVolume.MaxBounds.y); _yPos = Mathf.Max(_yPos, Room.Instance.FillVolume.MinBounds.y); if (EventSystem.current.IsPointerOverGameObject()) { return; } // Raycasts to floor var cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition); var distance = 0f; if (_plane.Raycast(cameraRay, out distance)) { // Raycast to floor var point = cameraRay.GetPoint(distance); Debug.DrawLine(Camera.main.transform.position, point, Color.magenta, 0.1f); // Clip to room bounds point = Room.Instance.Collider.bounds.ClosestPoint(point); targetVoxel = VoxelSpace.GetWorldVoxelFromWorldPos(point); targetVoxel.y = _yPos; targetPosition = VoxelSpace.GetWorldPosition(targetVoxel); } // Get collisions in TARGET location var collisions = VoxelSpace.InverseCollistionsA(targetPosition, _target.Volume, Room.Instance.transform.position, Room.Instance.FillVolume); var collisionsWithObjects = VoxelSpace.CollistionsA(targetPosition, _target.Volume, Room.Instance.transform.position, Room.Instance.ObjectsVolume); collisions.AddRange(collisionsWithObjects); // Draw red voxels foreach (var collision in collisions) { //var pos = _target.VoxelObject.GetActualWorldVoxel(collision.LocalPosA); var pos = VoxelSpace.GetWorldPosition(collision.WorldPos); Graphics.DrawMesh(_voxelMesh, Matrix4x4.Translate(pos), RedVoxel, layer: LayerMask.GetMask("Default")); } // If we are allowed to actaully move the object if (!_placeLock && !_isRotating) { _target.MoveSmooth(targetPosition); if (Input.GetButtonDown("Place")) { // If no collisions in target find fall distance if (collisions.Count == 0) { var fallDistance = GetFallDistance(); targetVoxel.y -= fallDistance; targetPosition = VoxelSpace.GetWorldPosition(targetVoxel); _placeLock = true; _target.MoveSmooth(targetPosition, () => { Room.Instance.PlaceFurniture(_target); _target = null; GetNextTarget(); _placeLock = false; SoundManager.Instance.Play(PlaceSound); }); } else { SoundManager.Instance.Play(CantPlaceSound); Debug.Log("Can't place"); } } } }