//======= 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(); #if UNITY_URP tintColorId = Shader.PropertyToID( "_BaseColor" ); #else tintColorId = Shader.PropertyToID("_TintColor"); #endif 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(); if ( locked ) { areaMesh.sharedMaterial = Teleport.instance.areaLockedMaterial; } else { areaMesh.sharedMaterial = Teleport.instance.areaVisibleMaterial; } } //------------------------------------------------- private bool CalculateBounds() { MeshFilter meshFilter = GetComponent(); 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(); if ( teleportArea != null ) { teleportArea.UpdateVisualsInEditor(); } } } //------------------------------------------------- public override void OnInspectorGUI() { DrawDefaultInspector(); if ( Selection.activeTransform != null ) { TeleportArea teleportArea = Selection.activeTransform.GetComponent(); if ( GUI.changed && teleportArea != null ) { teleportArea.UpdateVisualsInEditor(); } } } } #endif }