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; } }