protected void Update() { if (!cart.CurrentTrack) { return; } var rot = transform.rotation; var distance = Vector3.Dot(cart.GetVelocityOnTrack(), cart.transform.forward) * Time.deltaTime; var angle = distance / (2 * Mathf.PI * wheelRadius) * 360; rot = Quaternion.AngleAxis(angle, cart.transform.right) * rot; transform.rotation = rot; }
public void FixedUpdate() { var speed = cart.GetVelocityOnTrack().magnitude; if (speed > maxSpeed) { speed = maxSpeed; } float intensityMod; if (!cart.CurrentTrack) { //When a cart comes off the track, fade to silent, don't just stop and cause popping. speed = lastVelocity.magnitude; trackiness *= .8f; intensityMod = trackiness; } else { trackiness = 1; intensityMod = GetIntensityModifier(); } //Debug.Log("Speed " + speed + " intensity mod " + intensityMod); foreach (var clipInfo in clips) { var speedIndex = speed / maxSpeed; if (clipInfo.volumeVsSpeed == null) { clipInfo.GenerateCurve(); } var volume = clipInfo.volumeVsSpeed.Evaluate(speedIndex); volume *= intensityMod; if (volume <= 0) { if (clipInfo.currentSource) { clipInfo.currentSource.enabled = false; clipInfo.currentSource = null; } continue; } var source = clipInfo.currentSource ?? AllocSource(); clipInfo.currentSource = source; source.clip = clipInfo.clip; //determine pitch if (clipInfo.referenceSpeedPercent == 0 || clipInfo.speedScale == 0) { source.pitch = 1; source.enabled = true; } else { var m = clipInfo.speedScale; var x = speed / (clipInfo.referenceSpeedPercent * maxSpeed); var b = 1 - m; source.pitch = m * x + b; source.enabled = source.pitch > 0; } source.volume = baseVolume * volume; if (source.enabled && !source.isPlaying) { source.Play(); } } }