namespace VRTK.Examples
|
|
{
|
|
using UnityEngine;
|
|
|
|
public class LightSaber : VRTK_InteractableObject
|
|
{
|
|
private bool beamActive = false;
|
|
private Vector2 beamLimits = new Vector2(0f, 1.2f);
|
|
private float currentBeamSize;
|
|
private float beamExtendSpeed = 0;
|
|
|
|
private GameObject blade;
|
|
private Color activeColor;
|
|
private Color targetColor;
|
|
private Color[] bladePhaseColors;
|
|
|
|
public override void StartUsing(VRTK_InteractUse currentUsingObject = null)
|
|
{
|
|
base.StartUsing(currentUsingObject);
|
|
beamExtendSpeed = 5f;
|
|
bladePhaseColors = new Color[2] { Color.blue, Color.cyan };
|
|
activeColor = bladePhaseColors[0];
|
|
targetColor = bladePhaseColors[1];
|
|
}
|
|
|
|
public override void StopUsing(VRTK_InteractUse previousUsingObject = null, bool resetUsingObjectState = true)
|
|
{
|
|
base.StopUsing(previousUsingObject, resetUsingObjectState);
|
|
beamExtendSpeed = -5f;
|
|
}
|
|
|
|
protected void Start()
|
|
{
|
|
blade = transform.Find("Blade").gameObject;
|
|
currentBeamSize = beamLimits.x;
|
|
SetBeamSize();
|
|
}
|
|
|
|
protected override void Update()
|
|
{
|
|
base.Update();
|
|
currentBeamSize = Mathf.Clamp(blade.transform.localScale.y + (beamExtendSpeed * Time.deltaTime), beamLimits.x, beamLimits.y);
|
|
SetBeamSize();
|
|
PulseBeam();
|
|
}
|
|
|
|
private void SetBeamSize()
|
|
{
|
|
blade.transform.localScale = new Vector3(1f, currentBeamSize, 1f);
|
|
beamActive = (currentBeamSize >= beamLimits.y ? true : false);
|
|
}
|
|
|
|
private void PulseBeam()
|
|
{
|
|
if (beamActive)
|
|
{
|
|
Color bladeColor = Color.Lerp(activeColor, targetColor, Mathf.PingPong(Time.time, 1));
|
|
blade.transform.Find("Beam").GetComponent<MeshRenderer>().material.color = bladeColor;
|
|
|
|
if (bladeColor == targetColor)
|
|
{
|
|
var previouslyActiveColor = activeColor;
|
|
activeColor = targetColor;
|
|
targetColor = previouslyActiveColor;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|