提交S1交互
This commit is contained in:
15
Assets/AddressableAssetsData/link.xml
Normal file
15
Assets/AddressableAssetsData/link.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<linker>
|
||||||
|
<assembly fullname="Unity.Addressables, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
|
||||||
|
<type fullname="UnityEngine.AddressableAssets.Addressables" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
<assembly fullname="Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" preserve="all">
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.InstanceProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.LegacyResourcesProvider" preserve="all" />
|
||||||
|
<type fullname="UnityEngine.ResourceManagement.ResourceProviders.SceneProvider" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
<assembly fullname="UnityEngine.AudioModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||||
|
<type fullname="UnityEngine.AudioClip" preserve="all" />
|
||||||
|
</assembly>
|
||||||
|
</linker>
|
||||||
7
Assets/AddressableAssetsData/link.xml.meta
Normal file
7
Assets/AddressableAssetsData/link.xml.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 38786ff5ce805df40a5b84ce75912f96
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -29,7 +29,7 @@ Material:
|
|||||||
m_LightmapFlags: 4
|
m_LightmapFlags: 4
|
||||||
m_EnableInstancingVariants: 0
|
m_EnableInstancingVariants: 0
|
||||||
m_DoubleSidedGI: 0
|
m_DoubleSidedGI: 0
|
||||||
m_CustomRenderQueue: 3002
|
m_CustomRenderQueue: 2002
|
||||||
stringTagMap: {}
|
stringTagMap: {}
|
||||||
disabledShaderPasses: []
|
disabledShaderPasses: []
|
||||||
m_LockedProperties:
|
m_LockedProperties:
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ AnimatorStateMachine:
|
|||||||
m_Position: {x: 380, y: 20, z: 0}
|
m_Position: {x: 380, y: 20, z: 0}
|
||||||
- serializedVersion: 1
|
- serializedVersion: 1
|
||||||
m_State: {fileID: 723240310285595574}
|
m_State: {fileID: 723240310285595574}
|
||||||
m_Position: {x: 390, y: 160, z: 0}
|
m_Position: {x: 370, y: 150, z: 0}
|
||||||
- serializedVersion: 1
|
- serializedVersion: 1
|
||||||
m_State: {fileID: 9023933777772088499}
|
m_State: {fileID: 9023933777772088499}
|
||||||
m_Position: {x: 120, y: 160, z: 0}
|
m_Position: {x: 120, y: 160, z: 0}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,154 +1,67 @@
|
|||||||
using System.Collections;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.XR.Interaction.Toolkit;
|
using UnityEngine.XR.Interaction.Toolkit;
|
||||||
using UnityEngine.XR.Interaction.Toolkit.Interactables;
|
using UnityEngine.XR.Interaction.Toolkit.Interactables;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// S1 天命玄鸟 - 悬浮甲骨交互
|
/// S1 天命玄鸟 - 悬浮甲骨文字交互(仅负责文字显示/隐藏)
|
||||||
|
/// 归位逻辑由同一 GameObject 上的 ReturnPosition 负责。
|
||||||
///
|
///
|
||||||
/// 同一 GameObject 需要同时挂 XRGrabInteractable。
|
/// hover(触摸/靠近,未抓取)→ 播放文字出现动画
|
||||||
///
|
/// selectEntered(抓取) → 播放文字消失动画
|
||||||
/// 交互逻辑:
|
|
||||||
/// hover(触摸/靠近,未抓取)→ 播放文字显示动画
|
|
||||||
/// selectEntered(抓取) → 隐藏文字,取消归位计时
|
|
||||||
/// selectExited(松手) → 延迟后溶解消失 → 瞬间归位 → 溶解出现
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RequireComponent(typeof(XRGrabInteractable))]
|
[RequireComponent(typeof(XRGrabInteractable))]
|
||||||
public class S1_OracleBoneInteract : MonoBehaviour
|
public class S1_OracleBoneInteract : MonoBehaviour
|
||||||
{
|
{
|
||||||
[Header("文字动画")]
|
[Header("文字动画")]
|
||||||
[SerializeField] private Animator textAnimator;
|
[SerializeField] private Animator textAnimator;
|
||||||
[SerializeField] private string showAnimName = "Open"; // 文字出现
|
[SerializeField] private string showAnimName = "open"; // 文字出现
|
||||||
[SerializeField] private string hideAnimName = "Translate"; // 文字消失
|
[SerializeField] private string hideAnimName = "Translate"; // 文字消失
|
||||||
[SerializeField] private AudioSource touchAudio;
|
|
||||||
|
|
||||||
[Header("归位溶解效果")]
|
[Header("音效")]
|
||||||
[SerializeField] private EffectHideAndShowCtr effectCtr;
|
public AudioSource touchAudio;
|
||||||
[SerializeField] private float resetDelayTime = 2f; // 松手后多久开始归位
|
public AudioSource lightEffect;
|
||||||
[SerializeField] private float dissolveDuration = 1f; // 溶解动画时长
|
|
||||||
|
|
||||||
// ── 内部状态 ─────────────────────────────────────────────
|
|
||||||
private XRGrabInteractable m_grab;
|
private XRGrabInteractable m_grab;
|
||||||
private Rigidbody m_rb;
|
|
||||||
private Vector3 m_returnPos;
|
|
||||||
private Quaternion m_returnRot;
|
|
||||||
private Coroutine m_resetCoroutine;
|
|
||||||
|
|
||||||
// ── 生命周期 ──────────────────────────────────────────────
|
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
m_grab = GetComponent<XRGrabInteractable>();
|
m_grab = GetComponent<XRGrabInteractable>();
|
||||||
m_rb = GetComponent<Rigidbody>();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Start()
|
|
||||||
{
|
|
||||||
// 记录初始世界位置/旋转作为归位目标
|
|
||||||
m_returnPos = transform.position;
|
|
||||||
m_returnRot = transform.rotation;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnEnable()
|
private void OnEnable()
|
||||||
{
|
{
|
||||||
m_grab.hoverEntered.AddListener(OnHoverEntered);
|
m_grab.hoverEntered.AddListener(OnHoverEntered);
|
||||||
m_grab.selectEntered.AddListener(OnSelectEntered);
|
m_grab.selectEntered.AddListener(OnSelectEntered);
|
||||||
m_grab.selectExited.AddListener(OnSelectExited);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDisable()
|
private void OnDisable()
|
||||||
{
|
{
|
||||||
m_grab.hoverEntered.RemoveListener(OnHoverEntered);
|
m_grab.hoverEntered.RemoveListener(OnHoverEntered);
|
||||||
m_grab.selectEntered.RemoveListener(OnSelectEntered);
|
m_grab.selectEntered.RemoveListener(OnSelectEntered);
|
||||||
m_grab.selectExited.RemoveListener(OnSelectExited);
|
|
||||||
StopReset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── XRI 事件 ──────────────────────────────────────────────
|
// 触摸(未抓取)→ 显示文字
|
||||||
|
|
||||||
/// <summary>手靠近/触摸(未抓取)→ 显示文字</summary>
|
|
||||||
private void OnHoverEntered(HoverEnterEventArgs args)
|
private void OnHoverEntered(HoverEnterEventArgs args)
|
||||||
{
|
{
|
||||||
if (m_grab.isSelected) return; // 已被抓取中,不重复触发
|
if (m_grab.isSelected) return;
|
||||||
|
if (lightEffect != null) lightEffect.Play();
|
||||||
ShowText();
|
ShowText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>抓取 → 隐藏文字,取消归位计时</summary>
|
// 抓取 → 隐藏文字
|
||||||
private void OnSelectEntered(SelectEnterEventArgs args)
|
private void OnSelectEntered(SelectEnterEventArgs args)
|
||||||
{
|
{
|
||||||
StopReset();
|
|
||||||
HideText();
|
HideText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>松手 → 延迟后溶解归位</summary>
|
|
||||||
private void OnSelectExited(SelectExitEventArgs args)
|
|
||||||
{
|
|
||||||
m_resetCoroutine = StartCoroutine(DelayThenReturn());
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── 归位协程 ──────────────────────────────────────────────
|
|
||||||
|
|
||||||
private IEnumerator DelayThenReturn()
|
|
||||||
{
|
|
||||||
yield return new WaitForSeconds(resetDelayTime);
|
|
||||||
|
|
||||||
// 归位期间禁止被重新抓取
|
|
||||||
m_grab.enabled = false;
|
|
||||||
|
|
||||||
// 1. 停止物理运动(避免归位时还在飞)
|
|
||||||
if (m_rb != null)
|
|
||||||
{
|
|
||||||
m_rb.velocity = Vector3.zero;
|
|
||||||
m_rb.angularVelocity = Vector3.zero;
|
|
||||||
m_rb.isKinematic = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. 溶解消失
|
|
||||||
if (effectCtr != null)
|
|
||||||
effectCtr.Hide();
|
|
||||||
|
|
||||||
yield return new WaitForSeconds(dissolveDuration);
|
|
||||||
|
|
||||||
// 3. 瞬间归位
|
|
||||||
transform.position = m_returnPos;
|
|
||||||
transform.rotation = m_returnRot;
|
|
||||||
|
|
||||||
// 4. 溶解出现
|
|
||||||
if (effectCtr != null)
|
|
||||||
effectCtr.Show();
|
|
||||||
|
|
||||||
yield return new WaitForSeconds(dissolveDuration);
|
|
||||||
|
|
||||||
// 5. 恢复交互
|
|
||||||
m_grab.enabled = true;
|
|
||||||
m_resetCoroutine = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StopReset()
|
|
||||||
{
|
|
||||||
if (m_resetCoroutine != null)
|
|
||||||
{
|
|
||||||
StopCoroutine(m_resetCoroutine);
|
|
||||||
m_resetCoroutine = null;
|
|
||||||
}
|
|
||||||
// 确保归位中断时交互器恢复可用
|
|
||||||
if (m_grab != null)
|
|
||||||
m_grab.enabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ── 文字动画 ──────────────────────────────────────────────
|
|
||||||
|
|
||||||
private void ShowText()
|
private void ShowText()
|
||||||
{
|
{
|
||||||
if (textAnimator != null)
|
if (textAnimator != null) textAnimator.Play(showAnimName);
|
||||||
textAnimator.Play(showAnimName);
|
if (touchAudio != null) touchAudio.Play();
|
||||||
if (touchAudio != null)
|
|
||||||
touchAudio.Play();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HideText()
|
private void HideText()
|
||||||
{
|
{
|
||||||
if (textAnimator != null)
|
if (textAnimator != null) textAnimator.Play(hideAnimName);
|
||||||
textAnimator.Play(hideAnimName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -685,7 +685,6 @@ GameObject:
|
|||||||
- component: {fileID: 8509482752666057137}
|
- component: {fileID: 8509482752666057137}
|
||||||
- component: {fileID: 8509482752666057138}
|
- component: {fileID: 8509482752666057138}
|
||||||
- component: {fileID: 627173790550441048}
|
- component: {fileID: 627173790550441048}
|
||||||
- component: {fileID: 5834868979677824056}
|
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: one
|
m_Name: one
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@@ -706,9 +705,8 @@ Transform:
|
|||||||
m_LocalScale: {x: 0.1456549, y: 0.22635013, z: 0.43100396}
|
m_LocalScale: {x: 0.1456549, y: 0.22635013, z: 0.43100396}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 4555733331637449516}
|
|
||||||
- {fileID: 1681761156176125940}
|
|
||||||
- {fileID: 7729090350392879857}
|
- {fileID: 7729090350392879857}
|
||||||
|
- {fileID: 4555733331637449516}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!33 &8509482752666057134
|
--- !u!33 &8509482752666057134
|
||||||
@@ -931,20 +929,6 @@ BoxCollider:
|
|||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_Size: {x: 1, y: 1, z: 1}
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
m_Center: {x: 0, y: 0, z: 0}
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
--- !u!114 &5834868979677824056
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 8509482752666057141}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: e3033df7ea093054e9c40a63f316e687, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
resetDelayTime: 2
|
|
||||||
downAudio: {fileID: 374519139915588587}
|
|
||||||
--- !u!1 &8596264351910424411
|
--- !u!1 &8596264351910424411
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -1079,13 +1063,28 @@ PrefabInstance:
|
|||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_Modification:
|
m_Modification:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
m_TransformParent: {fileID: 8509482752666057140}
|
m_TransformParent: {fileID: 7729090350392879857}
|
||||||
m_Modifications:
|
m_Modifications:
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_RootOrder
|
propertyPath: m_RootOrder
|
||||||
value: 1
|
value: 1
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_LocalScale.x
|
||||||
|
value: 0.1456549
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_LocalScale.y
|
||||||
|
value: 0.22635016
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_LocalScale.z
|
||||||
|
value: 0.43100402
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
@@ -1094,7 +1093,7 @@ PrefabInstance:
|
|||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: -0.0016000271
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
@@ -1109,17 +1108,17 @@ PrefabInstance:
|
|||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalRotation.x
|
propertyPath: m_LocalRotation.x
|
||||||
value: 0
|
value: -0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalRotation.y
|
propertyPath: m_LocalRotation.y
|
||||||
value: 0
|
value: -0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalRotation.z
|
propertyPath: m_LocalRotation.z
|
||||||
value: 0
|
value: -0
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
- target: {fileID: 314259139610439016, guid: 9a5f820ee9c46b64294ae756b459a681,
|
||||||
type: 3}
|
type: 3}
|
||||||
@@ -1280,6 +1279,10 @@ PrefabInstance:
|
|||||||
type: 3}
|
type: 3}
|
||||||
insertIndex: -1
|
insertIndex: -1
|
||||||
addedObject: {fileID: 8770507455043884786}
|
addedObject: {fileID: 8770507455043884786}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 4595984943260027875, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
||||||
|
type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 1681761156176125940}
|
||||||
m_AddedComponents:
|
m_AddedComponents:
|
||||||
- targetCorrespondingSourceObject: {fileID: 2291043302450215876, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
- targetCorrespondingSourceObject: {fileID: 2291043302450215876, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
||||||
type: 3}
|
type: 3}
|
||||||
@@ -1293,6 +1296,14 @@ PrefabInstance:
|
|||||||
type: 3}
|
type: 3}
|
||||||
insertIndex: -1
|
insertIndex: -1
|
||||||
addedObject: {fileID: 2578186882713754604}
|
addedObject: {fileID: 2578186882713754604}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 2291043302450215876, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
||||||
|
type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 5890687175110443383}
|
||||||
|
- targetCorrespondingSourceObject: {fileID: 2291043302450215876, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
||||||
|
type: 3}
|
||||||
|
insertIndex: -1
|
||||||
|
addedObject: {fileID: 858447791395049142}
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: d6447efa977a5af4581b3cd2b345dfb2, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: d6447efa977a5af4581b3cd2b345dfb2, type: 3}
|
||||||
--- !u!1 &5422442747364301526 stripped
|
--- !u!1 &5422442747364301526 stripped
|
||||||
GameObject:
|
GameObject:
|
||||||
@@ -1343,9 +1354,9 @@ Rigidbody:
|
|||||||
m_Bits: 0
|
m_Bits: 0
|
||||||
m_ImplicitCom: 1
|
m_ImplicitCom: 1
|
||||||
m_ImplicitTensor: 1
|
m_ImplicitTensor: 1
|
||||||
m_UseGravity: 0
|
m_UseGravity: 1
|
||||||
m_IsKinematic: 0
|
m_IsKinematic: 0
|
||||||
m_Interpolate: 0
|
m_Interpolate: 1
|
||||||
m_Constraints: 0
|
m_Constraints: 0
|
||||||
m_CollisionDetection: 0
|
m_CollisionDetection: 0
|
||||||
--- !u!114 &2578186882713754604
|
--- !u!114 &2578186882713754604
|
||||||
@@ -1368,6 +1379,149 @@ MonoBehaviour:
|
|||||||
cathcAudio: {fileID: 5272202333828909323}
|
cathcAudio: {fileID: 5272202333828909323}
|
||||||
downAudio: {fileID: 374519139915588587}
|
downAudio: {fileID: 374519139915588587}
|
||||||
effectHideAndShowCtr: {fileID: 8608594464241683254}
|
effectHideAndShowCtr: {fileID: 8608594464241683254}
|
||||||
|
--- !u!114 &5890687175110443383
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5422442747364301526}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 0ad34abafad169848a38072baa96cdb2, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_InteractionManager: {fileID: 0}
|
||||||
|
m_Colliders: []
|
||||||
|
m_InteractionLayers:
|
||||||
|
m_Bits: 1
|
||||||
|
m_DistanceCalculationMode: 1
|
||||||
|
m_SelectMode: 0
|
||||||
|
m_FocusMode: 1
|
||||||
|
m_CustomReticle: {fileID: 0}
|
||||||
|
m_AllowGazeInteraction: 0
|
||||||
|
m_AllowGazeSelect: 0
|
||||||
|
m_OverrideGazeTimeToSelect: 0
|
||||||
|
m_GazeTimeToSelect: 0.5
|
||||||
|
m_OverrideTimeToAutoDeselectGaze: 0
|
||||||
|
m_TimeToAutoDeselectGaze: 3
|
||||||
|
m_AllowGazeAssistance: 0
|
||||||
|
m_FirstHoverEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_LastHoverExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_HoverEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_HoverExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_FirstSelectEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_LastSelectExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_SelectEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_SelectExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_FirstFocusEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_LastFocusExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_FocusEntered:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_FocusExited:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Activated:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Deactivated:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_StartingHoverFilters: []
|
||||||
|
m_StartingSelectFilters: []
|
||||||
|
m_StartingInteractionStrengthFilters: []
|
||||||
|
m_AttachTransform: {fileID: 4555733331637449516}
|
||||||
|
m_SecondaryAttachTransform: {fileID: 0}
|
||||||
|
m_UseDynamicAttach: 1
|
||||||
|
m_MatchAttachPosition: 1
|
||||||
|
m_MatchAttachRotation: 1
|
||||||
|
m_SnapToColliderVolume: 1
|
||||||
|
m_ReinitializeDynamicAttachEverySingleGrab: 1
|
||||||
|
m_AttachEaseInTime: 0.15
|
||||||
|
m_MovementType: 2
|
||||||
|
m_VelocityDamping: 1
|
||||||
|
m_VelocityScale: 1
|
||||||
|
m_AngularVelocityDamping: 1
|
||||||
|
m_AngularVelocityScale: 1
|
||||||
|
m_TrackPosition: 1
|
||||||
|
m_SmoothPosition: 1
|
||||||
|
m_SmoothPositionAmount: 5
|
||||||
|
m_TightenPosition: 0.1
|
||||||
|
m_TrackRotation: 1
|
||||||
|
m_SmoothRotation: 1
|
||||||
|
m_SmoothRotationAmount: 5
|
||||||
|
m_TightenRotation: 0.1
|
||||||
|
m_TrackScale: 1
|
||||||
|
m_SmoothScale: 1
|
||||||
|
m_SmoothScaleAmount: 5
|
||||||
|
m_TightenScale: 0.1
|
||||||
|
m_ThrowOnDetach: 1
|
||||||
|
m_ThrowSmoothingDuration: 0.25
|
||||||
|
m_ThrowSmoothingCurve:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Curve:
|
||||||
|
- serializedVersion: 3
|
||||||
|
time: 1
|
||||||
|
value: 1
|
||||||
|
inSlope: 0
|
||||||
|
outSlope: 0
|
||||||
|
tangentMode: 0
|
||||||
|
weightedMode: 0
|
||||||
|
inWeight: 0
|
||||||
|
outWeight: 0
|
||||||
|
m_PreInfinity: 2
|
||||||
|
m_PostInfinity: 2
|
||||||
|
m_RotationOrder: 4
|
||||||
|
m_ThrowVelocityScale: 1.5
|
||||||
|
m_ThrowAngularVelocityScale: 1
|
||||||
|
m_ForceGravityOnDetach: 0
|
||||||
|
m_RetainTransformParent: 1
|
||||||
|
m_StartingSingleGrabTransformers: []
|
||||||
|
m_StartingMultipleGrabTransformers: []
|
||||||
|
m_AddDefaultGrabTransformers: 1
|
||||||
|
m_FarAttachMode: 0
|
||||||
|
--- !u!65 &858447791395049142
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5422442747364301526}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
--- !u!4 &7729090350392879857 stripped
|
--- !u!4 &7729090350392879857 stripped
|
||||||
Transform:
|
Transform:
|
||||||
m_CorrespondingSourceObject: {fileID: 4595984943260027875, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
m_CorrespondingSourceObject: {fileID: 4595984943260027875, guid: d6447efa977a5af4581b3cd2b345dfb2,
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
using UnityEngine.XR.Interaction.Toolkit;
|
|
||||||
using System.Collections;
|
|
||||||
|
|
||||||
namespace LevelUp.GrabInteractions
|
|
||||||
{
|
|
||||||
public class ResetObjectSmooth : ResetObject
|
|
||||||
{
|
|
||||||
[Header("平滑重置设置")]
|
|
||||||
[SerializeField] private float resetSpeed = 5f;
|
|
||||||
[SerializeField] private float stopDistance = 0.01f;
|
|
||||||
|
|
||||||
private Quaternion returnToRotation;
|
|
||||||
private Rigidbody rb;
|
|
||||||
private Coroutine smoothMoveCoroutine;
|
|
||||||
private bool initialIsKinematic;
|
|
||||||
// 新增:用于备份物理插值设置
|
|
||||||
private RigidbodyInterpolation initialInterpolation;
|
|
||||||
|
|
||||||
protected new void Awake()
|
|
||||||
{
|
|
||||||
base.Awake();
|
|
||||||
rb = GetComponent<Rigidbody>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
base.Start();
|
|
||||||
returnToRotation = transform.rotation;
|
|
||||||
|
|
||||||
if (rb != null)
|
|
||||||
{
|
|
||||||
initialIsKinematic = rb.isKinematic;
|
|
||||||
initialInterpolation = rb.interpolation; // 记录初始插值状态
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnDestroy() => StopAllCoroutinesAndCancelInvoke();
|
|
||||||
|
|
||||||
private void StopAllCoroutinesAndCancelInvoke()
|
|
||||||
{
|
|
||||||
CancelInvoke(nameof(ReturnHome));
|
|
||||||
if (smoothMoveCoroutine != null)
|
|
||||||
{
|
|
||||||
StopCoroutine(smoothMoveCoroutine);
|
|
||||||
smoothMoveCoroutine = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnSelect(SelectEnterEventArgs arg0) => StopAllCoroutinesAndCancelInvoke();
|
|
||||||
|
|
||||||
protected override void OnSelectExit(SelectExitEventArgs arg0)
|
|
||||||
{
|
|
||||||
StopAllCoroutinesAndCancelInvoke();
|
|
||||||
if (rb != null)
|
|
||||||
{
|
|
||||||
rb.isKinematic = false;
|
|
||||||
rb.WakeUp();
|
|
||||||
}
|
|
||||||
base.OnSelectExit(arg0);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void ReturnHome()
|
|
||||||
{
|
|
||||||
if (shouldReturnHome)
|
|
||||||
smoothMoveCoroutine = StartCoroutine(SmoothMoveToHome());
|
|
||||||
}
|
|
||||||
|
|
||||||
private IEnumerator SmoothMoveToHome()
|
|
||||||
{
|
|
||||||
if (rb != null)
|
|
||||||
{
|
|
||||||
// 【关键优化 1】禁用物理插值,防止物理引擎尝试预测物体的 Transform 更新
|
|
||||||
rb.interpolation = RigidbodyInterpolation.None;
|
|
||||||
rb.isKinematic = true;
|
|
||||||
rb.velocity = Vector3.zero;
|
|
||||||
rb.angularVelocity = Vector3.zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
float stopDistanceSqr = stopDistance * stopDistance;
|
|
||||||
|
|
||||||
while ((transform.position - returnToPosition).sqrMagnitude > stopDistanceSqr)
|
|
||||||
{
|
|
||||||
float lerpFactor = 1f - Mathf.Exp(-resetSpeed * Time.deltaTime);
|
|
||||||
|
|
||||||
transform.position = Vector3.Lerp(transform.position, returnToPosition, lerpFactor);
|
|
||||||
transform.rotation = Quaternion.Slerp(transform.rotation, returnToRotation, lerpFactor);
|
|
||||||
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
transform.position = returnToPosition;
|
|
||||||
transform.rotation = returnToRotation;
|
|
||||||
|
|
||||||
// 【关键优化 2】在恢复物理属性前,等待一个物理帧,确保位置同步完成
|
|
||||||
yield return new WaitForFixedUpdate();
|
|
||||||
|
|
||||||
if (rb != null)
|
|
||||||
{
|
|
||||||
rb.isKinematic = initialIsKinematic;
|
|
||||||
// 【关键优化 3】恢复初始插值设置
|
|
||||||
rb.interpolation = initialInterpolation;
|
|
||||||
rb.velocity = Vector3.zero;
|
|
||||||
rb.angularVelocity = Vector3.zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
smoothMoveCoroutine = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
141
Assets/YOMOV Access/Scripts/ReturnPosition.cs
Normal file
141
Assets/YOMOV Access/Scripts/ReturnPosition.cs
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
using System.Collections;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.XR.Interaction.Toolkit;
|
||||||
|
using UnityEngine.XR.Interaction.Toolkit.Interactables;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 抓取后松手归回原位(替代 ResetObjectSmooth,避免模型拉伸)
|
||||||
|
/// 同一 GameObject 需要挂 XRGrabInteractable。
|
||||||
|
/// 可选:挂 EffectHideAndShowCtr 实现溶解消失/出现效果。
|
||||||
|
/// </summary>
|
||||||
|
[RequireComponent(typeof(XRGrabInteractable))]
|
||||||
|
public class ReturnPosition : MonoBehaviour
|
||||||
|
{
|
||||||
|
[Header("归位设置")]
|
||||||
|
[SerializeField] private float resetDelayTime = 2f; // 松手后延迟归位秒数
|
||||||
|
[SerializeField] private EffectHideAndShowCtr effectCtr; // 溶解效果(可为空)
|
||||||
|
[SerializeField] private float dissolveDuration = 1f; // 溶解动画时长
|
||||||
|
|
||||||
|
[Header("音效")]
|
||||||
|
public AudioSource grabAudio;
|
||||||
|
public AudioSource releaseAudio;
|
||||||
|
|
||||||
|
// 归位目标(启动时记录)
|
||||||
|
private Vector3 m_returnPos;
|
||||||
|
private Quaternion m_returnRot;
|
||||||
|
|
||||||
|
private XRGrabInteractable m_grab;
|
||||||
|
private Rigidbody m_rb;
|
||||||
|
private Coroutine m_resetCoroutine;
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
m_grab = GetComponent<XRGrabInteractable>();
|
||||||
|
m_rb = GetComponent<Rigidbody>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
// 记录初始世界坐标作为归位目标
|
||||||
|
m_returnPos = transform.position;
|
||||||
|
m_returnRot = transform.rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnEnable()
|
||||||
|
{
|
||||||
|
m_grab.selectEntered.AddListener(OnSelectEntered);
|
||||||
|
m_grab.selectExited.AddListener(OnSelectExited);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDisable()
|
||||||
|
{
|
||||||
|
m_grab.selectEntered.RemoveListener(OnSelectEntered);
|
||||||
|
m_grab.selectExited.RemoveListener(OnSelectExited);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── XRI 事件 ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
private void OnSelectEntered(SelectEnterEventArgs args)
|
||||||
|
{
|
||||||
|
// 抓取时取消正在进行的归位
|
||||||
|
StopReset();
|
||||||
|
if (grabAudio != null) grabAudio.Play();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSelectExited(SelectExitEventArgs args)
|
||||||
|
{
|
||||||
|
if (releaseAudio != null) releaseAudio.Play();
|
||||||
|
m_resetCoroutine = StartCoroutine(DelayThenReturn());
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 归位协程 ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
private IEnumerator DelayThenReturn()
|
||||||
|
{
|
||||||
|
yield return new WaitForSeconds(resetDelayTime);
|
||||||
|
|
||||||
|
// 归位期间禁止被重新抓取
|
||||||
|
m_grab.enabled = false;
|
||||||
|
|
||||||
|
// 停止物理运动
|
||||||
|
StopPhysics();
|
||||||
|
|
||||||
|
if (effectCtr != null)
|
||||||
|
{
|
||||||
|
// 有溶解效果:消失 → 归位 → 出现
|
||||||
|
effectCtr.Hide();
|
||||||
|
yield return new WaitForSeconds(dissolveDuration);
|
||||||
|
|
||||||
|
ReturnPositionAndRotation();
|
||||||
|
|
||||||
|
effectCtr.Show();
|
||||||
|
yield return new WaitForSeconds(dissolveDuration);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 无溶解效果:直接瞬移归位
|
||||||
|
ReturnPositionAndRotation();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_grab.enabled = true;
|
||||||
|
m_resetCoroutine = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 公共方法 ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
/// <summary>立即归回初始位置和旋转</summary>
|
||||||
|
public void ReturnPositionAndRotation()
|
||||||
|
{
|
||||||
|
transform.position = m_returnPos;
|
||||||
|
transform.rotation = m_returnRot;
|
||||||
|
StopPhysics();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>更新归位目标为当前位置(需要重新记录原点时调用)</summary>
|
||||||
|
public void RecordCurrentAsHome()
|
||||||
|
{
|
||||||
|
m_returnPos = transform.position;
|
||||||
|
m_returnRot = transform.rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── 内部工具 ──────────────────────────────────────────────
|
||||||
|
|
||||||
|
private void StopPhysics()
|
||||||
|
{
|
||||||
|
if (m_rb == null) return;
|
||||||
|
m_rb.velocity = Vector3.zero;
|
||||||
|
m_rb.angularVelocity = Vector3.zero;
|
||||||
|
m_rb.isKinematic = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StopReset()
|
||||||
|
{
|
||||||
|
if (m_resetCoroutine != null)
|
||||||
|
{
|
||||||
|
StopCoroutine(m_resetCoroutine);
|
||||||
|
m_resetCoroutine = null;
|
||||||
|
}
|
||||||
|
if (m_grab != null)
|
||||||
|
m_grab.enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 7877962557443e34f8190e3278bd4a5d
|
guid: 7cf98a8d188845e4b9cca594d4776f95
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
@@ -720,7 +720,7 @@ MonoBehaviour:
|
|||||||
isRemovedFromBuildSettings: 0
|
isRemovedFromBuildSettings: 0
|
||||||
- sceneGUID: ee715637c0f182e4e999c9738f391545
|
- sceneGUID: ee715637c0f182e4e999c9738f391545
|
||||||
scenePath: Assets/Scenes/Scene_01.unity
|
scenePath: Assets/Scenes/Scene_01.unity
|
||||||
lastFileWriteTime: 134172423089424073
|
lastFileWriteTime: 134172583109443931
|
||||||
acts:
|
acts:
|
||||||
- id: 4dfe3159-62ab-4bc3-ab9e-cfd44d467f3b
|
- id: 4dfe3159-62ab-4bc3-ab9e-cfd44d467f3b
|
||||||
name: Scene_01 Act01
|
name: Scene_01 Act01
|
||||||
|
|||||||
Reference in New Issue
Block a user