protected virtual void ResetMagneticSensor()
 {
     this.magneticMode                 = Cube.MagneticMode.Off;
     this.magnetState                  = Cube.MagnetState.None;
     this.magnetStateCallback          = null;
     this.configMagneticSensorCallback = null;
 }
 protected virtual void _SetMagnetState(Cube.MagnetState state)
 {
     if (state != this.magnetState)
     {
         this.magnetState = state;
         this.magnetStateCallback?.Invoke(state);
     }
 }
        protected virtual void SimulateMagnetState(Vector3 force)
        {
            if (this.magneticMode != Cube.MagneticMode.MagnetState)
            {
                this.magnetState = Cube.MagnetState.None;
                return;
            }

            var         e = force.normalized;
            var         m = force.magnitude;
            const float orientThreshold = 0.95f;

            Cube.MagnetState state = this.magnetState;

            if (m > 9000 && Vector3.Dot(e, Vector3.forward) > orientThreshold)
            {
                state = Cube.MagnetState.N_Center;
            }
            else if (m > 9000 && Vector3.Dot(e, Vector3.back) > orientThreshold)
            {
                state = Cube.MagnetState.S_Center;
            }
            else if (m > 6000 && Vector3.Dot(e, new Vector3(0, -1, 1).normalized) > orientThreshold)
            {
                state = Cube.MagnetState.N_Right;
            }
            else if (m > 6000 && Vector3.Dot(e, new Vector3(0, 1, 1).normalized) > orientThreshold)
            {
                state = Cube.MagnetState.N_Left;
            }
            else if (m > 6000 && Vector3.Dot(e, new Vector3(0, 1, -1).normalized) > orientThreshold)
            {
                state = Cube.MagnetState.S_Right;
            }
            else if (m > 6000 && Vector3.Dot(e, new Vector3(0, -1, -1).normalized) > orientThreshold)
            {
                state = Cube.MagnetState.S_Left;
            }
            else if (m < 200)
            {
                state = Cube.MagnetState.None;
            }

            _SetMagnetState(state);
        }
        internal void _SetMagneticField(Cube.MagnetState state)
        {
            Vector3 field = default;

            switch (state)
            {
            case Cube.MagnetState.S_Center: field = Vector3.back * MagneticFieldScale * 24; break;

            case Cube.MagnetState.N_Center: field = Vector3.forward * MagneticFieldScale * 24; break;

            case Cube.MagnetState.N_Right: field = new Vector3(0, -1, 1) * MagneticFieldScale * 13; break;

            case Cube.MagnetState.N_Left: field = new Vector3(0, 1, 1) * MagneticFieldScale * 13; break;

            case Cube.MagnetState.S_Right: field = new Vector3(0, 1, -1) * MagneticFieldScale * 13; break;

            case Cube.MagnetState.S_Left: field = new Vector3(0, -1, -1) * MagneticFieldScale * 13; break;

            case Cube.MagnetState.None: field = Vector3.zero; break;
            }
            this._magneticField = field;
        }
        protected override void _SetMagnetState(Cube.MagnetState state)
        {
            bool isToNotify_Interval = this.magneticNotificationInterval > 0 &&
                                       Time.time - magneticNotificationLastTime > this.magneticNotificationInterval * 0.02f;

            bool isToNotify_Type = false;

            if (this.magneticNotificationType == Cube.MagneticNotificationType.Always)
            {
                isToNotify_Type = true;
            }
            else if (this.magneticNotificationType == Cube.MagneticNotificationType.OnChanged)
            {
                isToNotify_Type = state != this.magnetState;
            }

            if (isToNotify_Interval && isToNotify_Type)
            {
                this.magnetStateCallback?.Invoke(state);
                this.magnetState = state;
                this.magneticNotificationLastTime = Time.time;
            }
        }