using DG.Tweening; using Unity.Netcode; using UnityEngine; public sealed class NetworkTestCubeItem : NetworkHandItemInteractable { [Header("Use feedback")] [SerializeField] private Transform visual; [SerializeField, Min(0.01f)] private float punchDuration = 0.25f; [SerializeField, Min(0f)] private float punchStrength = 0.2f; private readonly NetworkVariable useSequence = new( 0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server); private Vector3 restingVisualScale; private Tween useTween; protected override void Awake() { base.Awake(); if (visual == null) { Renderer itemRenderer = GetComponentInChildren(true); visual = itemRenderer != null ? itemRenderer.transform : transform; } restingVisualScale = visual.localScale; } public override void OnNetworkSpawn() { base.OnNetworkSpawn(); useSequence.OnValueChanged += HandleUseSequenceChanged; } public override void OnNetworkDespawn() { useSequence.OnValueChanged -= HandleUseSequenceChanged; useTween?.Kill(); base.OnNetworkDespawn(); } protected override void UseOnServer(NetworkObject playerObject) { useSequence.Value++; } [ContextMenu("Preview/Use")] private void PreviewUse() { if (Application.isPlaying) PlayUseFeedback(); else if (visual != null) visual.localScale = restingVisualScale * (1f + punchStrength); } [ContextMenu("Preview/Reset")] private void PreviewReset() { useTween?.Kill(); if (visual != null) visual.localScale = restingVisualScale; } private void HandleUseSequenceChanged(uint _, uint currentValue) => PlayUseFeedback(); private void PlayUseFeedback() { if (visual == null) return; useTween?.Kill(); visual.localScale = restingVisualScale; useTween = visual .DOPunchScale(Vector3.one * punchStrength, punchDuration, 6, 0.5f) .SetLink(gameObject); } }