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

124 lines
4.0 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 System.Collections;
/// Jumps to a specified page in a PagedScrollRect when it is clicked on.
public class JumpToPage : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler {
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
[Tooltip("Destination page.")]
public RectTransform page;
[Tooltip("The transform to modify when the pointer is hovering over this script.")]
public RectTransform hoverTransform;
[Range(0.01f, 0.5f)]
[Tooltip("Tile forward distance when the pointer over the tile.")]
public float hoverPositionZMeters = 0.225f;
[Range(1.0f, 10.0f)]
[Tooltip("Speed used for lerping the rotation/scale/position of the tile.")]
public float interpolationSpeed = 8.0f;
private Graphic graphic;
private float desiredPositionZ;
/// The scroll rect that owns the destination page.
public PagedScrollRect PageOwnerScrollRect {
get {
if (cachedPagedScrollRect != null) {
return cachedPagedScrollRect;
}
if (page != null) {
cachedPagedScrollRect = page.GetComponentInParent<PagedScrollRect>();
}
return cachedPagedScrollRect;
}
}
private PagedScrollRect cachedPagedScrollRect;
public bool CanClick {
get {
if (PageOwnerScrollRect != null) {
bool isActivePage = PageOwnerScrollRect.ActivePage == page;
return !PageOwnerScrollRect.IsMoving && !isActivePage;
}
return false;
}
}
void Awake() {
graphic = GetComponent<Graphic>();
if (graphic == null) {
Debug.LogWarning("Graphic is null, won't be able to click on JumpToPage.");
}
}
void OnEnable() {
cachedPagedScrollRect = null;
}
void OnDisable() {
cachedPagedScrollRect = null;
}
void Update() {
if (graphic != null) {
graphic.raycastTarget = CanClick;
}
float finalDesiredPositionZ = desiredPositionZ;
if (!CanClick) {
finalDesiredPositionZ = 0.0f;
}
if (hoverTransform != null && finalDesiredPositionZ != hoverTransform.localPosition.z) {
Vector3 localPosition = hoverTransform.localPosition;
Vector3 desiredPosition = localPosition;
desiredPosition.z = finalDesiredPositionZ;
localPosition = Vector3.Lerp(localPosition, desiredPosition, Time.deltaTime * interpolationSpeed);
hoverTransform.localPosition = localPosition;
}
}
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
public void OnPointerEnter(PointerEventData eventData) {
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
// Since canvas graphics render facing the negative Z direction,
// negative z is the forward direction for a canvas element.
float metersToCanvasScale = GvrUIHelpers.GetMetersToCanvasScale(page);
desiredPositionZ = -hoverPositionZMeters / metersToCanvasScale;
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
}
public void OnPointerExit(PointerEventData eventData) {
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
desiredPositionZ = 0.0f;
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
}
public void OnPointerClick(PointerEventData eventData) {
#if UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
if (CanClick) {
PageOwnerScrollRect.SnapToVisiblePage(page);
}
#endif // UNITY_HAS_GOOGLEVR && (UNITY_ANDROID || UNITY_EDITOR)
}
}