Initial Commit
This commit is contained in:
+125
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Licensed under the Oculus SDK License Agreement (the "License");
|
||||
* you may not use the Oculus SDK except in compliance with the License,
|
||||
* which is provided at the time of installation or download, or which
|
||||
* otherwise accompanies this software in either electronic or hard copy form.
|
||||
*
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://developer.oculus.com/licenses/oculussdk/
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, the Oculus SDK
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user