1
This repository has been archived on 2025-03-15. You can view files and clone it, but cannot push or open issues or pull requests.
2025-03-15 20:02:21 +01:00

147 lines
4.3 KiB
C#

// Copyright 2016 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// 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 UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
// Used inside a scrolling page view. It contains abstract functions for handling
// interactions between itself and the gvr controller.
public abstract class BaseTile : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IGvrPointerHoverHandler {
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
protected Transform originalParent;
protected Quaternion originalRotation;
protected Vector3 originalPosition;
protected Vector3 originalScale;
protected TiledPage page;
protected bool isInteractable = true;
protected bool isHovering = false;
// Ratio between meters (Unity Units) to the parent canvas that
// this tile is part of.
private float? metersToCanvasScale;
/// Returns the tile's outer container's rect transform.
public RectTransform Cell {
get {
return originalParent ? originalParent.GetComponent<RectTransform>() : null;
}
}
public virtual void Reset() {
OnPointerExit(null);
transform.SetParent(originalParent, true);
transform.localRotation = originalRotation;
transform.localPosition = originalPosition;
transform.localScale = originalScale;
page = null;
metersToCanvasScale = null;
}
protected virtual void Awake() {
originalParent = transform.parent;
originalRotation = transform.localRotation;
originalPosition = transform.localPosition;
originalScale = transform.localScale;
}
protected virtual void OnEnable() {
Reset();
}
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
public abstract void OnPointerEnter(PointerEventData eventData);
public abstract void OnPointerExit(PointerEventData eventData);
public abstract void OnGvrPointerHover(PointerEventData eventData);
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
public bool IsInteractable {
get {
return isInteractable;
}
set {
if (isInteractable == value) {
return;
}
isInteractable = value;
SetEventTriggersInteractable(isInteractable);
SetSelectablesInteractable(isInteractable);
SetGraphicsRaycastTarget(isInteractable);
}
}
protected TiledPage GetPage() {
if (page == null) {
page = GetComponentInParent<TiledPage>();
}
return page ? page : null;
}
protected float GetMetersToCanvasScale() {
if (metersToCanvasScale == null) {
metersToCanvasScale = GvrUIHelpers.GetMetersToCanvasScale(transform);
}
return metersToCanvasScale.Value;
}
private void SetEventTriggersInteractable(bool interactable) {
EventTrigger[] triggers = GetComponentsInChildren<EventTrigger>();
if (triggers == null) {
return;
}
int numTriggers = triggers.Length;
for (int i = 0; i < numTriggers; i++) {
EventTrigger trigger = triggers[i];
trigger.enabled = interactable;
}
}
private void SetSelectablesInteractable(bool interactable) {
Selectable[] selectables = GetComponentsInChildren<Selectable>();
if (selectables == null) {
return;
}
int numSelectables = selectables.Length;
for (int i = 0; i < numSelectables; i++) {
Selectable selectable = selectables[i];
selectable.interactable = interactable;
}
}
private void SetGraphicsRaycastTarget(bool isRaycastTarget) {
Graphic[] graphics = GetComponentsInChildren<Graphic>();
if (graphics == null) {
return;
}
int numGraphics = graphics.Length;
for (int i = 0; i < numGraphics; i++) {
Graphic graphic = graphics[i];
graphic.raycastTarget = isRaycastTarget;
}
}
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
}