campfire/Assets/SteamVR/InteractionSystem/Teleport/Scripts/TeleportArea.cs

201 lines
4.3 KiB
C#
Raw Permalink Normal View History

2020-04-29 19:40:05 +02:00
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
//
// Purpose: An area that the player can teleport to
//
//=============================================================================
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Valve.VR.InteractionSystem
{
//-------------------------------------------------------------------------
public class TeleportArea : TeleportMarkerBase
{
//Public properties
public Bounds meshBounds { get; private set; }
//Private data
private MeshRenderer areaMesh;
private int tintColorId = 0;
private Color visibleTintColor = Color.clear;
private Color highlightedTintColor = Color.clear;
private Color lockedTintColor = Color.clear;
private bool highlighted = false;
//-------------------------------------------------
public void Awake()
{
areaMesh = GetComponent<MeshRenderer>();
tintColorId = Shader.PropertyToID( "_TintColor" );
CalculateBounds();
}
//-------------------------------------------------
public void Start()
{
visibleTintColor = Teleport.instance.areaVisibleMaterial.GetColor( tintColorId );
highlightedTintColor = Teleport.instance.areaHighlightedMaterial.GetColor( tintColorId );
lockedTintColor = Teleport.instance.areaLockedMaterial.GetColor( tintColorId );
}
//-------------------------------------------------
public override bool ShouldActivate( Vector3 playerPosition )
{
return true;
}
//-------------------------------------------------
public override bool ShouldMovePlayer()
{
return true;
}
//-------------------------------------------------
public override void Highlight( bool highlight )
{
if ( !locked )
{
highlighted = highlight;
if ( highlight )
{
areaMesh.material = Teleport.instance.areaHighlightedMaterial;
}
else
{
areaMesh.material = Teleport.instance.areaVisibleMaterial;
}
}
}
//-------------------------------------------------
public override void SetAlpha( float tintAlpha, float alphaPercent )
{
Color tintedColor = GetTintColor();
tintedColor.a *= alphaPercent;
areaMesh.material.SetColor( tintColorId, tintedColor );
}
//-------------------------------------------------
public override void UpdateVisuals()
{
if ( locked )
{
areaMesh.material = Teleport.instance.areaLockedMaterial;
}
else
{
areaMesh.material = Teleport.instance.areaVisibleMaterial;
}
}
//-------------------------------------------------
public void UpdateVisualsInEditor()
{
if (Teleport.instance == null)
return;
areaMesh = GetComponent<MeshRenderer>();
if ( locked )
{
areaMesh.sharedMaterial = Teleport.instance.areaLockedMaterial;
}
else
{
areaMesh.sharedMaterial = Teleport.instance.areaVisibleMaterial;
}
}
//-------------------------------------------------
private bool CalculateBounds()
{
MeshFilter meshFilter = GetComponent<MeshFilter>();
if ( meshFilter == null )
{
return false;
}
Mesh mesh = meshFilter.sharedMesh;
if ( mesh == null )
{
return false;
}
meshBounds = mesh.bounds;
return true;
}
//-------------------------------------------------
private Color GetTintColor()
{
if ( locked )
{
return lockedTintColor;
}
else
{
if ( highlighted )
{
return highlightedTintColor;
}
else
{
return visibleTintColor;
}
}
}
}
#if UNITY_EDITOR
//-------------------------------------------------------------------------
[CustomEditor( typeof( TeleportArea ) )]
public class TeleportAreaEditor : Editor
{
//-------------------------------------------------
void OnEnable()
{
if ( Selection.activeTransform != null )
{
TeleportArea teleportArea = Selection.activeTransform.GetComponent<TeleportArea>();
if ( teleportArea != null )
{
teleportArea.UpdateVisualsInEditor();
}
}
}
//-------------------------------------------------
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if ( Selection.activeTransform != null )
{
TeleportArea teleportArea = Selection.activeTransform.GetComponent<TeleportArea>();
if ( GUI.changed && teleportArea != null )
{
teleportArea.UpdateVisualsInEditor();
}
}
}
}
#endif
}