/************************************************************************************
|
|
|
|
Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
See SampleFramework license.txt for license terms. Unless required by applicable law
|
|
or agreed to in writing, the sample code is provided “AS IS” WITHOUT WARRANTIES OR
|
|
CONDITIONS OF ANY KIND, either express or implied. See the license for specific
|
|
language governing permissions and limitations under the license.
|
|
|
|
************************************************************************************/
|
|
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
using UnityEngine.Assertions;
|
|
|
|
namespace OculusSampleFramework
|
|
{
|
|
public class WindmillBladesController : MonoBehaviour
|
|
{
|
|
private const float MAX_TIME = 1f;
|
|
|
|
[SerializeField] private AudioSource _audioSource = null;
|
|
[SerializeField] private AudioClip _windMillRotationSound = null;
|
|
[SerializeField] private AudioClip _windMillStartSound = null;
|
|
[SerializeField] private AudioClip _windMillStopSound = null;
|
|
|
|
public bool IsMoving { get; private set; }
|
|
|
|
private float _currentSpeed = 0f;
|
|
private Coroutine _lerpSpeedCoroutine;
|
|
private Coroutine _audioChangeCr;
|
|
private Quaternion _originalRotation;
|
|
private float _rotAngle = 0.0f;
|
|
|
|
private void Start()
|
|
{
|
|
Assert.IsNotNull(_audioSource);
|
|
Assert.IsNotNull(_windMillRotationSound);
|
|
Assert.IsNotNull(_windMillStartSound);
|
|
Assert.IsNotNull(_windMillStopSound);
|
|
|
|
_originalRotation = transform.localRotation;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
_rotAngle += _currentSpeed * Time.deltaTime;
|
|
if (_rotAngle > 360.0f)
|
|
{
|
|
_rotAngle = 0.0f;
|
|
}
|
|
|
|
transform.localRotation = _originalRotation * Quaternion.AngleAxis(_rotAngle, Vector3.forward);
|
|
}
|
|
|
|
public void SetMoveState(bool newMoveState, float goalSpeed)
|
|
{
|
|
IsMoving = newMoveState;
|
|
if (_lerpSpeedCoroutine != null)
|
|
{
|
|
StopCoroutine(_lerpSpeedCoroutine);
|
|
}
|
|
_lerpSpeedCoroutine = StartCoroutine(LerpToSpeed(goalSpeed));
|
|
}
|
|
|
|
private IEnumerator LerpToSpeed(float goalSpeed)
|
|
{
|
|
var totalTime = 0f;
|
|
var startSpeed = _currentSpeed;
|
|
|
|
if (_audioChangeCr != null)
|
|
{
|
|
StopCoroutine(_audioChangeCr);
|
|
}
|
|
|
|
// start up
|
|
if (IsMoving)
|
|
{
|
|
_audioChangeCr = StartCoroutine(PlaySoundDelayed(_windMillStartSound,
|
|
_windMillRotationSound, _windMillStartSound.length * 0.95f));
|
|
} // stop
|
|
else
|
|
{
|
|
PlaySound(_windMillStopSound);
|
|
}
|
|
|
|
var diffSpeeds = Mathf.Abs(_currentSpeed - goalSpeed);
|
|
while (diffSpeeds > Mathf.Epsilon)
|
|
{
|
|
_currentSpeed = Mathf.Lerp(startSpeed, goalSpeed, totalTime / MAX_TIME);
|
|
totalTime += Time.deltaTime;
|
|
yield return null;
|
|
diffSpeeds = Mathf.Abs(_currentSpeed - goalSpeed);
|
|
}
|
|
|
|
_lerpSpeedCoroutine = null;
|
|
}
|
|
|
|
private IEnumerator PlaySoundDelayed(AudioClip initial, AudioClip clip, float timeDelayAfterInitial)
|
|
{
|
|
PlaySound(initial, false);
|
|
yield return new WaitForSeconds(timeDelayAfterInitial);
|
|
PlaySound(clip, true);
|
|
}
|
|
|
|
private void PlaySound(AudioClip clip, bool loop = false)
|
|
{
|
|
_audioSource.loop = loop;
|
|
_audioSource.timeSamples = 0;
|
|
_audioSource.clip = clip;
|
|
_audioSource.Play();
|
|
}
|
|
}
|
|
}
|