/************************************************************************************
|
|
|
|
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 TrainCrossingController : MonoBehaviour
|
|
{
|
|
[SerializeField] private AudioSource _audioSource = null;
|
|
[SerializeField] private AudioClip[] _crossingSounds = null;
|
|
[SerializeField] private MeshRenderer _lightSide1Renderer = null;
|
|
[SerializeField] private MeshRenderer _lightSide2Renderer = null;
|
|
[SerializeField] private SelectionCylinder _selectionCylinder = null;
|
|
|
|
private Material _lightsSide1Mat;
|
|
private Material _lightsSide2Mat;
|
|
private int _colorId = Shader.PropertyToID("_Color");
|
|
|
|
private Coroutine _xingAnimationCr = null;
|
|
private InteractableTool _toolInteractingWithMe = null;
|
|
|
|
private void Awake()
|
|
{
|
|
Assert.IsNotNull(_audioSource);
|
|
Assert.IsNotNull(_crossingSounds);
|
|
Assert.IsNotNull(_lightSide1Renderer);
|
|
Assert.IsNotNull(_lightSide2Renderer);
|
|
Assert.IsNotNull(_selectionCylinder);
|
|
|
|
_lightsSide1Mat = _lightSide1Renderer.material;
|
|
_lightsSide2Mat = _lightSide2Renderer.material;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (_lightsSide1Mat != null)
|
|
{
|
|
Destroy(_lightsSide1Mat);
|
|
}
|
|
if (_lightsSide2Mat != null)
|
|
{
|
|
Destroy(_lightsSide2Mat);
|
|
}
|
|
}
|
|
|
|
public void CrossingButtonStateChanged(InteractableStateArgs obj)
|
|
{
|
|
bool inActionState = obj.NewInteractableState == InteractableState.ActionState;
|
|
if (inActionState)
|
|
{
|
|
ActivateTrainCrossing();
|
|
}
|
|
|
|
_toolInteractingWithMe = obj.NewInteractableState > InteractableState.Default ?
|
|
obj.Tool : null;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_toolInteractingWithMe == null)
|
|
{
|
|
_selectionCylinder.CurrSelectionState = SelectionCylinder.SelectionState.Off;
|
|
}
|
|
else
|
|
{
|
|
_selectionCylinder.CurrSelectionState = (
|
|
_toolInteractingWithMe.ToolInputState == ToolInputState.PrimaryInputDown ||
|
|
_toolInteractingWithMe.ToolInputState == ToolInputState.PrimaryInputDownStay)
|
|
? SelectionCylinder.SelectionState.Highlighted
|
|
: SelectionCylinder.SelectionState.Selected;
|
|
}
|
|
}
|
|
|
|
private void ActivateTrainCrossing()
|
|
{
|
|
int maxSoundIndex = _crossingSounds.Length - 1;
|
|
var audioClip = _crossingSounds[(int)(Random.value * maxSoundIndex)];
|
|
_audioSource.clip = audioClip;
|
|
_audioSource.timeSamples = 0;
|
|
_audioSource.Play();
|
|
if (_xingAnimationCr != null)
|
|
{
|
|
StopCoroutine(_xingAnimationCr);
|
|
}
|
|
_xingAnimationCr = StartCoroutine(AnimateCrossing(audioClip.length * 0.75f));
|
|
}
|
|
|
|
private IEnumerator AnimateCrossing(float animationLength)
|
|
{
|
|
ToggleLightObjects(true);
|
|
|
|
float animationEndTime = Time.time + animationLength;
|
|
|
|
float lightBlinkDuration = animationLength * 0.1f;
|
|
float lightBlinkStartTime = Time.time;
|
|
float lightBlinkEndTime = Time.time + lightBlinkDuration;
|
|
Material lightToBlinkOn = _lightsSide1Mat;
|
|
Material lightToBlinkOff = _lightsSide2Mat;
|
|
Color onColor = new Color(1.0f, 1.0f, 1.0f, 1.0f);
|
|
Color offColor = new Color(1.0f, 1.0f, 1.0f, 0.0f);
|
|
|
|
while (Time.time < animationEndTime)
|
|
{
|
|
float t = (Time.time - lightBlinkStartTime) / lightBlinkDuration;
|
|
lightToBlinkOn.SetColor(_colorId, Color.Lerp(offColor, onColor, t));
|
|
lightToBlinkOff.SetColor(_colorId, Color.Lerp(onColor, offColor, t));
|
|
|
|
// switch which lights blink on and off when time runs out
|
|
if (Time.time > lightBlinkEndTime)
|
|
{
|
|
Material temp = lightToBlinkOn;
|
|
lightToBlinkOn = lightToBlinkOff;
|
|
lightToBlinkOff = temp;
|
|
lightBlinkStartTime = Time.time;
|
|
lightBlinkEndTime = Time.time + lightBlinkDuration;
|
|
}
|
|
|
|
yield return null;
|
|
}
|
|
|
|
ToggleLightObjects(false);
|
|
}
|
|
|
|
private void AffectMaterials(Material[] materials, Color newColor)
|
|
{
|
|
foreach (var material in materials)
|
|
{
|
|
material.SetColor(_colorId, newColor);
|
|
}
|
|
}
|
|
|
|
private void ToggleLightObjects(bool enableState)
|
|
{
|
|
_lightSide1Renderer.gameObject.SetActive(enableState);
|
|
_lightSide2Renderer.gameObject.SetActive(enableState);
|
|
}
|
|
}
|
|
}
|