This commit is contained in:
ohgushiyuga
2026-08-27 12:51:15 +09:00
parent 1441c96f74
commit 52341100ed
32 changed files with 840 additions and 1076 deletions

View File

@@ -1,38 +1,28 @@
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.XR;
using System.Collections;
public class ElevatorSceneTransition : MonoBehaviour
{
[Header("遷移先の設定")]
[Header("シーン設定")]
[SerializeField] private string bossSceneName = "BossStage";
[SerializeField] private string playerTag = "Player";
[Header("ローディングUI設定")]
[Header("UI設定")]
[SerializeField] private GameObject loadingCanvas;
[SerializeField] private Text progressText;
[SerializeField] private Slider progressSlider;
[Header("エレベーター下降演出設定")]
[Tooltip("エレベーターの部屋(壁や床、UIすべて)をまとめているオブジェクトを指定してください(※プレイヤーは外しておきます)")]
[Header("演出設定")]
[SerializeField] private Transform elevatorCageTransform;
[Tooltip("ガタガタ揺れる激しさ(0.01~0.03あたりが自然です)")]
[SerializeField] private float shakeMagnitude = 0.015f;
[Tooltip("下降中のコントローラーの振動の強さ(0.0 ~ 1.0)")]
[SerializeField] private float hapticAmplitude = 0.15f;
// ─── ★新設:親子関係にしないためのプレイヤー登録枠 ───
[Header("プレイヤーの同期設定")]
[Tooltip("XR Origin(またはXR Rig)のTransformを直接ドラッグ&ドロップしてください")]
[SerializeField] private Transform playerTransform;
// ─────────────────────────────────────────────────────
private bool isLoadingStarted = false;
private Vector3 originalCagePosition;
private bool isLoadingStarted;
private Vector3 originalCagePosition;
private void Start()
{
@@ -40,7 +30,6 @@ public class ElevatorSceneTransition : MonoBehaviour
if (elevatorCageTransform != null)
{
// ワールド空間での初期位置を記憶(localPositionからpositionに変更し、より確実に)
originalCagePosition = elevatorCageTransform.position;
}
}
@@ -52,14 +41,12 @@ public class ElevatorSceneTransition : MonoBehaviour
if (other.CompareTag(playerTag))
{
isLoadingStarted = true;
// ★安全対策:接触したプレイヤーのTransformを自動でキャッシュする
if (playerTransform == null)
{
playerTransform = other.transform;
}
Debug.Log("🛗 プレイヤー乗車:親子関係なしのデルタ同期で下降演出を開始します。");
StartCoroutine(LoadSceneAsyncRoutine());
}
}
@@ -79,31 +66,24 @@ public class ElevatorSceneTransition : MonoBehaviour
if (progressText != null) progressText.text = $"LOADING: {(currentProgress * 100f):F0}%";
if (progressSlider != null) progressSlider.value = currentProgress;
// ─── ★【超重要】親子関係なしでプレイヤーを完全同期させるロジック ───
// 1. 動かす前の、このフレームにおけるエレベーターの現在位置を記録
Vector3 previousCagePosition = elevatorCageTransform.position;
// 2. エレベーターの部屋だけをランダムにガタガタ動かす
if (elevatorCageTransform != null)
{
Vector3 randomOffset = Random.insideUnitSphere * shakeMagnitude;
randomOffset.y = 0; // 横揺れのみ
randomOffset.y = 0;
elevatorCageTransform.position = originalCagePosition + randomOffset;
}
// 3. 「この1フレームでエレベーターが実際に動いた移動差分(デルタ)」を計算
Vector3 cageDelta = elevatorCageTransform.position - previousCagePosition;
// 4. その移動差分を、プレイヤーの座標にもそのまま上乗せして足し算する
if (playerTransform != null && cageDelta != Vector3.zero)
{
playerTransform.position += cageDelta;
}
// ───────────────────────────────────────────────────────────────────
hapticTimer += Time.deltaTime;
if (hapticTimer >= 0.1f)
if (hapticTimer >= 0.1f)
{
TriggerBothHandHaptics(hapticAmplitude, 0.08f);
hapticTimer = 0f;
@@ -112,10 +92,8 @@ public class ElevatorSceneTransition : MonoBehaviour
yield return null;
}
// 到着後、エレベーターの位置を元の位置に綺麗に戻す
if (elevatorCageTransform != null)
{
// 最後の移動差分を計算してプレイヤーを戻す
Vector3 previousCagePosition = elevatorCageTransform.position;
elevatorCageTransform.position = originalCagePosition;
Vector3 cageDelta = elevatorCageTransform.position - previousCagePosition;
@@ -127,7 +105,6 @@ public class ElevatorSceneTransition : MonoBehaviour
yield return new WaitForSeconds(1.0f);
Debug.Log("🎉 ボスステージに到着。シーンを切り替えます。");
asyncLoad.allowSceneActivation = true;
}