Пример #1
0
        private void UpdateMining()
        {
            if (WorldRaycaster.IsHit && Input.GetMouseButtonDown(1))
            {
                var playerPosition = WorldModelHelper.FloorPositionToVector3Int(_playerBody.Transform.position);
                if (WorldRaycaster.LastPosition != playerPosition && WorldRaycaster.LastPosition != playerPosition + Vector3Int.up)
                {
                    WorldModel.EditVoxel(WorldRaycaster.LastPosition, (byte)InventoryModel.SelectedBlockType);
                }
            }

            if (!_isMining)
            {
                //check if we could start mining
                if (WorldRaycaster.IsHit && Input.GetMouseButton(0))
                {
                    //START MINING
                    _isMining = true;
                    UpdateCursorsVisibility();
                    _miningStartedTime = Time.time;
                }
            }
            else
            {
                if (!WorldRaycaster.IsHit || !Input.GetMouseButton(0))
                {
                    //STOP MINING
                    _isMining = false;
                    UpdateCursorsVisibility();
                    _mineBlockCursor.SetMiningProgress(0);
                    _pick.transform.localRotation = Quaternion.identity;
                    return;
                }

                var miningLength  = Time.time - _miningStartedTime;
                var hits          = Mathf.FloorToInt(miningLength / _playerSettings.MiningInterval);
                var blockHardness = _minedBlockType.Hardness;

                var animProgress = _playerSettings.PickMovementCurve.Evaluate((miningLength % _playerSettings.MiningInterval) / _playerSettings.MiningInterval);

                _pick.transform.localRotation = Quaternion.Euler(new Vector3(-45 * animProgress, 0, 0));

                //blockHardness == means indestructible


                //finish mining (remove block)
                if (hits >= blockHardness && blockHardness != 0)
                {
                    WorldModel.EditVoxel(_lastMinePosition, BlockTypeByte.AIR);
                    UpdateCursorsVisibility();
                    return;
                }

                //anim block
                if (blockHardness > 0)
                {
                    _mineBlockCursor.SetMiningProgress(hits / (float)blockHardness);
                }
            }
        }